🐘

PHPからZookeeperを操作するZookeeper拡張モジュールのインストール

2023/06/28に公開

PHPからZookeeperを操作するためのZookeeper拡張モジュールについては、PHPの公式マニュアルではPECLでインストールできるように記載されていますが、Zookeeper拡張モジュールであるphp-zookeeperの公式サイト(github)ではソースからビルドする手順になっています。

peclでインストールした事例は、古いものは見当たりましたが、この例でpecl実行前にインストールしているlibzookeeperおよびlibzookeeper-develのrpmが今日では見当たらないようです。

従ってphp-zookeeperの公式サイトのREADMEを参考にインストールを行う手順について記してみます。想定する環境はAlmaLinux9.2とPHP8.2です。もしAlmaLinux9.2+PHP8.2でpeclでインストールする方法があればお教えください。

ZooKeeper C Bindingのビルド

Zookeeper拡張モジュールをインストールする前に、Zookeeper本体に含まれているC Bindingのビルドが必要です

まずビルドに必要なパッケージをインストールしておきます

sudo dnf install java-11-openjdk-devel
sudo dnf install ant cppunit cppunit-devel autoconf automake libtool

Zookeeperの公式サイトから最新の3.8.1のソースをダウンロードして解凍します。ちなみに2023年6月現在、最新のstable releaseは3.7.1となっていますが、Solr9.2でSolrCloud構成を取る場合に3.8.1が使われているので、それに合わせました。

また、同時に3.5系の最新版もダウンロードします。php-zookeeperのREADMEに書いてありますが、3.6系のソースはbuild.xmlやivy.xml 、ivysettings.xmlを欠いており、antが実行できないためです。ちなみにantを実行せずにconfigureを実行すると、先にant compile_juteを実行するように促されます。

wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1.tar.gz
tar xvf apache-zookeeper-3.8.1.tar.gz


wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.5.10/apache-zookeeper-3.5.10.tar.gz
tar xvf apache-zookeeper-3.5.10.tar.gz

3.5.10に含まれるbuild.xmlとivy* を3.8.1にコピーします

cp apache-zookeeper-3.5.10/build.xml apache-zookeeper-3.8.1
cp apache-zookeeper-3.5.10/ivy* apache-zookeeper-3.8.1

ビルドを実行します

cd apache-zookeeper-3.8.1
ant compile_jute

cd zookeeper-client/zookeeper-client-c
autoreconf -if
./configure
make
sudo make install

成功すると /usr/local/lib以下に以下のファイルができます

libzookeeper_mt.a
libzookeeper_mt.la
libzookeeper_mt.so -> libzookeeper_mt.so.2.0.0
libzookeeper_mt.so.2 -> libzookeeper_mt.so.2.0.0
libzookeeper_mt.so.2.0.0
libzookeeper_st.a
libzookeeper_st.la
libzookeeper_st.so -> libzookeeper_st.so.2.0.0
libzookeeper_st.so.2 -> libzookeeper_st.so.2.0.0
libzookeeper_st.so.2.0.0

PHP ZooKeeper Extensionのビルド

注意点php-zookeeperのREADMEには書かれていませんが、make時にZooKeeper C Bindingのインストール時に生成された /usr/local/include/zookeeper/zookeeper.jute.h が必要になります。こちらのブログ記事が大いに参考になりました
PHP で Solr の状態を ZooKeeper から取得する

git clone https://github.com/php-zookeeper/php-zookeeper.git
cd php-zookeeper
phpize

./configure --with-libzookeeper-dir=/path/to/apache-zookeeper-3.8.1/zookeeper-client/zookeeper-client-c

cp /usr/local/include/zookeeper/zookeeper.jute.h /path/to/apache-zookeeper-3.8.1/zookeeper-client/zookeeper-client-c/include

make
sudo make install

成功すると /usr/lib64/php/modules/zookeeper.so ができます。

ZooKeeperへの接続テスト

localhostでZookeeperとSolrがSolrCloud構成で起動しており、Solrにはサンプルのsample_techproductsコレクションが作成されているものとします。

/etc/php.d/40-zookeeper.iniを以下の内容で作成します

extension = zookeeper.so

環境変数LD_LIBRARY_PATHを/usr/local/libという値で設定します。とりあえず~/.bashrc に以下の行を追加し、source ~/.bashrcを実行して反映させることとします

export LD_LIBRARY_PATH=/usr/local/lib

zookeeper_test.php を以下の内容で作成します

<?php
$zc = new Zookeeper();
$zc->connect('localhost:2181');
$state = $zc->get('/solr/collections/sample_techproducts/state.json');
$state = json_decode($state);
$shardes = $state->sample_techproducts->shards;
foreach ($shardes as $sharde) {
    foreach($sharde->replicas as $replica) {
        print_r($replica);
    }
}
?>

実行結果

stdClass Object
(
    [core] => sample_techproducts_shard1_replica_n2
    [node_name] => 127.0.0.1:8004_solr
    [type] => NRT
    [state] => active
    [force_set_state] => false
    [base_url] => http://127.0.0.1:8004/solr
)
stdClass Object
(
    [core] => sample_techproducts_shard1_replica_n4
    [node_name] => 127.0.0.1:8003_solr
    [type] => NRT
    [state] => active
    [leader] => true
    [force_set_state] => false
    [base_url] => http://127.0.0.1:8003/solr
)
:略

リーダーノードを知ることができました

Discussion