Home > コンピュータ > MySQL Binlog APIを試してみる

MySQL Binlog APIを試してみる

MySQLのレプリケーションは素晴らしい仕組みなのですが、ちょっと凝ったことをしようとするには機能が限られています。特に、MySQLの更新を他のデータストアにマイグレーションしたいような時は、Triggerを使って超頑張るのはイマイチで、バイナリログを使ったレプリケーションの仕組みをそのまま拡張してマイグレーションするようなワーカーを書きたくなるものです。

そんな時に使える便利なAPIとして、Binlog APIというものがあります。まだ開発途上ではありますが、期待の持てるAPIです。

試しにどんなもんなのか使ってみました。

追記 2012/07/09

とか言ってたら、さっそく @tokuhirom さんがPerlバインディングを作ってくれました!!!

早速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

情報ありがとうございます!

コメントフォーム
Remember personal info

トラックバック: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...

Home > コンピュータ > MySQL Binlog APIを試してみる

Banners
クリエイティブ・コモンズ・ライセンス track feed
Feeds

Return to page top