仕事でMariaDBによく触れるようになったので、自宅でも環境を構築しておくことにした。
で、当然DBなので中のデータが飛ぶと非常にまずいわけで、冗長性やバックアップを取得して備えておくわけなんだけど、MariaDBではGaleraClusterというクラスタが利用できる。

GaleraClusterは、マルチマスタで動作するクラスタで、組み込まれているノード全てで同じデータを保有、各ノードからデータベースの更新を行わせる事もできる。
だから、(極端な話)ディスク障害で3台中1台しかノードが生き残らなくても、そこからデータを復元させることも出来るのだ。

なお、各ノード間の連携はTCP/IPで行われているので、疎通が取れる環境であることが前提となる。
今回は、GaleraClusterの推奨が3台以上のノードでの構成のため、そのように構築する。
基本的に、以下の手順は3台全てで実施する必要がある。

1.インストール

今回はyumを使ってインストールを行う。こ
まずは、以下のコマンドでMariaDBのリポジトリを登録する。

cat << EOS > /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl=http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOS

次に、以下のコマンドでMariaDBおよびGaleraClusterをインストールする。

yum --enablerepo=mariadb install -y MariaDB-Galera-server MariaDB-client galera

2.設定

まず、余計な動作をされないようにSELinuxとfirewalldを停止しておく。

# SELinuxの無効化
setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config

# firewalldの無効化
systemctl stop firewalld
systemctl disable firewalld

次に、MariaDBの設定ファイルの設置フォルダである「/etc/my.cnf.d/」配下にある、server.cnfという名称で設定ファイルを作成する。
以下、設定例。

[galera]
# required
default_storage_engine = InnoDB       # データベースエンジン(基本デフォルト)
binlog_format = ROW                   # バイナリログのフォーマット(ROW以外不可)
log-bin = /var/lib/mysql/binlog       # バイナリログのPATH
log-slave-updates                     # バイナリログを各マスタノードで共有にする
innodb_autoinc_lock_mode = 2          # 自動ロックのモード。詳細はhttps://dev.mysql.com/doc/refman/5.6/ja/innodb-auto-increment-configurable.html
datadir = /var/lib/mysql              # MariaDBのデータディレクトリ

# connections
max_connections = 256                 # 最大同時コネクション数
max_allowed_packet = 8M               # 最大パケット容量
skip-name-resolve                     # ホスト名解決を行わない
max_connect_errors = 1000000          # 最大接続エラー回数
wait_timeout = 300                    # 最大の接続アイドル時間(秒)
bind-address = 0.0.0.0                # 接続を行わせるサーバのIPアドレス(本設定では制限無し)

# galera
wsrep_cluster_name = DBCLUSTER        # GaleraClusterの名前
wsrep_provider = '/usr/lib64/galera/libgalera_smm.so'
wsrep_sst_method = rsync              # 各クラスタの連携方法の指定
wsrep_cluster_address = gcomm://DBサーバ1のIPアドレス,DBサーバ2のIPアドレス,DBサーバ3のIPアドレス
wsrep_slave_threads = 8               # スレッド数の指定。目安はCPUコア数の2倍か、書き込み接続数の1/4が適正とのこと
wsrep_node_address = 自身のIPアドレス

# log
expire_logs_days = 1                  # バイナリログの自動削除日数
slow_query_log = ON                   # スローログクエリの有効・無効
long_query_time = 1                   # スローログクエリとする処理秒数の指定
log_warnings = 1                      # エラーログにWARNINGも出力
log_error="/var/lib/mysql/error.log"  # エラーログのPATH

# other
character-set-server = utf8           # 文字コードの指定
collation-server = utf8_general_ci    # 文字コードの指定
skip-character-set-client-handshake   # クライアントの設定に関係なしに指定した文字コードで返す
wsrep_auto_increment_control=OFF      # GaleraClusterのauto incrementで、ノード数の増減を自動調整させるかどうか

3.プロセスの起動

さて、設定ファイルの記述が終わったら、プロセスを起動してみよう。
最初の1台めについては、以下のコマンドで起動出来る。

service mysql bootstrap

2台め以降は、以下のコマンドで起動させる。

service mysql start

これで、GaleraClusterが動作する。
各ノードでmysqlにログインし、以下のコマンドを実行し、GaleraClusterが動作している事を確認する。

mysql -u root -e "show status like 'wsrep_local_index';"
[root@BS-PUB-GALERA-01 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 2     |
+-------------------+-------+

[root@BS-PUB-GALERA-02 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

[root@BS-PUB-GALERA-03 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

各ノードで重複していないようであれば、GaleraClusterは正常に動作していると考えて良いだろう。
なお、GaleraClusterの仕様上、ユーザやパスワードは全てのノードで共通となるので、ユーザを作ったりパスワード変更する場合は1ノードからのみ実行する必要がある点に注意。