Apache > Hadoop > ZooKeeper
 

ZooKeeper スタートガイド

スタートガイド: ZooKeeper による分散アプリケーションのコーディネート

このドキュメントでは、ZooKeeper を使い始めるのに必要な情報について説明しています。主な想定読者は ZooKeeper を使ってみたいという開発者です。スタンドアロンの ZooKeeper サーバーをセットアップするための簡単なインストール手順をはじめ、ZooKeeper サーバーが実行されていることを確認するためのコマンド、簡単なプログラミング例を示します。最後に、もう少し複雑な動作モードで ZooKeeper をセットアップする方法を簡単に示し、レプリケーションモードでのデプロイメントやトランザクションログの最適化などについて説明します。なお、商用目的でのデプロイメント方法の詳細については、「ZooKeeper 管理者ガイド」を参照してください。

必要なもの

管理者ガイドの「必要システム」を参照してください。

ダウンロード

ZooKeeper ディストリビューションを入手するには、Apache ダウンロードミラーサイトのいずれかから最新の安定版リリースをダウンロードします。

スタンドアロンモードでの実行

ZooKeeper サーバーをスタンドアロンモードでセットアップするのは簡単です。サーバーは単一の JAR ファイルに含まれているので、インストール作業で必要なことは、設定を作成することだけです。

安定版の ZooKeeper リリースをダウンロードしたら、パッケージを解凍して、その中のルートディレクトリに移動します。

ZooKeeper を起動するには、設定ファイルを用意する必要があります。次に示すのはサンプルです。このサンプルを conf/zoo.cfg というファイル名で作成してください。

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181

ファイル名は何でもかまいませんが、ここでは便宜的に conf/zoo.cfg としておきます。dataDir には、既存の (最初は空の) ディレクトリを指定します。各フィールドの意味は次のとおりです。

tickTime

ZooKeeper で使われる基本的な時間の単位 (ミリ秒) です。ハートビートの実行には、ここで指定する値が使われ、最小セッションタイムアウトは tickTime の 2 倍になります。

dataDir

ここで指定する場所に、インメモリデータベースのスナップショットが格納されます。ほかに特別の指定がなければ、データベースに対する更新のトランザクションログも、ここで指定された場所に格納されます。

clientPort

クライアントからの接続をリスンするポートです。

設定ファイルを作成したら、次の要領で ZooKeeper を起動できます。

bin/zkServer.sh start

ZooKeeper は log4j を使ってメッセージを記録します。詳細は、ZooKeeper 管理者ガイドの「ログ記録」で説明しています。ログメッセージはコンソールに表示され (デフォルト)、log4j の設定によってはログファイルに記録されます。

ここで説明した手順では、ZooKeeper がスタンドアロンモードで実行されます。レプリケーションは行われないので、ZooKeeper プロセスがダウンすると、サービスもダウンします。開発に利用するほとんどの場面では、これで問題ありませんが、レプリケーションモードで ZooKeeper を実行する場合は、後の「レプリケーションモードでの ZooKeeper の実行」を参照してください。

ZooKeeper ストレージの管理

実行状態が長い間続く実働システムでは、ZooKeeper ストレージ (dataDir およびログ) を外部から介入して管理する必要があります。詳細については、「保守」を参照してください。

ZooKeeper への接続

ZooKeeper を実行中にしたら、さまざまな方法で ZooKeeper に接続できます。

  • Java: 次のコマンドを実行します。

    bin/zkCli.sh -server 127.0.0.1:2181

    これで、ファイル操作に似たシンプルな処理を行うことができます。

  • C: ZooKeeper ソースの src/c サブディレクトリで make cli_mt または make cli_st を実行し、cli_mt (マルチスレッド) か cli_st (シングルスレッド) をコンパイルします。詳細については、src/c ディレクトリの README を参照してください。

    src/c のプログラムは次の要領で実行できます。

    LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181

    または

    LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181

    シンプルなシェルが立ち上がり、ファイルシステムでの操作に似た処理を ZooKeeper 上で行うことができるようになります。

