ZooKeeper を使ってみる(2)

1年半ぶりにZooKeeperネタ。複数サーバを立てるには、というお話。まずは同一ホストに複数のZooKeeperノードを立ててみる。

設定ファイル

設定ファイルをノードごとに用意する必要がある。最小限の設定ファイルは、下記のようになる。

tickTime=2000
dataDir=/tmp/zookeeper/1
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

initLimit はフォロワー(リーダ以外のノード)がリーダに接続して同期する際の時間の(チック数での)上限。initLimitが5でtickTimeが2000msなのでこの場合は10秒が上限になる。
SyncLimit はfフォロワーがリーダに対して同期遅れになっていても許される時間の上限(チック数)、だそうだ。よくわからないけど。
同一ノードなので dataDir はそれぞれ異なるようにしないといけない。clientPortも同様。

server エントリでノードを指定する。番号はノード番号、後ろの2つはポート番号。これも同一ホスト上なので一つづつずらしてある。

myid

ちょっとハマったのはmyidというファイルを用意しないといけないということ。$(dataDir)/myid として、1とか2とか書かれたファイルが必要。こんなスクリプトを書いて生成してやる。

mkdir /tmp/zookeeper
mkdir /tmp/zookeeper/1
mkdir /tmp/zookeeper/2
mkdir /tmp/zookeeper/3

echo '1' > /tmp/zookeeper/1/myid
echo '2' > /tmp/zookeeper/2/myid
echo '3' > /tmp/zookeeper/3/myid

起動

コンナスクリプトで一括して起動してやる。

export CLASSPATH=zookeeper-3.4.3.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf
java -cp $CLASSPATH org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.1.cfg &
java -cp $CLASSPATH org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.2.cfg &
java -cp $CLASSPATH org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.3.cfg &

トラブル

なぜかタイムアウトばかりして接続できない状態になった。よく見ると、サーバの残骸?のようなJavaプロセスがいて、それを消したら正常に動作するようになった。全く良くわからないのだが、接続がそちらのプロセスに行ってしまって接続できていなかったのかもしれない。。不思議。。