MariaDB を production 環境で利用する際はほぼ例外なくなんらかの高可用性(High Availability, HA)構成を組むと思います。MariaDBで最も高い可用性が要求される場合は自動フェールオーバ、multi-master synchronous replication の Galera Clusterを利用することになるかと思います。
なお、Azure では MariaDB のデータベースプロキシ MaxScale x 2ノード + 3ノード構成の Galera Clusterを2時間体験することができるようになっているようです。
https://mariadb.com/kb/en/library/mariadb-tx-cluster-in-azure-quick-guide/
https://azuremarketplace.microsoft.com/ja-jp/marketplace/apps/mariadb.cluster
MariaDB クラスタ構築
最も一般的なLinuxディストリビューションと思われる CentOS 7(RHEL 7)上で以下の構成を構築してみます。
- MaxScale node x 1
- Galera node x 3
なお,Galera Cluster では split brain が起きないようノード数は奇数(3, 5, 7...)である必要があります。
MariaDB 10.3 レポジトリ設定
以下のコマンドで自動的に MariaDB Server 10.3/MaxScale/各種ツールのレポジトリ設定ができます。
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
なお、Galera Cluster に属するノード、MaxScaleノードでレポジトリ設定は共通です。
MariaDB Server 10.3のインストール
yum -y install MariaDB-server
依存する MariaDB-client, galera も自動的にインストールされます。
Galera 関連設定
/etc/my.cnf または /etc/my.cnf.d/server.cnf の mysqld, galera セクションに以下のような設定を行います。この例では wsrep_sst_method=rsync を設定(デフォルト設定ですが)、rsync を用いて同期しています。なお、wsrep は write set replication の略で、SSTは State Snapshot Transfer の略です。
[mysqld]
binlog_format=row
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=2
log_error
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.2,192.168.1.3
galera_new_cluster によるクラスタ起動
CentOS 7 ではクラスタの最初のノードの起動コマンドが変更になっています。
galera_new_cluster
なお、2台目以降は通常の起動方法です。
systemctl start mariadb
MaxScale の設定
MaxScaleのインストールは以下のコマンドで行います。
yum -y install maxscale
/etc/maxscale.cnf に以下のような設定を行います。ポート3306でread/write splitterへの接続を待ち受けします。
[maxscale]
threads=auto
log_warning=1
log_info=1
log_notice=1
log_debug=1
[Galera-Monitor]
type=monitor
module=galeramon
servers=galera1,galera2,galera3
user=maxadmin
passwd=maxpwd
monitor_interval=5000
[Splitter-Service]
type=service
router=readwritesplit
servers=galera1,galera2,galera3
user=maxadmin
passwd=maxpwd
[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=mariadbclient
port=4006
############################################################################
[galera1]
type=server
address=192.168.2.11
port=3306
protocol=mariadbbackend
[galera2]
type=server
address=192.168.2.12
port=3306
protocol=mariadbbackend
[galera3]
type=server
address=192.168.2.13
port=3306
protocol=mariadbbackend
また、MaxScale用に maxadminというユーザを作成しています。いずれかのノードでユーザ作成すれば他のノードにも複製されます。
CREATE USER maxadmin@'%' IDENTIFiED BY 'maxpwd';
GRANT SELECT ON mysql.user TO maxadmin@'%';
GRANT SELECT ON mysql.db TO maxadmin@'%';
GRANT SELECT ON mysql.tables_priv TO maxadmin@'%';
GRANT SHOW DATABASES ON *.* TO maxadmin@'%';
MaxScale を起動します。
systemctl start maxscale
maxctrl list servers
galera_new_cluster で最初のノードが起動した状態で maxctrl list servers を実行すると、以下のように各ノードのステータスが確認できます。
# maxctrl list servers
┌─────────┬──────────────┬──────┬─────────────┬─────────────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera1 │ 192.168.1.11 │ 3306 │ 0 │ Master, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera2 │ 192.168.1.12 │ 3306 │ 0 │ Down │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera3 │ 192.168.1.13 │ 3306 │ 0 │ Down │ │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘
ここで、2台めのノードで MariaDB サーバを起動すると
systemctl start mariadb
maxctrl list servers の出力は以下のように変わります。
# maxctrl list servers
┌─────────┬──────────────┬──────┬─────────────┬─────────────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera1 │ 192.168.1.11 │ 3306 │ 0 │ Master, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera2 │ 192.168.1.12 │ 3306 │ 0 │ Slave, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera3 │ 192.168.1.13 │ 3306 │ 0 │ Down │ │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘
(galera2 が Master になる場合もあります)
3台目のノードでも MariaDB サーバを起動すると以下のようになります。
# maxctrl list servers
┌─────────┬──────────────┬──────┬─────────────┬─────────────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera1 │ 192.168.1.11 │ 3306 │ 0 │ Master, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera2 │ 192.168.1.12 │ 3306 │ 0 │ Slave, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera3 │ 192.168.1.13 │ 3306 │ 0 │ Slave, Synced, Running │ │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘
フェイルオーバーのテスト
ここで、便宜上のMaster(Galera Clusterはmulti-masterのため、全ノード masterですが、deadlock回避のため MaxScaleでは1ノードのみmasterとしています)となっている galera1 を reboot してみます。
# maxctrl list servers
┌─────────┬──────────────┬──────┬─────────────┬─────────────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera1 │ 192.168.1.11 │ 3306 │ 0 │ Down │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera2 │ 192.168.1.12 │ 3306 │ 0 │ Master, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera3 │ 192.168.1.13 │ 3306 │ 0 │ Slave, Synced, Running │ │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘
galera1 のステータスが Down になり、galera2 が Masterに昇格しました。しばらくして galera1 が復旧すると、 galera1 が Master に戻りました。
# maxctrl list servers
┌─────────┬──────────────┬──────┬─────────────┬─────────────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera1 │ 192.168.1.11 │ 3306 │ 0 │ Master, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera2 │ 192.168.1.12 │ 3306 │ 0 │ Slave, Synced, Running │ │
├─────────┼──────────────┼──────┼─────────────┼─────────────────────────┼──────┤
│ galera3 │ 192.168.1.13 │ 3306 │ 0 │ Slave, Synced, Running │ │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