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使っておもしろホゲホゲやる暇はなく時間切れ。きっとまた半年くらいは触れる時間はないんかなぁ〜。だれか色々遊んでみてくれてもいいのよ!