初めに、以下の設定ファイルを作成し、「conf/zoo.cfg」という名前で保存します。
tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181
ここで各設定項目は以下の意味を持ちます。
設定が終わった後、以下のコマンドでZooKeeperサーバを立ち上げます。
$ bin/zkServer.sh start
■クライアントシェルを立ち上げる
ZooKeeperが提供するファイルシステムにアクセスしてみます。簡単にファイルシステムにアクセスするには、Zookeeperが提供するシェルを利用できます。以下のコマンドでZookeeperにアクセスしてみましょう。
$ bin/zkCli.sh -server 127.0.0.1:2181 2012-03-21 22:04:24,973 - INFO [main:Environment@97] - Client environment:java.compiler= 2012-03-21 22:04:24,973 - INFO [main:Environment@97] - Client environment:os.name=Mac OS X 2012-03-21 22:04:24,974 - INFO [main:Environment@97] - Client environment:os.arch=x86_64 2012-03-21 22:04:24,975 - INFO [main:Environment@97] - Client environment:os.version=10.7.2 2012-03-21 22:04:24,976 - INFO [main:Environment@97] - Client environment:user.name=takahi-i 2012-03-21 22:04:24,976 - INFO [main:Environment@97] - Client environment:user.home=/Users/takahi-i 2012-03-21 22:04:24,976 - INFO [main:Environment@97] - Client environment:user.dir=/Users/takahi-i/work/zookeeper/zookeeper-3.3.4 2012-03-21 22:04:24,988 - INFO [main:ZooKeeper@379] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@7ddf5a8f Welcome to ZooKeeper! 2012-03-21 22:04:25,116 - INFO [main-SendThread():ClientCnxn$SendThread@1061] - Opening socket connection to server /127.0.0.1:2181 JLine support is enabled [zk: 127.0.0.1:2181(CONNECTED) 0]
ここで以下のように「help」と入力すると、シェルが提供するコマンド一覧が表示されます。
[zk: 127.0.0.1:2181(CONNECTED) 0] help ZooKeeper-server host:port cmd args connect host:port get path [watch] ls path [watch] set path data [version] delquota [-n|-b] path quit printwatches on|off create [-s] [-e] path data acl stat path [watch] close ……
■Clientシェルでファイルを操作
以下のコマンドでファイルルートディレクトリにあるファイル一覧見てみましょう。
[zk: 127.0.0.1:2181(CONNECTED) 2] ls / ls / [zookeeper]
次に、ノードを生成してみます。ノードの生成には「create」コマンドを利用します。以下のコマンドで「foo」というノードをルート直下に生成し、ノードのコンテンツを「hoge」とします。
[zk: 127.0.0.1:2181(CONNECTED) 4] create /foo hoge create /foo hoge Created /foo
ここで、もう一度ルートディレクトリ内のノード一覧を見てみます。生成した「foo」ノードが生成されたことが分かります。
[zk: 127.0.0.1:2181(CONNECTED) 5] ls / ls / [foo, zookeeper]
ノードの中身を見るには「get」を利用します。
[zk: 127.0.0.1:2181(CONNECTED) 7] get /foo get /foo hoge cZxid = 0x2 ctime = Wed Mar 21 22:17:40 JST 2012 mZxid = 0x2 mtime = Wed Mar 21 22:17:40 JST 2012 pZxid = 0x2 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0
ZooKeeperは複数の計算機からなるクラスタとして冗長モードサービスを提供できます。複数の計算機を利用することで、クラスタ内の一部計算機が壊れてしまった場合にも、問題なくサービスの提供を継続できます。
ZooKeeperを冗長モードで立ち上げるには「zoo.cfg」に追加の設定項目を記述するだけです。具体的には、「server.#」を各サーバごとに記述します。
以下の「zoo.cfg」は3台の計算機でZokeeperを動作させた場合の記述例です。
tickTime=2000 dataDir=/var/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=foo:2888:3888 server.2=foobar:2888:3888 server.3=hgoe:2888:3888
上記のzoo.cfgを見て分かるように、「zerver.N」から始まる行が追加されています。これらはクラスタを構築するサーバ名とポートアドレスを記述します。ここで、ポート番号を2つ指定(上記の例では「2888」「3888})する必要があります。これらのポートはZooKeeperサーバ間で情報を交換するために使用します。
ここからは、ZooKeeperに接続するプログラム、およびZooKeeperサーバをプログラムから立ち上げる方法を紹介します。
■クライアントプログラム
JavaやC++でZooKeeperに接続するプログラムを記述できます。残念ながらZooKeeperを利用したプログラムは簡単な機能を持つものでも、そこそこの長さになってしまうので、本稿では詳細を割愛します。ZooKeeperクライアントプログラムの良いサンプルとして、ZooKeeperのサイト「ZooKeeper の Java での使用例」で紹介されているものがあります。ぜひ参考にしてください。
このプログラムでは、コマンド引数で指定されたZnodeをウオッチし、変更された場合プログラムを再起動します。また、ウオッチするZnodeが消失した場合はプログラムをkillします。
■サーバを立ち上げるプログラム
前節で試したようにZooKeeperは付属のシェルスクリプトで起動できますが、ソフトウェアに同梱しプログラムから直接起動できるとユーザーの負担を軽減できます。次期Apache Solr(SolrCloud)やHBaseはZooKeeperを立ち上げる処理を内部で行うことで、ユーザーがZooKeeperサーバを立ち上げる負担を軽減しています。
また、この機能を利用することでテストがしやすくなるというメリットもあります。
実際ZooKeeperをJavaプログラムで起動するのは、それほど難しくはありません。簡単なサンプル「spikes」をZooKeeperのテストから抽出したので、実際に利用する際の参考にしてください。
本稿では、ZooKeeperについて簡単に解説しましたが、いかがでしたでしょうか。具体的には、ZooKeeperが利用される領域について解説した後、ZooKeeperが提供するウオッチなどの機能について述べました。
Zookeeperは、Hadoopファミリの中では目立つ存在ではありませんが、多くのサービスやアプリケーションで有用なサービスを提供します。今後多くのサービスやシステムでさらに導入が進むのではないかと考えています。
Copyright © ITmedia, Inc. All Rights Reserved.