Relayの仕組み

Q4Mでは、Relayをq4m-forwardによって構築する。
参考になるのは、こちら。
http://d.hatena.ne.jp/kameid/20090128/1233112920

q4m-forwardは、インストールディレクトリ下のbinにあるはず…
$> /usr/local/mysql/bin/q4m-forward

このスクリプト自体は、perlなので読めば仕組みもわかる(はず)

で、ためしにやってみることにしました。
まず、データベースとテーブルを1組作ってみます。

mysql> create database q4m;
Query OK, 1 row affected (0.08 sec)

mysql> use q4m
Database changed
mysql> create table my_queue (v1 int not null, v2 varchar(255)) engine=queue;
Query OK, 0 rows affected (0.05 sec)

mysql> create database q4m_r;
Query OK, 1 row affected (0.02 sec)

mysql> use q4m_r
Database changed
mysql> create table my_queue_r (v1 int not null, v2 varchar(255)) engine=queue;
Query OK, 0 rows affected (0.01 sec)

次に、q4m-forwardでRelayの設定。
こんな感じで書いてみたんだけど、エラー・・・

# /usr/local/mysql/bin/q4m-forward "dbi:mysql:database=q4m;user=root;table=my_queue" "dbi:mysql:database=q4m_r;user=root;table=my_queue_r"

install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at (eval 3) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge.
at /usr/local/mysql/bin/q4m-forward line 30

perlのモジュールがたりないっぽいなーと思って下のパッケージをyumでインストール

# yum install perl-DBD-MySQL

ちょっとエラーが変わった。mysql.sockを指定しないといけないっぽい。

[root@localhost Takuya]# /usr/local/mysql/bin/q4m-forward "dbi:mysql:database=q4m;user=root;table=my_queue" "dbi:mysql:database=q4m_r;user=root;table=my_queue_r"
DBI connect('database=q4m;user=root','',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at /usr/local/mysql/bin/q4m-forward line 30
failed to connect to database: dbi:mysql:database=q4m;user=root

で、指定してみたら、次のエラー

[root@localhost Takuya]# /usr/local/mysql/bin/q4m-forward "dbi:mysql:database=q4m;mysql_socket=/tmp/
mysql.sock;user=root;table=my_queue" "dbi:mysql:database=q4m_r;mysql_socket=/tmp/mysql.sock;user=roo
t;table=my_queue_r"
DBD::mysql::db do failed: Binary logging not possible. Message: Statement cannot be logged to the binary log in row-based nor statement-based format at /usr/local/mysql/bin/q4m-forward line 92.
Binary logging not possible. Message: Statement cannot be logged to the binary log in row-based nor statement-based format at /usr/local/mysql/bin/q4m-forward line 92.

bin-logがいけないっぽいので、/etc/my.cnfの以下をコメントアウト&再起動

#log-bin=mysql-bin
#binlog_format=mixed

ようやくRelayが完成。Insertするたびに、Relay先のテーブルにデータが入る。

mysql> use q4m
Database changed
mysql> insert into my_queue values(2,'two!');
Query OK, 1 row affected (0.00 sec)

mysql> select * from my_queue;
Empty set (0.00 sec)

mysql> use q4m_r;
Database changed
mysql> select * from my_queue_r;

                            • +
v1 v2
                            • +
1 Hello!
2 two!
                            • +

2 rows in set (0.00 sec)