以前書いた「PacemakerでMySQLレプリケーション構成」のCentOS7+MariaDB環境用です。
CentOS7になってMySQLがMariaDBになったこと、pcsコマンドのオプションが若干変更になっていることが主な変更点になります。
最近のmysqlリソースエージェントでは、MySQLデータベースをMaster/Slaveセットとして構成することができます。
DRBD同様、TakeoverによってReplicationのMaster/Slaveを入れ替えることが可能となります。
ということで、CentOS 7のPacemakerを使ってMariaDBデータベースをMaster/Slaveセットとして構成してみました。
セットアップする環境は以下になります。PacemakerとCorosync一式はCentOS提供のパッケージをインストールしクラスター構成済みです。
- 1号機:pcmk11 (CentOS 7.0.1406 x86_64)
- 2号機:pcmk12 (CentOS 7.0.1406 x86_64)
レプリケーションの設定
まずはPacemaker範囲外で、MariaDBをインストールしてレプリケーションを構成します。ただしCHANGE MASTER TOは実施しません。
MariaDBのレプリケーション構成手順の詳細は公式ドキュメントを参照してください。
https://mariadb.com/kb/en/mariadb/setting-up-replication/
MariaDBのインストールおよび設定
MariaDBをインストールし設定します。
[root@pcmk11 ~]# yum -y install mariadb-server [root@pcmk11 ~]# vi /etc/my.cnf
/etc/my.cnfは[mysqld]セクションに以下を追加します。server-idは1とします。
log-bin=mariadb-bin server-id=1
2号機も同様です。
[root@pcmk12 ~]# yum -y install mysql-server [root@pcmk12 ~]# vi /etc/my.cnf
/etc/my.cnfは[mysqld]セクションに以下を追加します。server-idは2とします。
log-bin=mariadb-bin server-id=2
レプリケーションユーザーの作成
1号機側のみで作業します。まずMySQLを起動します。
[root@pcmk11 ~]# systemctl start mariadb.service
レプリケーションユーザーを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'slavepass';
アクセス元をもっと厳格に限定したい場合は、ホスト部分を環境にあわせて設定してください。
mysqlリソースエージェントでは、通常のレプリケーション以外にもread-onlyに切り替える権限をもったユーザーが必要になるため、localhostでもレプリケーションユーザーを作成します。
mysql> GRANT PROCESS, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, RELOAD ON *.* TO 'repl'@'localhost' IDENTIFIED BY 'slavepass';
ユーザーを作成したら反映します。
mysql> FLUSH PRIVILEGES;
これらの権限が必要な理由についてはリソースエージェントで以下のように説明されています。
<parameter name="replication_user" unique="0" required="0"> <longdesc lang="en"> MySQL replication user. This user is used for starting and stopping MySQL replication, for setting and resetting the master host, and for setting and unsetting read-only mode. Because of that, this user must have SUPER, REPLICATION SLAVE, REPLICATION CLIENT, and PROCESS privileges on all nodes within the cluster. Mandatory if you define a master-slave resource. </longdesc> <shortdesc lang="en">MySQL replication user</shortdesc> <content type="string" default="${OCF_RESKEY_replication_user_default}" /> </parameter>
MariaDBを停止してデータベースファイル一式を2号機にコピーします。
[root@pcmk11 ~]# systemctl stop mariadb.service [root@pcmk11 ~]# ssh pcmk12 rm -rf /var/lib/mysql [root@pcmk11 ~]# tar cf - -C /var/lib mysql | ssh pcmk12 tar xpvf - -C /var/lib/
クラスターリソースのセットアップ
最初にSlaveとして稼働させる2号機をStandbyにします。
[root@pcmk12 ~]# pcs cluster standby pcmk12
クラスターリソースを登録します。
[root@pcmk11 ~]# pcs cluster cib mysql_repl [root@pcmk11 ~]# pcs -f mysql_repl resource create mysql ocf:heartbeat:mysql [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql binary=/usr/bin/mysqld_safe [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql datadir=/var/lib/mysql [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql log=/var/log/mariadb/mariadb.log [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql pid=/run/mariadb/mariadb.pid [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql replication_user=repl [root@pcmk11 ~]# pcs -f mysql_repl resource update mysql replication_passwd=slavepass [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql start interval=0 timeout=120s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql stop interval=0 timeout=120s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql monitor interval=20s timeout=30s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql monitor interval=10s role=Master timeout=30s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql monitor interval=30s role=Slave timeout=30s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql promote interval=0 timeout=120s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql demote interval=0 timeout=120s [root@pcmk11 ~]# pcs -f mysql_repl resource op add mysql notify interval=0 timeout=90s [root@pcmk11 ~]# pcs cluster cib-push mysql_repl
operation timeoutの設定はmysql RAの推奨値を設定しています。
Master/Slaveセットを作成します。
[root@pcmk11 ~]# pcs resource master mysql-clone mysql master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
クラスターリソースを開始します。
[root@pcmk11 ~]# pcs resource start mysql-clone
1号機がMasterとして起動します。
[root@pcmk11 ~]# crm_mon -1 Last updated: Fri Mar 7 01:26:21 2015 Last change: Fri Mar 7 09:49:24 2015 via crm_attribute on pcmk11 Stack: corosync Current DC: pcmk11 (1) - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured 2 Resources configured Node pcmk12: standby Online: [ pcmk11 ] Master/Slave Set: mysql-clone [mysql] Masters: [ pcmk11 ] Stopped: [ mysql:1 ] [root@pcmk11 ~]#
2号機のStandbyを解除します。
[root@pcmk11 ~]# pcs cluster unstandby pcmk12
2号機がSlaveのレプリケーション構成としてMySQLが起動します。
[root@pcmk11 ~]# crm_mon -1 Last updated: Fri Mar 7 01:26:21 2015 Last change: Fri Mar 7 00:49:24 2015 via crm_attribute on pcmk11 Stack: corosync Current DC: pcmk11 (1) - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured 2 Resources configured Online: [ pcmk11 pcmk12 ] Master/Slave Set: mysql-clone [mysql] Masters: [ pcmk11 ] Slaves: [ pcmk12 ] [root@pcmk11 ~]#
起動時の/var/log/mariadb/mariadb.logを確認すると、CHANGE MASTER TOが実行されていることがわかります。
Version: '5.5.41-MariaDB-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server 150306 9:51:04 [Note] Slave SQL thread initialized, starting replication in log 'mariadb-bin.000001' at position 1435816, relay log '/var/lib/mysql/mariadb-relay-bin.000002' position: 1436102 150306 9:51:04 [Note] Slave I/O thread: connected to master 'repl@pcmk11:3306',replication started in log 'mariadb-bin.000001' at position 1435816
あとはpcs cluster standby pcmk11コマンドでMaster側をStandbyにするとMasterが切り替わります。
Masterが切り替わったらpcs cluster unstandby pcmk11してStandby解除するとpcmk11はSlaveとして稼働を開始します。
また、cib.xmlを見てみるとバイナリログの位置情報がcluster_property_setとして記録されていることがわかります。
<cluster_property_set id="mysql_replication"> <nvpair id="mysql_replication-mysql_REPL_INFO" name="mysql_REPL_INFO" value="pcmk11|mariadb-bin.000002|245"/> </cluster_property_set>
人手で確認してCHANGE MASTER TOを実行する必要がないため、セットアップも非常に楽になります。