mariadb
Galera
MariaDB10
GaleraCluster

MariaDB 高可用性構成 : Galera Cluster

MariaDB を production 環境で利用する際はほぼ例外なくなんらかの高可用性(High Availability, HA)構成を組むと思います。MariaDBで最も高い可用性が要求される場合は自動フェールオーバ、multi-master synchronous replication の Galera Cluster(TX 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

MariaDB 10.2 レポジトリ設定

以下のコマンドで自動的に MariaDB Server 10.2/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(TX Cluster) に属するノード、MaxScaleノードでレポジトリ設定は共通です。

MariaDB Server 10.2のインストール

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

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="galera_test_cluster"
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.2,192.168.1.3
wsrep_node_address=192.168.1.1
server_id=1
wsrep_sst_method=rsync
gtid_ignore_duplicates=1

galera_new_cluster によるクラスタ起動

CentOS 7 ではクラスタの最初のノードの起動コマンドが変更になっています。

galera_new_cluster 

なお、2台目以降は通常の起動方法です。

systemctl start mariadb

MaxScale の設定

MaxScaleのインストールは以下のコマンドで行います。

yum -y install maxscale

/etc/maxscale.cnf に以下のような設定を行います。ポート4006でread/write splitterへの接続を待ち受けします。

[maxscale]
threads=auto

[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
max_slave_connections=100%
router_options=slave_selection_criteria=LEAST_CURRENT_OPERATIONS

[Debug-Interface]
type=service
router=debugcli

[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=MySQLClient
port=4006

[Debug-Listener]
type=listener
service=Debug-Interface
protocol=telnetd
port=4442

[MaxAdmin]
type=service
router=cli

[MaxAdmin-Unix-Listener]
type=listener
service=MaxAdmin
protocol=maxscaled
socket=default

[MaxAdmin-Inet-Listener]
type=listener
service=MaxAdmin
protocol=maxscaled
address=localhost
port=6603
############################################################################
[galera1]
type=server
address=192.168.1.1
port=3306
protocol=mariadbbackend

[galera2]
type=server
address=192.168.1.2
port=3306
protocol=mariadbbackend

[galera3]
type=server
address=192.168.1.3
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

maxadmin list servers

galera_new_cluster で最初のノードが起動した状態で maxadmin list servers を実行すると、以下のように各ノードのステータスが確認できます。

# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
galera1            | 192.168.1.1     |  3306 |           0 | Master, Synced, Running
galera2            | 192.168.1.2     |  3306 |           0 | Down
galera3            | 192.168.1.3     |  3306 |           0 | Down
-------------------+-----------------+-------+-------------+--------------------

ここで、2台めのノードでMariaDB サーバを起動すると

systemctl start mariadb

maxadmin list server の出力は以下のように変わります。

# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
galera1            | 192.168.1.1     |  3306 |           0 | Slave, Synced, Running
galera2            | 192.168.1.2     |  3306 |           0 | Master, Synced, Running
galera3            | 192.168.1.3     |  3306 |           0 | Down
-------------------+-----------------+-------+-------------+--------------------

(galera1がMasterの場合もあります)

3台目のノードでもMasriaDBサーバを起動すると以下のようになります。

# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
galera1            | 192.168.1.1     |  3306 |           0 | Slave, Synced, Running
galera2            | 192.168.1.2     |  3306 |           0 | Master, Synced, Running
galera3            | 192.168.1.3     |  3306 |           0 | Slave, Synced, Running
-------------------+-----------------+-------+-------------+--------------------

フェイルオーバーのテスト

ここで、便宜上Masterとなっているgalera2をrebootしてみます。

# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
galera1            | 172.24.119.235  |  3306 |           0 | Slave, Synced, Running
galera2            | 172.24.119.236  |  3306 |           0 | Down
galera3            | 172.24.119.237  |  3306 |           0 | Master, Synced, Running
-------------------+-----------------+-------+-------------+--------------------

galera2 のステータスが Down になり、galera3 が Masterに昇格しました。しばらくして galera2 が復旧しても galera3 が Master のままになっています。

# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
galera1            | 192.168.1.1     |  3306 |           0 | Slave, Synced, Running
galera2            | 192.168.1.2     |  3306 |           0 | Slave, Synced, Running
galera3            | 192.168.1.3     |  3306 |           0 | Master, Synced, Running
-------------------+-----------------+-------+-------------+--------------------