表題の通り、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('+金額');
のような全文検索クエリーが利用できる。
以上