PHPからZookeeperを操作するZookeeper拡張モジュールのインストール
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