その昔、VCS(Veritas Cluster Server)のエンジンログと戯れたりしてたのですが、
ZooKeeperをウマイこと使いこなせれば、あんな事やこんな事できるのかな?と。
ドキュメントとかみるとシンプルで使いやすい的な事が書いてあるけど、
自分で手動かしてみないと何とも言えないなぁと。
って事で早速試してみます。
■ Getting Started
↓さーて、また英語読まなきゃなのねーって思ってたら、、
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
↓なんと、日本語のページあるじゃねーすか!
http://oss.infoscience.co.jp/hadoop/zookeeper/docs/current/zookeeperStarted.html
が、ちょっと読んでみると、そもそもの事をもうちょっと知っといた方がイイかな、、と。
■ 概要
Overviewのページもちゃんと日本語訳が存在します↓
http://oss.infoscience.co.jp/hadoop/zookeeper/docs/current/zookeeperOver.html
大体分かったのですが、ZooKeeperそのものがどうやって一貫性を保証してるのかは
なんかちょっと良くわかりませんでした。。
↓を読むと、
Observers と ZooKeeper _1 « Agile Cat — in the cloud
たぶんポイントは以下の部分になるのだと思うのですが、
ZooKeeper makes sure that all reads and all writes are observed by every client of the system in exactly the same order, so that there’s no confusion about which operation happened first. -- ZooKeeperは、すべてのreadとwriteがシステム上の全てのクライアントから、 完全に同じ順序で観察されることを保障するので、 どのオペレーションが最初に行われたのか、混乱が起こることが無くなる。
それがノードまたいだ時にどういう実装になるのかよくわかりまシェン。
ってか、逆にその辺を自分で実装思いつけちゃうくらいだったら、
もっと違う立場で仕事してるか、とか思いますけどww
んま、ググっていくとZAB(ZooKeeper Atomic Broadcast)と呼ばれる
ZooKeeper独自なプロトコルになってて↓なような感じになってるそです。
・ZooKeeperクラスタはリーダーと呼ばれる
エロいエラいノードにコントロールされる
・各ノードの更新は一旦リーダーに通知されホゲホゲされた後に各ノードに返す
各ノードの過半数がOKよんって事だったら、その更新は成功としてクライアントに通知される
・でもって、リーダーノードが落ちたら別のノードにフェールオーバーするよになってるよ、と。
俺も某@nishiokameganeみたいにこの辺を実装みて
ニヤニヤ出来るようになりたいなー…。
■ ZooKeeperをダウンロード
何か日本語のページから遷移したらリンク切れになっちゃってたのですが、
↓から安定版をダウンロードします。
http://ftp.meisei-u.ac.jp/mirror/apache/dist/zookeeper/stable/
落としてきて解凍します。ディレクトリ構造とかJavaだと親近感あるなー。
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/zookeeper/stable/zookeeper-3.4.4.tar.gz
2012-11-02 19:49:24 (5.09 MB/s) – `zookeeper-3.4.4.tar.gz’ saved [16347805/16347805]
$ tar xvf zookeeper-3.4.4.tar.gz
zookeeper-3.4.4/
zookeeper-3.4.4/bin/
zookeeper-3.4.4/build.xml
~略~
■ ZooKeeperをReplicated Modeで起動
スタートガイドだとスタンドアロンモードなんだけど、それだとあんまり意味ないというか。
で、見てくと、ガイドの下の方に Running Replicated ZooKeeper って感じの所があります。
ほんとは複数台マシンでやれたらイイのですが、仕方ないので1台のマシンで。
bin/zkServer.sh を見ていくと、
第2引数でファイル名を指定出来る感じなのかな、と。
61 if [ “x$2” != “x” ]
62 then
63 ZOOCFG=”$ZOOCFGDIR/$2″
64 fi
って事で、設定ファイルを3つ用意します。
zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper1
clientPort=2181
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper2
clientPort=2182
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper3
clientPort=2183
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
ディレクトリも作っておきやす。
$ mkdir /tmp/zookeeper3
$ mkdir /tmp/zookeeper2
$ mkdir /tmp/zookeeper1
んで、それぞれ起動します。
$ ./zkServer.sh start zoo1.cfg
JMX enabled by default
Using config: /tmp/zookeeper-3.4.4/bin/../conf/zoo1.cfg
Starting zookeeper … STARTED
$ ./zkServer.sh start zoo2.cfg
JMX enabled by default
Using config: /tmp/zookeeper-3.4.4/bin/../conf/zoo2.cfg
Starting zookeeper … STARTED
$ ./zkServer.sh start zoo3.cfg
JMX enabled by default
Using config: /tmp/zookeeper-3.4.4/bin/../conf/zoo3.cfg
Starting zookeeper … STARTED
が、とかいってちゃんと上がってねー。。
Caused by: java.lang.IllegalArgumentException: /tmp/zookeeper3/myid file is missing
んで、myidってファイルをtouchしてもっかい起動したら、、、
このmyidファイルにはserver.1とかserver.2に対応する数字が入ってないとダメだそうで。。
Caused by: java.lang.IllegalArgumentException: serverid is not a number
そんなこんなでようやくサーバーを起動出来ました。。
■ クライアントから繋いでみます。
$ ./zkCli.sh -server localhost:2181
Connecting to localhost:2181
2012-11-02 20:42:03,473 [myid:] – INFO [main:Environment@100] – Client environment:zookeeper.version=3.4.4-1386507, built on 09/17/2012 08:33 GMT
~略~
ここからお楽しみーって感じなのですが、時間がないので、
また次回…。
—
[追記 2012 Nov 7]
ボケーっとTwitterみてたら、友人の @tocci3 が、
↓気になる事を呟いてたのでEclipse(ってかSTS)ユーザーとしては
見逃せねぇって事で絡んでみたら、
Help > Install New Softwareで、
↓の更新サイトで、
http://www.massedynamic.org/eclipse/updates/
↓こんな感じで Plug-in for ZooKeeperを突っ込んでやると、、
↓これまた直感的でナイスございます、と。
このEclipseプラグインは↓のHadoop Hacksに載ってたらしいす。
オライリージャパン
売り上げランキング: 227088
コメント