表題の通り、galeraにslaveくっつけて、slave側をmroongaとして使ってみる。
構成は以下の通り。
---------- ---------- ---------- galera01 <-----> galera02 <-----> galera03 IP:192.168.35.11 IP:192.168.35.12 IP:192.168.35.13 ---------- ---------- ---------- | |(replication) | ---------- slave01 IP:192.168.35.14 ----------
この構成の利点は以下の通り。
- mroongaをストレージモード/ラッパーモードで使う際に発生する問題点を解決可能
- galeraで行うことで、レプリケーションフェイルオーバ誤検知問題を回避できる。
1については、
・ストレージモードで扱うと、そもそもトランザクションに対応していない問題
・ラッパーモードで扱うと、rollback時にfulltextインデックスの再構築が必要になる問題
を解決できる。
2については、
・レプリケーションを多段にさせた場合、フェイルオーバを誤検知する可能性がある問題
※maxscaleのfailover toporogyを見ると、多段レプリケーションには対応していないようである。
※他のフェイルオーバツールとして、mrmは未検証、orchestoratorはMariaDBへ対応していない?ように見えた。
を解決できる。
さらに、galeraにしておくことで、masterをどこに向けても簡単に整合性が取れる。
現状では、slave01のmasterはgalera01になっているが、galera02をmasterとして向けてもよい。
これは、GTID(※ここではGlobal Transaction IDを指しています。Galera Transaction IDではありません。)が、
galeraクラスター間で同期が取られているためである。
簡単ながら、mroongaを構築する流れを記載します。
ここでは上記構成は構築済みとします。
・galera01
まずは、innoDBのテーブルを作成する。
[MariaDB]> create table news ( id integer not null, search text not null, primary key(id) ) ENGINE=InnoDB;
作成すると、galera02、galera02、slave01にも伝播する。
・slave01
以下のDDLでテーブル定義を修正する。
[MariaDB]> ALTER TABLE news ENGINE=Mroonga; [MariaDB]> CREATE FULLTEXT INDEX news_fidx01 ON news(search); [MariaDB]> show create table news; +-------+---------------- | Table | Create Table | +-------+---------------- | news | CREATE TABLE `news` ( `id` int(11) NOT NULL, `search` text NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `news_fidx01` (`search`) ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4 | +-------+---------------- 1 row in set (0.000 sec)
これで、galera01でnewsテーブルにデータを登録すると、
slave01側では全文検索が可能になる。
※galera02、galera03に登録しても、slave01側に伝播します。
もし、「gtid_strict_mode」というMariaDB10.3から追加されたパラメータの値を1にしていたら、
slaveのDDL流し込み時に、slave01サーバで本パラメータを一時的に無効化しておきましょう。
[MariaDB]> SET GLOBAL gtid_strict_mode=0;
この「gtid_strict_mode」というのは、レプリケーションでの整合性を取るのに優れたパラメータである。
slaveサーバにおいて、
gtid_binlog_pos > gtid_slave_pos
を許さないためのパラメータであり、gtid_strict_mode=1のままだと、
slaveの独自DDL/DMLによって、レプリケーションが停止してしまうためです。
あとは、slave側で、
[MariaDB]> select * from news where match(search) against('+金額');
のような全文検索クエリーが利用できる。
以上