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

Gearman UDFを試してみる(1)

Gearman Python

前エントリで紹介したスライドに書いてあることをPythonでやってみようと思い、その下準備としてGearman UDFをインストールして動作確認を行うところまでやってみる。環境はCentOS 5.3とMySQL 5.1.34。

Gearman UDFをインストールする

libuuidが必要なのでe2fsprogs-develをインストールする。

$ sudo yum install e2fsprogs-devel

CentOSのlibeventは古すぎてlibgearmanをビルドできないので、libeventの最新安定版をインストールしておく。

$ wget http://monkey.org/~provos/libevent-1.4.10-stable.tar.gz
$ tar xzf libevent-1.4.10-stable.tar.gz
$ cd libevent-1.4.10-stable
$ ./configure
$ make
$ sudo make install

Gearmanのソースコードを取得してビルド、インストール。

$ wget http://launchpad.net/gearmand/trunk/0.5/+download/gearmand-0.5.tar.gz
$ tar xzf gearmand-0.5.tar.gz
$ cd gearmand-0.5
$ ./configure
$ make
$ sudo make install

Gearman UDFをインストール。libdirにMySQLのプラグイン・ディレクトリを指定する。mysql_configが示すplugindirにインストールするならば、このオプションは必要がないのかもsれない。

$ wget http://launchpad.net/gearman-mysql-udf/trunk/0.3/+download/gearman-mysql-udf-0.3.tar.gz
$ tar xzf gearman-mysql-udf-0.3.tar.gz
$ cd gearman-mysql-udf-0.3
$ ./configure --with-mysql=/usr/bin/mysql_config  --libdir=/usr/lib/mysql/plugin
$ make
$ sudo make install

ライブラリをインストールしたならば、MySQLにUDFを登録する。

CREATE FUNCTION gman_do RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_background RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high_background RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low_background RETURNS STRING
       SONAME "libgearman_mysql_udf.so";
CREATE AGGREGATE FUNCTION gman_sum RETURNS INTEGER
       SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_servers_set RETURNS STRING
       SONAME "libgearman_mysql_udf.so";

さらっと書いているけど、非標準的な場所(/usr, /usr/local以外)にlibeventやlibgearmanをインストールしようとすると、ちょっと手間がかかる。

libgearmanを/opt/libeventにインストールしたlibeventに対してビルドし、/opt/gearmanにインストールするには、

./configure --prefix=/opt/gearman --with-libevent-prefix=/opt/libevent

gearman-mysql-udfを/opt/gearmanにインストールしたlibgearmanを使ってビルドするには、

./configure --with-mysql=/usr/bin/mysql_config \
  --libdir=/usr/lib/mysql/plugin \
  CPPFLAGS="-I/opt/gearman/include" \
  LDFLAGS="-L/opt/gearman/lib" \
  DEPS_CFLAGS="-I/opt/gearman/include" \
  DEPS_LIBS="-L/opt/gearman/lib"

Gearman Job Serverを起動する

GearmanライブラリをインストールするとPREFIX/sbinにgearmandがインストールされるので、これを起動する。とりあえず試してみたいだけなので、-dオプション(デーモンとして起動)を省略し、-v(Verboseモード)でフォアグラウンドで起動。

$ /usr/local/sbin/gearmand -v
Starting up
Listening on :::4730

PythonでWorkerを書く

PythonのGearmanクライアント・ライブラリを使って、テスト用のWorkerを書く。

from gearman import GearmanWorker

def hello(job):
    return "Hello, %s" % job.arg

worker = GearmanWorker(["127.0.0.1:4730"])
worker.register_function("hello", hello)
worker.work()

MySQLから呼び出す

gman_servers_setでGearmanジョブサーバーを指定。

mysql> select gman_servers_set("127.0.0.1:4730");
+------------------------------------+
| gman_servers_set("127.0.0.1:4730") |
+------------------------------------+
| NULL                               |
+------------------------------------+
1 row in set (0.01 sec)

gman_doで先ほどのテスト用のWorkerの関数(hello)を呼び出す。

mysql> select gman_do("hello", "World");
+---------------------------+
| gman_do("hello", "World") |
+---------------------------+
| Hello, World              |
+---------------------------+
1 row in set (0.01 sec)

UDFの使い方に関しては、gearman-mysql-udfのREADMEに説明がある。