LoginSignup
22

More than 3 years have passed since last update.

MariaDB 高可用性構成 : Galera Cluster

Last updated at Posted at 2017-12-16

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22