宮﨑悟氏の「KUSANAGIでクラスタを組んでみよう」第3回
前回はファイル同期について説明しました。今回は、mariadbとGalera Cluster の組み合わせについて説明します。
Galera Clusterとは
Galera Clusterは、mysql5.x/mariadb上で稼働するActive-Activeクラスタ実装の一つです。複数ノード間のDB情報を同一の内容になるよう維持します。
かつてDBのクラスタといえば、Active-Stanby型のクラスタが殆どでした。Active-Standbyでは、DBデータをコピーしているだけのStandby機が必要です。そのため2台のマシンが必要で、切り替え時間も遅く、性能も1台のみの性能となります。
MySQL/mariadbの場合は、Replicaノードを使用した読み込み専用のノードを用意することができます。この場合Read動作(SELECT文など)の動作は早くできても、Write動作(INSERT/UPDATE文など)はMasterに集中します。そのためWrite動作の多いユースケースでは、Masterに負荷集中する問題があります。
Galera Clusterは、Active-Active型つまり全ノードがMasterとして動作するクラスタです。そのためRead/Write動作を全ノードで行うことができ、負荷分散やノード追加も可能です。Galera Clusterは全ノードをMasterとするため、ノード同士のDB情報に不整合が発生する可能性もあります。Galera Clusterでは、多数決方式でDB情報の不整合を解決します。多数決方式のため、構成ノードは3つ以上の奇数台であることが推奨されます。
KUSANAGIにおけるGalera Cluster構成
KUSANAGIでは、初期状態でGalera Clusterをインストールしています。ただし、Galera Clusterの設定を行っていないため、初期状態ではクラスタが組まれていません。
以下例では、3ノード構成での構成とします。
- node1(192.168.34.201)
- node2(192.168.34.202)
- node3(192.168.34.203)
node1
node1をクラスタのマスターとします。mariadbの設定ファイル /etc/my.cnf.d/server.conf の、 [galera] 以下に設定を追加します。
wsrep_on = on
wsrep_cluster_name = kusanagi
wsrep_provider= '/usr/lib64/galera/libgalera_smm.so'
wsrep_node_name = node1
wsrep_node_address = 192.168.34.201
wsrep_cluster_address = gcomm://
wsrep_auto_increment_control = on
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
max_allowed_packet = 8M
skip-name-resolve
wait_timeout = 60
重要な設定は以下のとおりです。
設定 | 説明 |
---|---|
wsrep_on | wsrep(Write set replication project)を有効にする マルチマスターの完全同期型のレプリカとします |
wsrep_cluster_name | クラスタ名を設定します |
wsrep_provider | データ同期用のプラグイン(libgalera_smm.so)を指定します |
wsrep_node_name | 自ノード名 |
wsrep_node_address | 自IPアドレス |
wsrep_cluster_address | クラスタを構成するIPアドレス |
binlog_format | バイナリログの動作をROWにします |
default_storage_engine | ストレージエンジンをInnoDBにします |
設定内容を補足します。
- wsrep_cluster_address
マスターとするノードでは、”gcomm://”飲みを指定しIPアドレスを指定しません。
ここでIPアドレスを指定すると、起動時に指定したIPアドレスを探そうとします。 - binlog_format
Galera Clusterではバイナリログをデータ同期に使用するため、ROWにすることが必要です。 - default_storage_engine
Galera Cluster は、MyISAMなどをサポートしません。
node2/node3
node2/node3はnode1の設定を元にしますが、以下の部分を変更します。
設定 | node2 | node3 |
---|---|---|
wsrep_node_name | node2 | node3 |
wsrep_node_address | 192.168.34.202 | 192.168.34.203 |
wsrep_cluster_address | gcomm://192.168.34.201,192.168.34.203 | gcomm://192.168.34.201,192.168.34.202 |
クラスタの起動
事前準備
全ノードでmysqlサービスを停止、無効にします。
sudo systemctl stop mysql
sudo systemctl disable mysql
node1起動
まずはマスターとなる node1から起動します。通常どうり起動します。
sytemctl start mysql
以前はsystemctlで起動させず、service mysql bootstrapを使用していました。ところがmariadbのサービスがsystemctlでの制御に変更され、この機能が使用できなくなりました。そこで、wsrep_cluster_addressのIPアドレスを指定しないことで、回避しています。
node2/node3起動
続いて node2/node3 も、通常通り起動します。
sytemctl start mysql
これによりnode1をベースとしてnode2/node3がクラスタに追加されます。
確認方法
以下の方法で確認できます。$DBROOTPASSはmysqlのrootユーザ用パスワードです。
mysql -uroot -p$DBROOTPASS -e "show status like 'wsrep_incoming_addresses';"
+--------------------------+-------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------+
| wsrep_incoming_addresses | 192.168.34.201:3306,192.168.34.202:3306,192.168.34.203:3306 |
+--------------------------+-------------------------------------------------------------+
3つのノードが含まれていることがわかります。
停止方法
通常通りsystemctl で停止します。
クラスタノード変更
ノード追加するときは、wsrep_cluster_addressに起動中のクラスタのIPアドレスを追加してmariadbを起動します。masterノードに障害が発生し再接続するときは、wsrep_cluster_addressを追加時と同様に設定する必要があります。
KUSANAGIでの適用
KUSANAGIでクラスタ構成する場合は、Galera Clusterの特性から3台以上の奇数構成を推奨します。Galera Clusterの設定および、/home/kusanagi 以下のディレクトリのlsync設定を行ってからkusanagi initを実行すると楽にクラスタ構成できると思います。
kusanagi provisionまで行ったら、/etc/kusanagi*および/etc/{httpd,nginx}/conf.d/プロファイル_*.conf を各ノードにコピーします。その後、WordPressなどの個別の設定をすると良いでしょう。
終わりに
これで、KUSANAGIでActive-Activeのクラスタを設定する事ができると思います。Galera Cluster のマスターノードが停止するのは起動時・障害時だけなので、運用で回避しましょう。回避できない場合は、WordPressの設定で外部のDBaaSを使うのも選択肢の一つです。運用時の手間など考えて決定して下さい。
今回提示した設定はあくまでもサンプルです。ユースケースによってはパフォーマンスチューニングの必要です。その際は、Galera Clusterを参考にしてください。
さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。