MariaDB 高可用性構成 : Galera Cluster 

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
```

https://mariadb.com/kb/en/library/mariadb-package-repository-setup-and-usage/

なお、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というユーザを作成しています。いずれかのノードでユーザ作成すれば他のノードにも複製されます。

```sql
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  │      │
└─────────┴──────────────┴──────┴─────────────┴─────────────────────────┴──────┘
```