ホームページ  >  記事  >  バックエンド開発  >  Zookeeper_PHP チュートリアルに基づいたプライマリとセカンダリの切り替え方法

Zookeeper_PHP チュートリアルに基づいたプライマリとセカンダリの切り替え方法

WBOY
WBOYオリジナル
2016-07-12 08:55:431110ブラウズ

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 と組み合わせて使用​​することを検討できます)。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。