zookeeper とは


年末年始、まとまった時間が取れるので、zookeeper お勉強を進めようと思う
勉強したことをここにメモしておく
間違っていたら指摘してほしい

まずはここから
http://zookeeper.apache.org/doc/trunk/zookeeperOver.html

Zookeeper とは

分散アプリケーション向けの高パフォーマンスな協調サービスである.
なんのこっちゃ.
もう少し噛み砕くと,,,

Zookeeper は分散アプリケーションを構築する上で必要となる,
同期, 設定管理, グルーピング, 名前管理, などの機能を提供するサービスである.

分散アプリケーションを作成する上では, 上記で述べた, 同期, 設定管理, ... 等の機能は必須となる.
上記で述べた機能を実装することは難しい...というか真面目に作ろうとすれば死ぬほど面倒くさい.
Zookeeper は, これらの面倒くさい機能を肩代わりしてくれるんですな.

動作環境

Java で作成されているので, jvm 上で動作可能である.

API

Java, C 言語

License

Apache License 2.0

Zookeeper が目指すゴール

シンプルさ

Zookeeper を使えば, 複数のサーバに分散しているプロセスは、(通常のファイルシステムを扱うように)階層的な名前空間を共有しながら、分散処理を進めることができる.

しかしながら, Zookeeper はストレージではなくメモリ上にデータを保存する.
これにより, 高スループット, 低レイテンシーが実現される.

また, 高可用性, アクセス制限も備えている.
それらは大規模な分散システムで動作することを前提として構築されており, これにより単一障害点になることを避けられる.

レプリケーション

Zookeeper 自身はホストの集合上でレプリケートされる. Zookeeper がインストールされたサーバは, 他のすべてのサーバの状態を知っていなければならない.

クライアントは 1 つの Zookeeper サーバーへ接続する. リクエスト送信, レスポンス受信の際, クライアントは TCP コネクションを張る. コネクションが切断されたとしても, 別のサーバへの接続を試みる.

データモデル

Zookeeper で提供される名前空間は, 通常のファイルシステムと類似している. 名前はスラッシュ(/) で区切られている. ノードとノードが繋がれた木構造である. 通常のファイルシステムのファイルパスのようである. このファイルパスを用いて, データを識別する.

ノードの分類

通常のファイルシステムと異なる点は, Zookeeper の名前空間内の各ノードへ数バイト~数キロバイトの小規模なデータを持つ, znode と呼ばれる子ノードを持てる点である. これらの小規模なデータは, 分散アプリケーションにおける協調動作を進めるために配置されると予想される(つまりは, 設定ファイルとか何かの定義ファイルとかテンプレートファイルとか)ため, 数バイト~数キロバイトということが想定されているんでしょう....

znode は stat structure を保持している. stat structure にはバージョン番号が含まれる. これらのバージョン番号は以下が更新されると更新される.
* ノードのデータが変化した
* ノードの ACL が変化した
* ノードのタイムスタンプが変化した

znode で保持されているデータはアトミックに読み書きがされる. 読み込みの際には znode に保持されているすべてのデータを取得し, 書き込みの際にはすべてのデータを置き換える. 各ノード毎にアクセス制限を設けることができる.

まとめ

要は, Zookeeper は以下の機構を提供してくれる, 協調アプリケーション向けに開発された, 分散型のメタストアである.(←これは完全に個人的な解釈であるため, 間違っているかもしれないが, 自分の中ではそんな感じのイメージである.)

  • Sequential Consistency - クライアントからの更新を順番に1つずつ適用する.
  • Atomicity - 成功 or 失敗. 中途半端な結果になることを避けてくれる.
  • Single System Image - 高可用性を備えた分散型のメタストアなので複数のサーバを用いるが, 利用者から見ると透過的な1つのファイルシステムのように扱うことができる.
  • Timelines - クライアントから読めるデータは常に最新のものである.