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

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になっちゃいました。。。


名無しのエンジニア
初心者でも分かるRailsで始めるHeroku入門 その2 知って損しないadd onとgem
Redis Sentinelを運用してみたお話