ZooKeeper に接続すると、次のようなメッセージが表示されます。


Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
        

このシェルで help と入力すると、クライアントから実行できるコマンドの一覧が表示されます。


[zkshell: 0] help
ZooKeeper host:port cmd args
        get path [watch]
        ls path [watch]
        set path data [version]
        delquota [-n|-b] path
        quit
        printwatches on|off
        createpath data acl
        stat path [watch]
        listquota path
        history
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path

        

では、いくつか簡単なコマンドを実行して、コマンドラインインタフェースの感触をつかんでみましょう。最初に、一覧を表示するコマンド ls を実行します。結果は次のようになります。


[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 ディレクトリが作成されています。

次に、データがこの znode に関連付けられていることを確認します。それには、get コマンドを実行します。


[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 プログラマーズガイド」を参照してください。

ZooKeeper でのプログラミング

ZooKeeper には Java バインディングと C バインディングがあります。機能的にはどちらも同じです。C バインディングには、シングルスレッドとマルチスレッドの 2 つのバリアントがあります。これら 2 つは、メッセージング ループがどのように行われるかが異なるだけです。詳細については、「ZooKeeper プログラマーズガイド」の「プログラミング例」で取り上げている API を使ったサンプルコードを参照してください。

レプリケーションモードでの ZooKeeper の実行

スタンドアロンモードでの ZooKeeper の実行は、ZooKeeper の評価、ある程度までの開発、テストには適しています。しかし実働環境では、レプリケーションモードで ZooKeeper を実行する必要があります。同一のアプリケーション内でレプリケーションを行うサーバーはクォーラム (quorum) と呼ばれます。レプリケーションモードでは、クォーラム内のすべてのサーバーが同じ設定ファイルのコピーを持ちます。この設定ファイルは、スタンドアロンモードで使用したものと似ていますが、いくつか相違点があります。次に例を示します。

tickTime=2000
dataDir=/var/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 tick なので、10 秒になります。

server.X 形式のエントリは、ZooKeeper サービスを構成するサーバーを列挙したものです。サーバーは起動時に、データディレクトリ内のファイル myid をみて、自分がどのサーバーであるかを認識します。ファイル myid に収められているのは、ASCII で記述されたサーバー番号です。

各サーバー名のあとには、2 つのポート番号 "2888" と "3888" が指定されています。ピアはこのうち前者のポートを使用して、ほかのピアに接続します。こうした接続が必要なのは、ピア同士が通信できるようにするためです。たとえば更新の順序について合意する場合などです。もっと具体的に言えば、ZooKeeper ではフォロワーがリーダーに接続するときにこのポートを使います。新しいリーダーが出現すると、フォロワーはこのポートを使ってリーダーへの TCP 接続をオープンします。デフォルトリーダー選挙も TCP を使うので、現時点ではリーダー選挙用に別のポートが必要です。これが server エントリの 2 つ目のポートです。

1 台のマシン上で複数のサーバーをテストする場合は、各 server.X のサーバー名を localhost とし、一意のクォーラムポートとリーダー選挙ポート (上の例の場合なら 2888:3888、2889:3889、2890:3890 など) を指定し、これを各サーバーの設定ファイルに記述してください。言うまでありませんが、サーバーごとに別個の dataDirclientPort を指定する必要があります (上のレプリケーションモードの例では、単一の localhost で実行する場合でも、設定ファイルは 3 つになります)。[訳注:サーバーの起動時に、各サーバー用の設定ファイルを指定して起動します。]

その他の最適化

このほかにも、パフォーマンスの大幅な向上を可能にする設定パラメータが 2 つあります。

  • 更新時の遅延を短くするには、専用のトランザクションログディレクトリを用意することが重要です。デフォルトでは、トランザクションログは、データスナップショットおよび myid ファイルと同じディレクトリに置かれます。トランザクションログ用に別に使用するディレクトリは、dataLogDir パラメータで指定できます。

  • [準備中:もう一つの設定パラメータは?]