ZooKeeper入門ガイド
入門: ZooKeeperを使った分散アプリケーションの調整
このドキュメントには、ZooKeeperをすぐに使い始めるための情報が含まれています。主にZooKeeperを試してみたい開発者向けで、単一のZooKeeperサーバーの簡単なインストール手順、実行を確認するためのいくつかのコマンド、および簡単なプログラミング例が含まれています。最後に、便宜上、複製されたデプロイの実行やトランザクションログの最適化など、より複雑なインストールに関するいくつかのセクションがあります。ただし、商用デプロイに関する完全な手順については、ZooKeeper管理者ガイドを参照してください。
前提条件
管理者ガイドのシステム要件を参照してください。
ダウンロード
ZooKeeperディストリビューションを入手するには、Apacheダウンロードミラーのいずれかから最新の安定版リリースをダウンロードしてください。
スタンドアロン運用
ZooKeeperサーバーをスタンドアロンモードでセットアップするのは簡単です。サーバーは単一のJARファイルに含まれているため、インストールは構成を作成することで行われます。
安定版のZooKeeperリリースをダウンロードしたら、解凍してルートにcdします。
ZooKeeperを起動するには、構成ファイルが必要です。サンプルを以下に示します。conf/zoo.cfgに作成してください
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
このファイルは任意に名前を付けることができますが、この説明ではconf/zoo.cfgと呼びます。dataDirの値を、既存の(最初は空の)ディレクトリを指定するように変更します。各フィールドの意味は次のとおりです。
-
tickTime : ZooKeeperが使用するミリ秒単位の基本時間単位です。これはハートビートに使用され、最小セッションタイムアウトはtickTimeの2倍になります。
-
dataDir : インメモリデータベースのスナップショットを保存する場所であり、特に指定しない限り、データベースへの更新のトランザクションログも保存します。
-
clientPort : クライアント接続をリッスンするポート
構成ファイルを作成したので、ZooKeeperを起動できます。
bin/zkServer.sh start
ZooKeeperはlogbackを使用してメッセージをログに記録します。詳細については、プログラマーズガイドのロギングセクションを参照してください。logbackの構成に応じて、コンソール(デフォルト)および/またはログファイルにログメッセージが表示されます。
ここで概説した手順では、ZooKeeperをスタンドアロンモードで実行します。レプリケーションはないため、ZooKeeperプロセスが失敗すると、サービスは停止します。これはほとんどの開発状況では問題ありませんが、ZooKeeperを複製モードで実行する場合は、複製されたZooKeeperの実行を参照してください。
ZooKeeperストレージの管理
長期的な本番システムの場合、ZooKeeperストレージ(dataDirとログ)は外部で管理する必要があります。詳細については、メンテナンスに関するセクションを参照してください。
ZooKeeperへの接続
$ bin/zkCli.sh -server 127.0.0.1:2181
これにより、単純なファイルのような操作を実行できます。
接続すると、次のようなものが表示されます。
Connecting to localhost:2181
...
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
シェルからhelp
と入力して、クライアントから実行できるコマンドのリストを取得します。例:
[zkshell: 0] help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
ここから、このシンプルなコマンドラインインターフェイスを理解するために、いくつかの簡単なコマンドを試すことができます。最初に、ls
のようにlistコマンドを発行して、次のように出力します。
[zkshell: 8] ls /
[zookeeper]
次に、create /zk_test my_data
を実行して新しいznodeを作成します。これにより、新しいznodeが作成され、文字列 "my_data" がノードに関連付けられます。次のように表示されます。
[zkshell: 9] create /zk_test my_data
Created /zk_test
もう一度ls /
コマンドを発行して、ディレクトリがどのように見えるかを確認します。
[zkshell: 11] ls /
[zookeeper, zk_test]
zk_testディレクトリが作成されたことに注意してください。
次に、get
コマンドを実行して、データがznodeに関連付けられていることを確認します。例:
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
set
コマンドを発行することで、zk_testに関連付けられたデータを変更できます。例:
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
(データを設定した後でget
を実行し、実際には変更されました。
最後に、delete
を発行してノードを削除
しましょう。
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
とりあえずはこれで終わりです。さらに詳しく知りたい場合は、Zookeeper CLIを参照してください。
ZooKeeperプログラミング
ZooKeeperには、JavaバインディングとCバインディングがあります。それらは機能的に同等です。Cバインディングには、シングルスレッドとマルチスレッドの2つのバリエーションがあります。これらは、メッセージループの実行方法のみが異なります。詳細については、さまざまなAPIを使用したサンプルコードについて、ZooKeeperプログラマーズガイドのプログラミング例を参照してください。
複製されたZooKeeperの実行
ZooKeeperをスタンドアロンモードで実行するのは、評価、一部の開発、およびテストに便利です。ただし、本番環境では、ZooKeeperを複製モードで実行する必要があります。同じアプリケーション内のサーバーの複製グループはクォーラムと呼ばれ、複製モードでは、クォーラム内のすべてのサーバーが同じ構成ファイルのコピーを持っています。
注意
複製モードでは、最低3台のサーバーが必要であり、奇数のサーバーを使用することを強くお勧めします。サーバーが2台しかない場合、いずれかが故障すると、過半数のクォーラムを形成するのに十分なマシンがなくなります。2台のサーバーは、単一サーバーよりも本質的に安定性が低く、単一障害点が2つあるためです。
複製モードに必要なconf/zoo.cfgファイルは、スタンドアロンモードで使用されるものと似ていますが、いくつかの違いがあります。例を以下に示します。
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
新しいエントリinitLimitは、クォーラム内のZooKeeperサーバーがリーダーに接続するまでの時間を制限するためにZooKeeperが使用するタイムアウトです。エントリsyncLimitは、サーバーがリーダーからどの程度遅れているかを制限します。
これらのタイムアウトの両方で、tickTimeを使用して時間の単位を指定します。この例では、initLimitのタイムアウトは、2000ミリ秒のティックで5ティック、つまり10秒です。
server.X形式のエントリは、ZooKeeperサービスを構成するサーバーをリストします。サーバーが起動すると、データディレクトリ内のファイルmyidを検索して、どのサーバーであるかがわかります。そのファイルには、サーバー番号がASCIIで含まれています。
最後に、各サーバー名の後の2つのポート番号に注意してください: "2888" および "3888"。ピアは、前者のポートを使用して他のピアに接続します。このような接続は、たとえば、更新の順序に同意するために、ピアが通信できるようにするために必要です。より具体的には、ZooKeeperサーバーは、このポートを使用してフォロワーをリーダーに接続します。新しいリーダーが発生すると、フォロワーはこのポートを使用してリーダーへのTCP接続を開きます。デフォルトのリーダー選出でもTCPを使用するため、現在、リーダー選出にもう1つのポートが必要です。これは、サーバーエントリの2番目のポートです。
注意
1台のマシンで複数のサーバーをテストする場合は、各サーバーの構成ファイルで、servernameをlocalhostとして、一意のクォーラムポートとリーダー選出ポート(つまり、上記の例では2888:3888、2889:3889、2890:3890)を指定します。もちろん、個別の_dataDir_sと異なる_clientPort_sも必要です(上記の複製例では、単一のlocalhostで実行する場合でも、3つの構成ファイルが必要です)。
1台のマシンで複数のサーバーをセットアップしても、冗長性は作成されないことに注意してください。マシンが停止するような事態が発生した場合、すべてのzookeeperサーバーがオフラインになります。完全な冗長性には、各サーバーが独自のマシンを持つ必要があります。これは、完全に分離された物理サーバーである必要があります。同じ物理ホスト上の複数の仮想マシンは、そのホストの完全な障害の影響を受けやすいです。
ZooKeeperマシンに複数のネットワークインターフェイスがある場合は、ネットワーク障害が発生した場合に、すべてのインターフェイスにバインドして、正常なインターフェイスに自動的に切り替えるようにZooKeeperに指示することもできます。詳細については、構成パラメーターを参照してください。
その他の最適化
パフォーマンスを大幅に向上させる可能性のある構成パラメーターがいくつかあります。
- 更新のレイテンシーを低くするには、専用のトランザクションログディレクトリを持つことが重要です。デフォルトでは、トランザクションログはデータスナップショットおよびmyidファイルと同じディレクトリに配置されます。dataLogDirパラメーターは、トランザクションログに使用する別のディレクトリを示します。