ZooKeeperによる分散システム管理 読了
- 作者: Flavio Junqueira,Benjamin Reed,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/08
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- 分散環境用情報統一管理機構
- データの書き込み順序保証
- サーバのスケールアウトが可能
- データの監視とデータ変更時の通知機能
- 障害時のセッション自動回復機能
アンサンブル
- アンサンブルはZooKeeperサーバの集合
- クオラム(過半数)によってリーダが選出される
リーダ選出
- リーダ選出通知<sid, zxid>をアンサンブルに送る
- sid=サーバID
- zxid=トランザクションID
- zxidが大きい方(あるいはsidが大きい方)がリーダとなり、その他はフォロワーとなる
データ書き込み時の動作
- クライアントからの書き込み要求はフォロワーからリーダへ転送される
- リーダは書き込み要求を、データツリーに対するトランザクションに翻訳し、それをプロポーザル通知としてフォロワーへブロードキャストする
- フォロワーは、プロボーザル通知が自分の従うリーダからのものかを確認し、トランザクションをトランザクションログ(RDMSのコミットログと同等)に書き込み、アクセプト通知をリーダーへ返す
- クオラムを達成する数のフォロワーからアクセプト通知を受け取ると、リーダはコミット(先ほど送ったトランザクションを実行するように、という通知)をフォロワーに送り、インフォーム(トランザクションを含めているからこれを実行するように、という通知)をオブザーバーに送る
- オブザーバーは読み取りのためのスケールアウト戦略であり、アクセプトの投票には参加せず、コミットされたトランザクションを実行するだけ
- これをZab(Zookeeper Atomic Broadcast)と呼ぶ
データ読み取り時の動作
- クライアントからの読み取り要求を受け取ったフォロワー・オブザーバーは、各自のデータツリーから要求されたデータを返す
znode
- ディレクトリであり同時にファイルで、親ノード・子ノードの関係がある
- データツリーを構成する要素
- 名前、データ、そしてバージョン番号から構成される
- 格納できるデータのサイズは1MBに制限されている(データだけでなく、親ノードが持つ子ノードの数も制限される)
- なお、znodeが再作成されるとバージョン番号はリセットされる(1になる)
Ephemeral znode(短命znode)
- クライアントとサーバ(アンサンブル)のセッションが切れると削除されるznode
- CreateMode.EPHEMERAL(永続znodeはCreateMode.PERSISTENTを指定)
API
- 同期型と非同期型がある
- 監視を設定でき、将来において、監視したznodeに変更があると一度だけ通知がとぶ
- 監視を継続したい場合は、通知を受けたあとに再度監視をコールする必要がある
- create/delete/exists/getData/setData/getChildren etc. ZooKeeper (ZooKeeper 3.4.5 API)
同期バージョン getData
byte data[] = getData(“/master”,false,stat)
- dataにznodeから取得したデータが設定される
- znode “/master”のデータを取得する
- falseは監視を設定するかどうか
- statはznodeのメタデータを設定する箱
- NoNodeException, ConnectionLossExceptionをtry-catchすること
非同期バージョン getData
getData(“/master”,false,callback,null)
- callbackはprocessResult関数を実装したDataCallback型のオブジェクト
- nullはprocessResultに渡すべきデータが無いということ
- processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
- rcは結果を示すコード
- pathはznodeのパス
- ctxはこの場合nullになる
- dataにznodeから取得したデータが設定される
- statはznodeのメタデータを設定する箱
クライアントからの接続要求
- サーバ(アンサンブル)をZookeeper(“1.1.1.1:2181,1.1.1.2:2181,1.1.1.3:2181”,15000,watcher) のように文字列で指定するとそのうちの一つをランダムに選択してセッションを確立する
- 15000はセッショタイムアウト(ミリ秒)
- watcherは、サーバ(アンサンブル)とのセッションを監視し、セッションに関するイベントを処理するためのオブジェクト
- Watcherクラスを実装し、processコールバックメソッドを実装したクラスのオブジェクト
- あるサーバとのセッションが切断された場合もアンサンブルの他のサーバとのセッションが自動的に復旧される
スナップショット
- スナップショットは、各サーバが定期的に保存するデータツリーのコピー
- 必ずしもアンサンブルで統一されたデータツリーではないため、ファジースナップショットと呼ばれる
- つまり、スナップショットから完全にデータツリーを復旧できるとは限らない(トランザクションログが必要になる)
- トランザクションログのようにパディングは行われない
エポック
- 1つのエポックは、あるサーバがリーダ権限を持っている時期を示す
- 新しいリーダが選出されるたびに増加する
- エポックはzxidの上位に含まれるため、リーダ選出において、最新のエポックの最新のトラザクションを知るサーバがリーダになる
Multiop
Curator
ベストプラクティス
- ZooKeeperの外側のチャネルでクライアント同士がやり取りしない
- ZooKeeperの書き込み・読み取りの順序は保証されるので、ZooKeeperのznodeを通じてやりとりするべき
- マスタ・ワーカモデルをznodeで実現する