読者です 読者をやめる 読者になる 読者になる

【CentOS】Gearman のジョブを MySQL に保存する

CentOS MySQL

Gearman + PHP でジョブサーバを作ったが、
Gearmanはジョブをメモリに保存するので、
再起動とかするとジョブが消える。
なので、ジョブをMySQLに保存する。

他のサイトだと、
libdrizzle とか MySQL-UDF を使ってるけど、
前回インストールしたノーマルGearmanでいけた。
前回のインストールは以下です。
http://d.hatena.ne.jp/pospome/20130822/1377162141

MySQLはインストールしておく。

MySQLにDBとテーブルを作る】

CREATE DATABASE gearman;
CREATE TABLE queue ( 
    unique_key VARCHAR(255),
    function_name VARCHAR(255),
    priority INT,
    data LONGBLOB,
    when_to_run BIGINT,
    unique key (unique_key, function_name)
);

---追記 2013/09/23 ---
queueテーブルの unique_key が varchar(500) だと、
ユニーク制約を付与できないので、
varchar(255)に修正しました。
---------------------


【起動する】
gearmand -q MySQL --mysql-user=root --mysql-password=pass --mysql-db=gearman --mysql-table=queue -d


---追記 2013/09/23 ---
DBが別ホストの場合は「--mysql-host=192.168.xx.xx」のように
ホストを設定する。
このとき、DBサーバのFireWallやSELinuxMySQLのユーザーアカウントのホスト指定を確認すること。
特にMySQLのアカウントをミスると以下のエラーが出ます・・・。
ERROR 1129 (HY000): Host '192.168.11.110' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
http://d.hatena.ne.jp/pospome/20130923/1379933439
---------------------

以上でOK。
前回のインストール時と起動方法が違うだけ。
と言っても 「/etc/init.d/gearmand」にオプションを設定すれば同じです。

動作確認は以下の記事の worker.php と client.php を用意してやってみる。
http://d.hatena.ne.jp/pospome/20130822/1377162141

client.php を実行してジョブを登録したら、
MySQLのテーブルを確認してみる。
ジョブが登録されているはず。
worker.php を実行すると、MySQLのジョブも削除される。


ちなみに、他のサイトではソースをmakeして色々やってるけど、
自分はうまくいかなかった・・・orz
参考までにその時のログを載せます。

【ソースからインストール】
//libevent-develが別途必要。
#yum install libevent-devel

//最初にlibdrizzleをインストール
#wget http://launchpad.net/libdrizzle/trunk/0.8/+download/libdrizzle-0.8.tar.gz
#tar xzf libdrizzle-0.8.tar.gz
#cd libdrizzle-0.8
#./configure
#make
#make install

#yum -y install boost-devel
#yum -y install gcc-c++
#yum -y install gperf
#yum -y install mysql-devel

//gearmand インストール
#wget http://launchpad.net/gearmand/trunk/0.14/+download/gearmand-0.14.tar.gz
#tar xzf gearmand-0.14.tar.gz
#cd gearmand-0.14
#./configure
#make
#make install

確認する。
#gearmand --help

これで以下のエラーが出たら、libdrizzleが認識されていない。
gearmand: error while loading shared libraries: libdrizzle.so.9: cannot open shared object file: No such file or directory

//libdrizzleのライブラリをOSに認識させる
//このファイル名は何でもいいが、拡張子はconfにする。
#vim /etc/ld.so.conf.d/libdrizzle.conf

//以下のローカルライブラリディレクトリを書き込む。
/usr/local/lib/

ライブラリを更新する。
#ldconfig

起動する。
このとき -l オプションでログファイルを指定しないと
デフォルトのログファイルが「/usr/local/var/log/gearmand.log」になり、エラーが出る。
#gearmand -d -l /var/log/gearmand.log


PHPのGearmanライブラリをインストールする】
# yum -y install libgearman-devel
# pecl install gearman

extension = gearman.so を php.ini に追記する。


【libdrizzleとGearmanを連携させる】
gearmand -q libdrizzle --libdrizzle-port=3306 --libdrizzle-db=gearman --libdrizzle-table=my_queue --libdrizzle-user=root --libdrizzle-password=pass -d -u root -l /var/log/gearmand.log --libdrizzle-mysql

ここで、「gearmand: Error while initializing the queue : libdrizzle」のエラーが出て詰む・・・。