CentOS 5.5(x86_64)でQ4Mを使う


Q4Mとは

Q4Mは、MySQLのプラグインとして動作するメッセージキューです。
開発は奥 一穂さんが行っており、GPLライセンスのもと配布されています。
DeNAやmixiでも利用されています。

Q4Mを利用するためにはMySQL5.1以上が必要になります。
今回はCentOS 5.5のMySQL5.1上でQ4Mをインストールします。

MySQL 5.1をインストール

MySQL 5.1をRPMでインストールしたいので、まずは既にインストールされているMySQL 5.0をアンインストールします。

$ sudo yum remove mysql-server mysql

依存してるMySQLの各種言語ライブラリもアンインストールされます。
これから使用するときは別途インストールしなきゃいけないと思うとちょっとめんどうな気持ちになってきましたが…。

http://dev.mysql.com/downloads/mysql/ から各RPMをダウンロードします。

  • MySQL-client-5.1.50-1.glibc23.x86_64.rpm
  • MySQL-devel-5.1.50-1.glibc23.x86_64.rpm
  • MySQL-server-5.1.50-1.glibc23.x86_64.rpm
  • MySQL-shared-5.1.50-1.glibc23.x86_64.rpm
  • MySQL-community-5.1.50-1.rhel5.src.rpm

src.rpmも使用するのでダウンロードしておきます。

まず、各MySQLのRPMをインストールします。

$ sudo rpm -ivh MySQL-*.x86_64.rpm

次にsrc.rpmをリビルドします。

$ sudo rpmbuild –recompile –define ‘community 1′ MySQL-community-5.1.50-1.rhel5.src.rpm

これが意外と時間かかりました。
コーヒーでも飲んで待ってましょう。
ちなみに途中でテストでエラー吐いて止まったんですが、そのまま続けてもOKでした。
もしや、ソースだけあればOKなのか…?

Q4Mをビルドしてインストール

http://q4m.31tools.com/dist/ からQ4M(http://q4m.31tools.com/dist/q4m-0.9.4.tar.gz)をダウンロードします。
各バージョンのMySQL用のバイナリもありますが、今回はソースからビルドします。

下記のようにconfigure、make、make installします。

$ ./configure --with-mysql=/usr/src/redhat/BUILD/mysql-5.1.50/ CXXFLAGS="-I/usr/include/mysql" \
 --libdir=/usr/lib64/mysql/plugin/
$ make
$ sudo make install

最後にPluginをインストールするためのSQLを発行して終了です。

$ mysql -u root -p -f mysql < support-files/install.sql 

実際にMySQLにログインしてPluginが有効になっているか確認します。

mysql> show plugins;
+------------+----------+----------------+--------------------+---------+
| Name       | Status   | Type           | Library            | License |
+------------+----------+----------------+--------------------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL               | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| QUEUE      | ACTIVE   | STORAGE ENGINE | libqueue_engine.so | GPL     |
+------------+----------+----------------+--------------------+---------+
11 rows in set (0.01 sec)

一番下の「QUEUE」が表示されたらインストール成功です。

簡単に使ってみる

では簡単に使ってみます。
まず、QUEUEテーブルを作成します。
データベースは適当にtestあたりでも使用します。

mysql> use test;
mysql> CREATE TABLE queue_test (
    -> message TEXT NOT NULL
    -> )ENGINE = QUEUE;
Query OK, 0 rows affected (0.01 sec)

では、enqueueします。

mysql> INSERT INTO queue_test (message) VALUES ('test1'), ('test2'), ('test3');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

queueを参照すると3件のqueueが入ってることが確認できます。

mysql> SELECT * FROM queue_test;
+---------+
| message |
+---------+
| test1   |
| test2   |
| test3   |
+---------+
3 rows in set (0.00 sec)

次にdequeueします。
dqueueではqueue_waitを使用します。
成功の場合は1が返り、以降queueを参照するとdequeueしたレコードのみ引けるようになります。

mysql> SELECT queue_wait('queue_test');
+--------------------------+
| queue_wait('queue_test') |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM queue_test;
+---------+
| message |
+---------+
| test1   |
+---------+
1 row in set (0.00 sec)

このdequeueした状態のことをオーナーモードと呼びます。
このとき、他のコネクションからオーナーモードになると別のレコードが対象になります。
ここら辺の排他制御的なものが自動的にできるというのが便利なところですね。

処理が終わったら、queue_end()を利用します。
queue_end後は該当のqueueがqueueテーブルから削除されます。

mysql> SELECT queue_end();
+-------------+
| queue_end() |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

なんらかのプログラム的な原因でqueueをqueueテーブルに戻したいときはqueue_abort()を利用します。

mysql> SELECT queue_abort();
+---------------+
| queue_abort() |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

最後に

Q4Mのインストールから簡単に使ってみるところまでを紹介しました。
今回は紹介しきれてませんが、他にも優先度取り出しや条件付き取り出し、リレーなど多くの機能を利用できるようです。
ひとまず、この機能だけで意の言語でSQLを発行すれば手軽にメッセージキューを利用できるというところはかなりお手軽であると思います。
ちょっと前まではThe Schwartzを使っていたのですが、Perl以外の言語で使うときやインストールのめんどくささなどからもう使っていません。
カラムにMySQLの型を使って様々な情報をつめられるので、工夫次第で様々な用途に利用することができそうです。
今後は具体的な使用例などを紹介したいと思います。

参考サイトなど

あわせて読みたい