最近のmysqlリソースエージェントでは、MySQLデータベースをMaster/Slaveセットとして構成することができます。
DRBD同様、TakeoverによってReplicationのMaster/Slaveを入れ替えることが可能となります。
ということで、CentOS 6.4のPacemakerを使ってMySQLデータベースをMaster/Slaveセットとして構成してみました。
セットアップする環境は以下になります。PacemakerとCorosync一式はCentOS提供のパッケージをインストールしクラスター構成済みです。
- 1号機:pcmk11 (CentOS 6.4 x86_64)
- 2号機:pcmk12 (CentOS 6.4 x86_64)
レプリケーションの設定
まずはPacemaker範囲外で、MySQLをインストールしてレプリケーションを構成します。ただしCHANGE MASTER TOは実施しません。
MySQLのレプリケーション構成手順の詳細は公式ドキュメントを参照してください。
http://dev.mysql.com/doc/refman/5.1/ja/replication-howto.html
MySQLのインストールおよび設定
MySQLをインストールし設定します。
[root@pcmk11 ~]# yum -y install mysql-server
[root@pcmk11 ~]# vi /etc/my.cnf
/etc/my.cnfは[mysqld]セクションに以下を追加します。server-idは1とします。
log-bin=mysql-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=mysql-bin
server-id=2
レプリケーションユーザーの作成
1号機側のみで作業します。まずMySQLを起動します。
[root@pcmk11 ~]# service mysqld start
レプリケーションユーザーを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'slavepass';
アクセス元をもっと厳格に限定したい場合は、ホスト部分を環境にあわせて設定してください。
mysqlリソースエージェントでは、通常のレプリケーション以外にもread-onlyに切り替える権限をもったユーザーが必要になるため、localhostでもレプリケーションユーザーを作成します。
mysql> GRANT SUPER,REPLICATION SLAVE,REPLICATION CLIENT,PROCESS 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.
</longdesc>
<shortdesc lang="en">MySQL replication user</shortdesc>
<content type="string" default="${OCF_RESKEY_replication_user_default}" />
</parameter>
mysqlを停止してデータベースファイル一式を2号機にコピーします。
[root@pcmk11 ~]# service mysqld stop
[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 binary=/usr/bin/mysqld_safe pid=/var/run/mysqld/mysqld.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 add_operation mysql start interval=0 timeout=120s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql stop interval=0 timeout=120s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql monitor interval=20s timeout=30s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql monitor interval=10s role=Master timeout=30s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql monitor interval=30s role=Slave timeout=30s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql promote interval=0 timeout=120s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql demote interval=0 timeout=120s
[root@pcmk11 ~]# pcs -f mysql_repl resource add_operation mysql notify interval=0 timeout=90s
[root@pcmk11 ~]# pcs cluster push cib 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: Mon May 25 20:32:52 2013
Last change: Mon May 25 20:07:59 2013 via crm_attribute on pcmk11
Stack: classic openais (with plugin)
Current DC: pcmk11 - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
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: Mon May 25 20:46:52 2013
Last change: Mon May 25 20:16:59 2013 via crm_attribute on pcmk11
Stack: classic openais (with plugin)
Current DC: pcmk11 - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
2 Resources configured.
Online: [ pcmk11 pcmk12 ]
Master/Slave Set: mysql-clone [mysql]
Masters: [ pcmk11 ]
Slaves: [ pcmk12 ]
[root@pcmk11 ~]#
起動時の/var/log/mysqld.logを確認すると、CHANGE MASTER TOが実行されていることがわかります。
130525 21:07:40 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Compressed tables use zlib 1.2.3
130525 21:07:40 InnoDB: Initializing buffer pool, size = 128.0M
130525 21:07:41 InnoDB: Completed initialization of buffer pool
130525 21:07:41 InnoDB: highest supported file format is Barracuda.
130525 21:07:41 InnoDB Plugin 5.1.69 started; log sequence number 262393953
130525 21:07:41 [Note] Event Scheduler: Loaded 0 events
130525 21:07:41 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.69-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 Source distribution
130525 21:07:44 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='', master_port='3306', master_log_file='', master_log_pos='4'. New state master_host='pcmk11', master_port='3306', master_log_file='', master_log_pos='4'.
130525 21:07:44 [Note] Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log '/var/lib/mysql/mysql-relay.000001' position: 4
130525 21:07:44 [Note] Slave I/O thread: connected to master 'repl@pcmk11:3306',replication started in log 'FIRST' at position 4
あとはpcs cluster standby pcmk11コマンドでMaster側をStandbyにするとMasterが切り替わります。
Masterが切り替わったらpcs cluster unstandby pcmk11してStandby解除するとpcmk11はSlaveとして稼働を開始します。
また、cib.xmlを見てみるとバイナリログの位置情報がノードの属性として記録されていることがわかります。
<nodes>
<node id="pcmk12" uname="pcmk12">
<instance_attributes id="nodes-pcmk12">
<nvpair id="nodes-pcmk12-pcmk11-log-file-mysql" name="pcmk11-log-file-mysql" value="mysql-bin.000001"/>
<nvpair id="nodes-pcmk12-pcmk11-log-pos-mysql" name="pcmk11-log-pos-mysql" value="1320619"/>
</instance_attributes>
</node>
<node id="pcmk11" uname="pcmk11">
<instance_attributes id="nodes-pcmk11"/>
</node>
</nodes>
人手で確認してCHANGE MASTER TOを実行する必要がないため、セットアップも非常に楽になります。