zookeeper に基づくアクティブとバックアップの切り替え方法
zookeeper の ZOO_EPHEMERAL ノード (ZOO_EPHEMERAL がニーズを満たせない場合は、ZOO_SEQUENCE と組み合わせて使用することを検討できます)。この機能を使用すると、セッションが閉じられるか期限切れになると自動的に削除されます。 、複数のノード間で 2 つまたはアクティブ/スタンバイの切り替えを実現できます。
実装方法:
1) プロセスの開始時に、zookeeper_init() を呼び出して初期化します:
bool、zookeeper_init を再度呼び出す必要があります、
// この時点で渡すことができる _clientid は、前のメソッドで生成された _clientid です。 Zookeeper_init()
// Zookeeper_init() は非同期呼び出しであり、非 NULL を返すことはセッションを示しているわけではないことに注意してください 確立は成功しました、
// zk_watcher のタイプが ZOO_SESSION_EVENT で、状態が ZOO_CONNECTED_STATE の場合のみ,
// これは本当にセッションが正常に確立されたことを意味するのでしょうか。
_zhandle =zookeeper_init(zk_hosts, zk_watcher, 5000, _clientid, this, 0);
if (NULL == _zhandle)
{
MYLOG_ERROR("init Zookeeper failed: %sn", zerror(errno));
return false;
}
MYLOG_INFO("init Zookeeper(%s) successn", zk_hosts);
return true;
}
2) 作業に入る前に、まずマスターに切り替えてみて、成功した後にのみ作業に入るようにしてください。マスターへの切り替え
bool ポーリングを使用しない場合は、_zk_path
を監視できます。 mooon::sys::CUtils::millisleep(1000);
// マスターでない場合は、マスターになることを試みます。変換が失敗した場合は、次の試行に進みます
if (!is_master() && !change_to_master())
continue;
do_work();
}
}
bool X::is_master() const
{
return _is_master;
}
bool 現在のマスターが誰であるかを決定するために使用されます
// _zk_path 値の例: /master/test、/master が最初に存在する必要があることに注意してください
int errcode = Zoo_create(_zhandle, _zk_path.c_str(), _myip.c_str(), _myip.size ()+1, &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, NULL, 0);
// (-4) 接続損失 (zookeeper_init() に指定された無効なホストなど) (有効なホストではありません)
if (errcode != ZOK)
{
_is_master = false;
// スタンバイ状態時のログ出力を削減します
if (0 == log_counter++ % 600)
{
MYLOG_DEBUG("becomeマスター[%s] が失敗しました: (%d) %sn", _zk_path.c_str(), errcode, zerror(errcode));
}
return false;
}
else
{
_is_master = true;
log_counter = 0;
MYLOG_INFO("becase master[% s]n", _zk_path.c_str());
// 元のマスターが進行中のプロセスを完了できるように、しばらくスリープします
mooon::sys::CUtils ::millisleep(2000);
return true;
}
}
3) zk_watcher は、Zookeeper セッションが正常に確立されたとき、または期限切れになったときにトリガーされます。これは、タイプと状態によって区別できます
void zk_watcher(zhandle_t *zh, int type, int state, const char *path, void *context)
{
state, context, path);
//zookeeper_init が成功すると、type は ZOO_SESSION_EVENT、state は ZOO_CONNECTED_STATE になります
if ((ZOO_SESSION_EVENT == type ) && (ZOO_CONNECTED_STATE == 状態))
{
x->on_zookeeper_connected(path) ;
}
else if ((ZOO_SESSION_EVENT == タイプ) && (ZOO_EXPIRED_SESSION_STATE == 状態))
{
// Zookeeper_init() が必要再度呼び出される場合は、現在のプロセスを終了して再起動する方が簡単です
x->on_zookeeper_expired();
}
}
添付ファイル: Zookeeper ログ
デフォルトでは、Zookeeper ログは stderr に出力されますが、次を使用することもできますまた、zoo_set_debug_level() を使用して、zookeeper のログ レベルを制御することもできます。
http://www.bkjia.com/PHPjc/1115820.html
www.bkjia.com
本当
http://www.bkjia.com/PHPjc/1115820.html
技術記事
セッションが終了したり期限切れになったときの、Zookeeper ZOO_EPHEMERAL ノードに基づくマスター/バックアップ切り替え方法 (ZOO_EPHEMERAL がニーズを満たせない場合は、ZOO_SEQUENCE と組み合わせて使用することを検討できます)。