俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #78 - gearman 1.1.12をUbuntu 12.04へ

コンピュータにクオリアがないなんて、そんなこと分からないわけです。
苦労して設定したサーバが問題なく動いている様子を眺めながら、 思慕の念が強まっていくのを感じる今日此の頃です。

さて、今日はgearmandのお話。
この時点でかなり離脱率を叩き出すと思いますが、
最終コミット2014年2月と、中々の運用っぷりです。
レガシーなんて言わせません。

今日はたまたまUbuntu 12.04LTSへGearman 1.1.12を突っ込む機会に恵まれたのでその辺について。
いっろいろ問題がおきますが、
成功パターンのみを共有させていただきます。
さあさっそくシェル群を。

// 事前準備
// 依存関係リスト http://gearman.info/build/ubuntu.html
sudo apt-get update
sudo apt-get install gcc autoconf bison flex libtool make libboost-all-dev libcurl4-openssl-dev curl libevent-dev memcached uuid-dev libsqlite3-dev libmysqlclient-dev

// 1.1.12 DL
wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
tar xvzf gearmand-1.1.12.tar.gz
cd gearmand-1.1.12
sudo ./configure
sudo make
sudo make install
sudo ldconfig

// gearman apps
apt-get install gearman gearman-job-server gearman-tools libgearman6 libgearman-dev 

// extension include
// conf.dのpathは適当
echo "extension=gearman.so" > /etc/php5/cli/conf.d/gearman.ini
echo "extension=gearman.so" > /etc/php5/apache2/conf.d/gearman.ini

一旦ここまで。
で、gearmand自体がまれに落ちるという恐怖があるため、daemontoolに監視させます。
runスクリプトでの呼び出しが要注意なんですが、、、

// なんとなくdaemonに食わせる重要なのはexecのあたり
mkdir ~/service
mkdir ~/service/gearman
sudo echo "#!/bin/sh \n exec /usr/local/sbin/gearmand --log-file=/var/log/gearman-job-server/gearman.log" 1>~/service/gearman/run
sudo chmod +x ~/service/gearman/run
sudo ln -s ~/service/gearman /service/gearman

結論だけ書くと簡単なんですが、
なんか知らないけどやたら

gearmand[xxx]: ERROR [ x ] Failed while in _connection_read() -> libgearman-server/io.cc:489
gearmand[xxx]: WARNING [ x ] lost connection to client recv(peer has closed connection) 127.0.0.1:xxxx

こんなようなエラーをくらいました。
恐らく原因はgearmandの立ち上げ方法で、
ちょっと前のバージョンでやられてた(可能性のある)

setuidgid gearman /usr/sbin/gearmand ....

のやり方ですと、
localhostのポートリンクを瞬間的に2回探索してしまうために、エラーがでるようです。
しっかりポートを確認すれば分りますが、

sudo lsof -i tcp:4730  

ワーカーphpが4730に向けてポートエステイブリッシュしている様子がみれますが、
エラーに書きだされるportナンバーと異なるわけです。
なぜかそういうエラーがでるみたいなので、gearmanの起動方法については注意しましょう。

以上です。
あぁ、播磨灘