mroongaをXtraDB Clusterで冗長化できそうなメモ

こんにちは、なんだかんだ言いながら、Galera ReplicationはPerconaによる実装であるXtraDB Clusterを選びたいDBAの田中です。
性能面ではMariaDB Galera Clusterの方が良かったんですが、発音した時にXtraDB Clusterの方がカッコイイやはりサービスに使う前提で調べるなら、安定版(MariaDB Galera Clusterは2013/02/28現在でRC版)ですよね!
wsrep-sst-method = xtrabackup
を前提として使うので、やり方も書いてあるPerconaを選んだというのもあります。
MariaDB Galera Clusterでも同じ手順で出来ると思うのですが、いまいちどうやって呼び出しているのかよく判らなかったので、名前がカッコイイ xtrabackupが確実に使える方を取ってみました。
さてそんなXtraDB Clusterなんですが、何かのはずみで「MySQLで全文高速検索 mroonga」をビルドしたら動いたというお話です。
URLは2013/02/28現在のものですのでよしなに。
まずはXtraDB Cluster本体をダウンロードしてきます。
どうせあとでソースコードが必要になるんですが、ソースコードからビルドするとlibgalera_smm.soを別途調達しなくてはいけないのでオールインワンの.tar.gzにしました。
$ wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/LATEST/binary/linux/x86_64/Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64.tar.gz $ tar xzf Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64.tar.gz $ cd Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64 $ ./scripts/mysql_install_db --datadir=./data --binlog-format=row $ cat << EOF > ./my.cnf [mysqld] wsrep-provider=`pwd`/lib/libgalera_smm.so wsrep-sst-method=rsync binlog-format=row wsrep-cluster-name=xtra innodb-autoinc-lock-mode=2 innodb-locks-unsafe-for-binlog=1 EOF $ ./bin/mysqld_safe --defaults-file=./my.cnf --wsrep-cluster-address=gcomm:// &
--wsrep-cluster-address=gcomm://<1台目のIPアドレス>
に変えて、2台目も同様に起動します。
$ bin/mysql -e "SHOW GLOBAL STATUS LIKE 'wsrep_incoming_addresses'" +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | wsrep_incoming_addresses | 192.168.199.135:3306,192.168.198.214:3306 | +--------------------------+-------------------------------------------+
2つのIPアドレスが列挙されればクラスターとして起動しています。
mroongaをコンパイルするためにXtraDB Clusterソースコードを取得します。
$ wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/LATEST/source/Percona-XtraDB-Cluster-5.5.29.tar.gz $ tar xzf Percona-XtraDB-Cluster-5.5.29.tar.gz
groonga-develはインストール済みと仮定して、mroongaのソースコードを取ってきます。
$ wget http://packages.groonga.org/source/mroonga/mroonga-3.01.tar.gz $ tar xzf mroonga-3.01.tar.gz $ cd mroonga-3.01 $ ./configure --with-mysql-source=../Percona-XtraDB-Cluster-5.5.29 --with-mysql-build=../Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64 --with-mysql-config=../Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64/bin/mysql_config $ make && sudo make install
ビルドできました(できると思っていませんでした)
$ cd ../Percona-XtraDB-Cluster-5.5.29-23.7.2.389.Linux.x86_64 $ bin/mysql -uroot -e "INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so'"
INSTALL PLUGINは勝手に同期されるので、片方だけで叩けば良いです。
さて。
mysql> USE test; mysql> CREATE TABLE test ( num INT UNSIGNED, test TEXT, PRIMARY KEY(num), FULLTEXT INDEX(test)) CHARACTER SET utf8 ENGINE = mroonga COMMENT="ENGINE = 'InnoDB'";
このとき、ラッパーモードを使ってInnoDBをラップしてやるようにします。
ストレージモードで使うと、クラスターノードでデータが同期されないのです(もともとInnoDB以外は同期されない)
mysql> INSERT INTO test VALUES (1,'今日は晴れ'),(2,'今日は曇り'),(3,'今日は雨'); mysql> SELECT * FROM test WHERE MATCH(test) AGAINST('晴れ');
もう片方のノードで叩いても結果が返ってきます。
(ストレージモードだと、反対側のノードにはそもそも行が1行も入っていません) まさか出来るとは思っていませんでした。
やってみるもんですね。
途中まで書いて放り投げている間に、MariaDB Galera ClusterがGAになっちゃいました。。。