Net::ZooKeeperを試してみたかったのになぜかAlien::ZooKeeper作りかけてやめた話

最近、zookeeper が意外と使えるかもなぁと思って、ちょっと試してみるかと Perl バインディングであるNet::ZooKeeperを cpan から入れようとしたところ、当然ですが client library およびビルド環境がないと入らなくて、じゃあそれの管理も必要だなぁと。CentOS なら rpm でもいんだけど、公式ではまだ提供されてないっぽい(trunk みると spec ファイルとか入ってるのでそのうち出るのかな?)。

クライアントライブラリごとき、OS のパッケージ管理に入れるのもなんかかったるいなぁと思い、Net::ZooKeeper入れるときに perl のライブラリっぽく入れてくれる方法ないかなぁというところで、ふと gfx さんのAlien::RRDtoolを思い出して、コピってAlien::ZooKeeperを作り始めました。RRDs と同様、Net::ZooKeeperも実は zookeeper 本体の tar.gz の中に同梱されているので、ちょちょっと書き換えるだけで実装できた気がしましたが、結論から言うと激しくダメでした。

ダメだったポイントとかやる気が無くなった話

一番は、Net::ZooKeeperの XS のビルド時にライブラリを簡単に静的リンクさせられないっぽいので、結局 Alien でライブラリとか入れたところで意味がないということ。

Alien::RRDtoolは動的リンクしてると思いこんでましたが、色々読んでいくとRRDsのビルドの時にRPATH指定して静的リンクしてました。まぁよくよく考えればそりゃそうだろって感じですが。。。

Net::ZooKeeperMakefile.PLはそれっぽい指定もできないなぁというところで、飽きてきたので諦めました。あとなんかNet::ZooKeeperが色々インストール周り微妙で、サーバ起動してないとこけるし、このテストのこの辺りが perl-5.14.2 だと必ずテストこけるとか、MacOS だともっと一杯こけるとかで、だいぶやる気がなくなりました。。。

後述のヘッダファイルの位置とかもなんか色々微妙だし、Alien で入るようになればポータブルにインストールできて嬉しい気がしたんですが、やる気の無さが勝りました。

素直にインストール

というわけで素直にインストール。細かいことは考えずとりあえず動けばいいや。

CentOS5

ライブラリとヘッダファイル用に rpm 入れるためのレポジトリを指定。今回は rtilabs さんを拝借。普通に tar.gz からmake installでもいいですし、trunk の spec 使って自分で作ってもいいですし、将来的には公式な rpm が出るんじゃないかなぁとか期待。

# vim /etc/yum.repos.d/rtilabs.repo
[rtilabs]
name=rtilabs Repository $releasever - $basearch
baseurl=http://rtilabs.net/files/repos/yum/rh/5/$basearch/
#mirrorlist=http://rtilabs.net/files/repos/yum/rh/5/$basearch/mirrorlist
enabled=0
gpgcheck=0
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rtilabs-rti

# yum --enablerepo=rtilabs install zookeeper-lib zookeeper-devel

微妙にNet::ZooKeeperが想定してる位置とヘッダファイルの位置が違うので手で修正。

# cd /usr/include
# ln -s zookeeper/proto.h .
# ln -s zookeeper/recordio.h .
# ln -s zookeeper/zookeeper.h .
# ln -s zookeeper/zookeeper.jute.h .
# ln -s zookeeper/zookeeper_log.h .
# ln -s zookeeper/zookeeper_version.h .

これでインストールできる。テストは先述のとおり微妙な作りなので無視して入れましょう。

$ cpanm -v --force Net::ZooKeeper

MacOS

homebrew で入れられるので、client library もいれてくれるオプションあるかなぁと思って Formula みたらあるので指定したらバグってて効かねぇ!ruby わかんないけど適当に修正。

$ vim /usr/local/Library/Formula/zookeeper.rb
@@ -66,13 +66,13 @@ class Zookeeper < Formula

     build_python = ARGV.include? "--python"
     build_perl = ARGV.include? "--perl"
-    build_c = build_python or build_perl or ARGV.include? "--c"
+    build_c = ARGV.include? "--c"

     # Build & install C libraries.
     cd "src/c" do
       system "./configure", "--prefix=#{prefix}", "--disable-dependency-tracking", "--without-cppunit"
       system "make install"
-    end if build_c
+    end if build_c or build_python or build_perl

$ brew install -v --c zookeeper

ヘッダファイルが同じくアレなので修正。

$ cd /usr/local/include
$ ln -s zookeeper/proto.h .
$ ln -s zookeeper/recordio.h .
$ ln -s zookeeper/zookeeper.h .
$ ln -s zookeeper/zookeeper.jute.h .
$ ln -s zookeeper/zookeeper_log.h .
$ ln -s zookeeper/zookeeper_version.h .

あとはテスト無視してインストール。

$ cpanm -v --force Net::ZooKeeper

まとめ

なんというか、使い始めるまでの時間で無駄に消費してしまうのは、運用をいつも考えてしまうからなんですかねぇ。。。

いらんところで色々苦労したので結局 zookeeper 使っておもしろホゲホゲやる暇はなく時間切れ。きっとまた半年くらいは触れる時間はないんかなぁ〜。だれか色々遊んでみてくれてもいいのよ!