一言で言えば、ZooKeeperは分散アプリケーションの構築を支援します。
使い方
ZooKeeperは、結果整合性を備えた複製同期サービスとして説明できます。永続化されたデータは複数のノード(このノードのセットは「アンサンブル」と呼ばれます)に分散され、1つのクライアントがそれらのいずれかに(つまり、特定の「サーバー」)接続して、1つのノードに障害が発生すると移行します。ノードの厳密な過半数が機能している限り、ZooKeeperノードのアンサンブルは生きています。特に、マスターノードはアンサンブル内のコンセンサスによって動的に選択されます。マスターノードに障害が発生すると、マスターの役割が別のノードに移行します。
書き込みの処理方法
マスターは書き込みの権限です。このようにして、書き込みが順序どおりに保持されることが保証されます。つまり、書き込みは線形です。クライアントがアンサンブルに書き込むたびに、大多数のノードが情報を保持します。これらのノードには、クライアントのサーバーと、明らかにマスターが含まれます。これは、書き込みごとにサーバーがマスターで最新になることを意味します。ただし、同時に書き込みを行うことはできません。
線形書き込みの保証は、ZooKeeperが書き込みが主なワークロードに対して十分に機能しないという事実の理由です。特に、メディアなどの大きなデータの交換には使用しないでください。通信に共有データが含まれている限り、ZooKeeperが役立ちます。データを同時に書き込むことができると、ZooKeeperは実際には邪魔になります。これは、ライターの観点から厳密に必要でなくても、操作の厳密な順序付けを課すためです。その理想的な用途は、クライアント間でメッセージが交換される調整のためです。
読み取りの処理方法
これがZooKeeperが優れているところです。読み取りは、クライアントが接続する特定のサーバーによって処理されるため、同時読み取りです。ただし、これは結果整合性の理由でもあります。マスターが対応するサーバーを制限された未定義の遅延で更新するため、クライアントの「ビュー」が古くなる可能性があります。
詳細に
ZooKeeperの複製データベースはznodeのツリーで構成されます。これは、ファイルシステムノードを大まかに表すエンティティです(それらをディレクトリと考えてください)。各znodeは、データを格納するバイト配列によって拡張できます。また、各znodeにはその下に他のznodeがあり、実際には内部ディレクトリシステムを形成しています。
シーケンシャルznode
興味深いことに、znodeの名前は順次にすることができます。つまり、znodeの作成時にクライアントが提供する名前はプレフィックスにすぎません。完全な名前は、アンサンブルによって選択された連続番号によっても与えられます。これは、たとえば同期の目的で役立ちます。複数のクライアントがリソースのロックを取得したい場合、それぞれがロケーションに順次znodeを同時に作成できます。最も小さい番号を取得する人には、ロックを付与する権利があります。
エフェメラルzノード
また、znodeは一時的なものである可能性があります。つまり、znode は、それを作成したクライアントが切断するとすぐに破棄されます。これは主に、クライアントがいつ失敗するかを知るために役立ちます。これは、クライアント自体が新しいクライアントが行うべき責任を持っている場合に関連する場合があります。ロックの例をとると、ロックを保持しているクライアントが切断されるとすぐに、他のクライアントは、ロックを取得する資格があるかどうかを確認できます。
時計
クライアントの切断に関連する例は、znodeの状態を定期的にポーリングする必要がある場合に問題になる可能性があります。幸い、ZooKeeperはznodeにウォッチを設定できるイベントシステムを提供しています。これらのウォッチは、znodeが特に変更または削除された場合、またはznodeの下に新しい子が作成された場合に、イベントをトリガーするように設定できます。これは、znodeのシーケンシャルおよびエフェメラルオプションと組み合わせると明らかに便利です。
どこでどのように使用するか
Zookeeperの標準的な使用例は分散メモリ計算です。この場合、一部のデータはクライアントノード間で共有され、同期を考慮するために非常に注意深くアクセス/更新する必要があります。
ZooKeeperは、同期プリミティブを構築するためのライブラリーを提供し、分散サーバーを実行する機能は、集中型(ブローカーのような)メッセージリポジトリを使用するときに発生する単一障害点の問題を回避します。
ZooKeeperは機能が軽いため、リーダーの選出、ロック、バリアなどのメカニズムはまだ存在していませんが、ZooKeeperプリミティブの上に記述できます。C / Java APIが目的に合わない場合は、ケージや特にキュレーターなど、ZooKeeperで構築されたライブラリに依存する必要があります。
続きを読む場所
公式ドキュメントは別として、かなり良いです。Hadoopの第14章を読むことをお勧めします。ZooKeeperの基本的な機能を説明する35ページ以下のDefinitive Guideと、構成サービスの例が続きます。