仕事で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ノードからのみ実行する必要がある点に注意。