- 2012-07-08 (日) 13:30
- コンピュータ
MySQLのレプリケーションは素晴らしい仕組みなのですが、ちょっと凝ったことをしようとするには機能が限られています。特に、MySQLの更新を他のデータストアにマイグレーションしたいような時は、Triggerを使って超頑張るのはイマイチで、バイナリログを使ったレプリケーションの仕組みをそのまま拡張してマイグレーションするようなワーカーを書きたくなるものです。
そんな時に使える便利なAPIとして、Binlog APIというものがあります。まだ開発途上ではありますが、期待の持てるAPIです。
試しにどんなもんなのか使ってみました。
追記 2012/07/09
とか言ってたら、さっそく @tokuhirom さんがPerlバインディングを作ってくれました!!!
- tokuhirom/MySQL-BinLog · GitHub
- mysql の binlog api を利用するための Perl Binding を作りました –
"><xmp>TokuLog - tokuhirom's blog.
早速XS童貞の私ですがコード読み込んで使ってみようとおもいます!tokuhirom++
各言語のエキスパートのみなさま、引き続き他言語のバインディングもお待ちしています!(ぇ
追記 2012/07/10
antipopさんがMacでの動かし方を紹介してくれています!
準備
CentOS5系の64bitで試した手順です。まずビルドに必要なパッケージを入れたいのですが、CentOSのyumレポジトリだと足りないのでepelとatrpmasというレポジトリを追加します。
# cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
# cat /etc/yum.repos.d/atrpms.repo
[atrpms]
name=Redhat Enterprise Linux $releasever - $basearch - ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
enabled=0
gpgcheck=1
gpgkey=http://atrpms.net/RPM-GPG-KEY.atrpms
どちらもenabled=0にしてるので明示的にenabledしないとyumコマンドが検索しないようにしてます。
あとはyum実行するだけ。bzrはソースのチェックアウト用、cmakeはビルドツール、boostはCentOSの1.33だとバージョンが古いのでatrpmsのものを利用。epelにboost141ってのがあるのでそれでもいけるのかも(未確認)。
# yum --enablerepo=epel install cmake bzr
# yum --disablerepo=* --enablerepo=atrpms install boost*
ちなみに、atrpmsのboost-develとCentOS-Baseのboost-develはファイル被ってるみたいで、atrpmsの64bitのが入った後にCentOS-Baseの32bitのが入るとビルドできなくなる。キモイだけなので32bitは入れないのが吉。僕が試した環境は最初から入ってなかった。
ビルド&インストール
簡単。
$ bzr branch lp:mysql-replication-listener
$ cd mysql-replication-listener
$ cmake .
$ make
$ sudo make install
これで/usr/local/includeにいくつかのヘッダファイルと、/usr/local/libにライブラリがインストールされます。
exampleビルド
ソースの中にexampleがあるのでそれを試してみます。
$ cd example
$ cmake .
$ make
これでbasic-[12]を実行したいところなんですが、僕の環境だと実はライブラリのサーチパスに/usr/local/libが入ってなかった。こういう場合は、サーチパスに足すか実行時に指定してあげる。
サーチパス追加の場合
$ sudo echo /usr/local/lib >> /etc/ld.so.conf
$ sudo ldconfig
$ ./basic-1
実行時に指定の場合
$ LD_LIBRARY_PATH=/usr/local/lib ./basic-1
or
$ LD_PRELOAD=/usr/local/lib/libreplication.so ./basic-1
Let’s example
では実際に試してみましょう。おもしろいのはbasic-2でmasterにつないで見るのだと思います。自分はとりあえずMySQL::Sandboxで実験。
$ make_replication_sandbox ~/mysql/mysql-5.1.63-linux-x86_64-glibc23.tar.gz
$ cat ~/sandboxes/rsandbox_mysql-5_1_63/master/my.sandbox.cnf
[client]
user = msandbox
password = msandbox
port = 28888
↑確認
$ ./basic-2 'mysql://msandbox:msandbox@127.0.0.1:28888'
SET PASSWORD FOR 'root''''localhost'='*6C387FC3893DBA1E3BA155E74754DA6682D04747'
grant all on *.* to msandbox'''127.%' identified by 'msandbox'
grant all on *.* to msandbox'''localhost' identified by 'msandbox'
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER,
SHOW DATABASES,CREATE TEMPORARY TABLES,LOCK TABLES, EXECUTE
on *.* to msandbox_rw'''localhost' identified by 'msandbox'
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER,
SHOW DATABASES,CREATE TEMPORARY TABLES,LOCK TABLES, EXECUTE
on *.* to msandbox_rw'''127.%' identified by 'msandbox'
grant SELECT,EXECUTE on *.* to msandbox_ro'''127.%' identified by 'msandbox'
grant SELECT,EXECUTE on *.* to msandbox_ro'''localhost' identified by 'msandbox'
grant REPLICATION SLAVE on *.* to rsandbox'''127.%' identified by 'rsandbox'
delete from user where password=''
delete from db where user=''
flush privileges
おおおおお!!!!普通にbinlogが読み込まれてQueryが表示されました。しかも、イベントループに入っていて、新しいbinlogを待ち構えています。では、別クライアントから更新文を発行してみます。
$ ~/sandboxes/rsandbox_mysql-5_1_63/master/use
> use test
> create table t1 (id int unsigned not null auto_increment, value varchar(255), primary key (id)) engine=InnoDB;
> begin;
> insert into t1 (value) values ("aaaa");
> insert into t1 (value) values ("bbbb");
> commit;
すると、先程のbasic-2の方にDDLが流れてくるのが見えると思います。トランザクションは当然commitして初めて流れてきます(basic-2がCOMMITはprintしてくれてないっぽい)。
create table t1 (id int unsigned not null auto_increment, value varchar(255), primary key (id)) engine=InnoDB
BEGIN
insert into t1 (value) values ("aaaa")
insert into t1 (value) values ("bbbb")
まとめ
というわけで、単にexampleを動かしてみただけですが、かなり夢が広がりますね。
しかし、C++力がない!願わくは、ワーカーっぽいものはLLで書きたい(既存アプリのライブラリが使えたりするでしょうし)ので、Binlog APIの各種LLへのバインディングが欲しいところです。誰か書いて!もしくは書き方教えて!
あとMacでboostの使い方がよく分からなかったので、Macで動いた人いたら動かし方教えてください><
参考
コメント:2
- とおりすがり 12-07-09 (月) 10:59
-
手元だとなぜか examples/CMakeFiles/basic-2.dir/link.txt に -lboost_system を追加しないとうごきませんでした(ubuntu)。
- riywo 12-07-10 (火) 0:33
-
情報ありがとうございます!
トラックバック:0
- このエントリーのトラックバックURL
- http://blog.riywo.com/2012/07/08/133005/trackback
- Listed below are links to weblogs that reference
- MySQL Binlog APIを試してみる from As a Futurist...

