Azure上でのMySQL(MariaDB)のクラスタ構成の方法を簡単にまとめました。
なぜクラスタを組むのか
AzureのIaaSは、メンテナンスでたまに止まることがあるので、ミッションクリティカルなシステムの場合クラスタを組んで絶対に止まらないようにする必要があります。
※定期メンテナンスで止まらないにしてもMySQLのプロセスが突然死した場合などを考慮するとどんな環境でもしっかりこういう仕組みは組んでおいたほうがいいですが。
組んでみる
MySQLクラスタといっても、所謂MySQLクラスタを組むとなるとそれなりに面倒なので今回は、MySQL互換のMariaDBを使ってMariaDB Galera Clusterを構築します。
余程のことがなければmysqldumpでダンプしたデータをMariaDBにインポートできるので移行も大変ではありません。
構築準備
とりあえずVMを3台Azureに立ち上げます。
スペックは、以下の感じで。
各インスタンスは、しっかり可用性セットに含めておきましょう。(含めていないと定期メンテで同時に落ちる可能性が出ます。)
インスタンスが立ち上がったら以下のポートを開けます。
4568番のポートは、通常状態では、開放していなくても動くみたいですが、開放していないと整合性チェック時にエラーを吐くので忘れずに開けておきましょう。
ついでにいつものことですが、SELinuxは、オフにしておきましょう。オフの仕方は、ここら辺参照
必要なソフトウェアのインストール
デフォルトでは、yumのリポジトリにMariaDBのリポジトリが含まれていないのでそれを追加します。
/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
ファイルができたら、yumをクリーンします。
sudo yum clean all
それをできたら以下のコマンドで必要なソフトをインストールします。
sudo yum -y install MariaDB-Galera-server MariaDB-client galera
ネットの資料だとrsyncもインストールするみたいな記述がある場合もありますが、OpenLogic 6.6には、rsyncがデフォルトで入っているので必要ありません。
問題なくインストールが終わったら必要なものは、全部インストール完了です。
設定ファイルの作成
必要なソフトがインストールで来たらあとは、設定を記述してクラスタを走らせるだけです。
設定には、各ノードのIPアドレスの指定が必要です。
今回は、以下のような感じとします。
- Node01 : 10.1.0.4
- Node02 : 10.1.0.5
- Node03 : 10.1.0.6
設定は、/etc/my.cnf.d/server/cnfに記述します。
まず必須のMySQLの設定です。中身の詳細は、このあたりを参照してください。
default_storage_engine=InnoDB binlog_format=ROW innodb_autoinc_lock_mode=2 innodb_locks_unsafe_for_binlog=1
次にGalera Cluster用の設定です。
wsrep_cluster_name=GALERA_CLUSTER wsrep_cluster_address=gcomm://10.1.0.5, 10.1.0.6 wsrep_node_address=10.1.0.4 wsrep_provider='/usr/lib64/galera/libgalera_smm.so' wsrep_sst_method=rsync wsrep_slave_threads=4
設定の内容は、全部[mysqld]以下に記述します。
設定項目の内容は以下の通りです。
- wsrep_cluster_name : クラスタにつける名前、クラスタ毎に決まった名前を記述します。
- wsrep_cluster_address : 参加するノードのIPアドレスを記述します。(自分のIPアドレス以外)
- wsrep_node_addresss : 自分のIPアドレスを指定します。
- wsrep_provider : ライブラリファイルを指定します。デフォルトだと記述の通りの場所にあるはずです。
- wsrep_sst_method : データを同期する際の方法を指定します。今回は、rsyncを使用します。
- wsrep_slave_threads : スレッド数を記述します。目安としては、CPUのコア数の2倍、書き込み接続数の1/4といったものがドキュメントにあります。(今回は適当)
クラスタを実行する
設定が全部で来たらあとは、実行するだけです。
一番最初のノードを実行する場合は、以下のコマンドです。
sudo service mysql start --wsrep cluster address=gcom://
一番最初のノードは、自分自身を初期ノードとするように実行時に明示的に指定しないとエラーになるのでaddress=gcom://の引数を指定します。
二つ目以降のノードは以下のコマンドで実行します。
service mysql start
ちなみに2つ目のノードの設定は、以下のような感じです。
wsrep_cluster_name=GALERA_CLUSTER wsrep_cluster_address=gcomm://10.1.0.4, 10.1.0.6 wsrep_node_address=10.1.0.5 wsrep_provider='/usr/lib64/galera/libgalera_smm.so' wsrep_sst_method=rsync wsrep_slave_threads=4
3つ目は以下のような感じ
wsrep_cluster_name=GALERA_CLUSTER wsrep_cluster_address=gcomm://10.1.0.4, 10.1.0.5 wsrep_node_address=10.1.0.6 wsrep_provider='/usr/lib64/galera/libgalera_smm.so' wsrep_sst_method=rsync wsrep_slave_threads=4
これで実行時にエラーが出たら、おそらくタイポとかだと思うのでログを確認しましょう。
ログは、デフォルトで
/var/lib/mysql/ノード名.err
に保存されているのでその中身を見ましょう。
unknown variable ~ とか出てるとたぶんタイポです。
Permission ~ とか出てるとたぶんSELinuxがオンになってるとかです。
試してみる
適当なNodeのMySQLにログインしてSQLを流し込んでみましょう。
とりあえずDBの生成
CREATE DATABASE Galera_Cluster;
Galera_ClusterのDBが生成されました。(Node01)
分かりづらいですが、Galera_ClusterのDBが別のNodeでも確認できます。(Node02)
まとめ
MySQlクラスタを組むよりもかなり簡単にクラスタ構成がとれるようになりました。
あとは、LBにノードをぶら下げて負荷分散とかをしてやれば基本的に24時間365日回り続ける強固なDBになります。(DCに同時多発的にミサイルが撃ち込まれた場合等は除く)
移行も楽(mysqldumpしてインポートするだけ) & 普通のMaster – Slave構成だと当たり前ですが止まる可能性は大いにあるので可能な限りこの構成を組むといいかと思われます。
※やっぱりクラスタ組むのめんどくさいしマネージドなDB使いたい