Pacemaker+CorosyncでMySQL(MariaDB)のMaster/Slave構成

# インストール
CentOS 7です。

```
yum install corosync paceaker pcs mysql-server
```

# Corosyncの設定
以下の設定を、両ノードで行う。

```text:/etc/corosync/corosync.conf
totem {
	version: 2
	
	crypto_cipher: none
	crypto_hash: none

	interface{
		ringnumber:0

		bindnetaddr: 192.168.10.0 # ネットワークアドレス
		mcastport: 5405
		ttl: 1
	}
	transport: udpu
}

nodelist {
	node{
		ring0_addr: hostname1 # ホスト名1
		nodeid: 1
	}
		
	node{
		ring0_addr: hostname2 # ホスト名2
		nodeid: 2
	}
}

logging {
	fileline: off
	to_syslog: yes
	to_logfile: yes
        logfile: /var/log/cluster/corosync.log
	debug: off
	timestamp: on
	logger_subsys {
		subsys: QUORUM
		debug: off
	}
}

quorum {
	provider: corosync_votequorum
	expected_votes: 2
}
```

```
# firewall-cmd --add-port=5405/udp --permanent
# firewall-cmd --add-port=2224/tcp --permanent
# systemctl enable corosync
# systemctl enable pacemaker
# systemctl enable pcsd
```

一旦rebootする。
`# pcs status`で動作していることを確認する。
`# passwd hacluster`でクラスタの認証用ユーザhaclusterのパスワードを設定する。

### クラスタの認証
両方のノードで認証を行い、`# pcs status`で確認する。PCSD StatusがOnlineになっていればOK。

```
# pcs cluster auth <ホスト1> <ホスト2> -u hacluster -p <password> --force
```

# MySQL (MariaDB)の設定
ホスト1ではserver-id=1、ホスト2ではserver-id=2で設定します。

```text:etc/my.cnf
[mysqld]
log-bin=mariadb-bin
server-id=1
```

### レプリケーションユーザの作成
ホスト1のみ。DBを起動してユーザを作成します。

```
# systemctl start mariadb.service
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'slavepass';
mysql> GRANT SUPER,REPLICATION SLAVE,REPLICATION CLIENT,PROCESS ON *.* TO 'repl'@'localhost' IDENTIFIED BY 'slavepass';
mysql> FLUSH PRIVILEGES;
```

DBを停止してデータベースファイル一式をホスト2にコピーします。

```
# systemctl stop mariadb.service
# ssh <ホスト2> rm -rf /var/lib/mysql
# tar cf - -C /var/lib mysql | ssh <ホスト2> tar xpvf - -C /var/lib/
```

# クラスターリソースの設定
最初にSlaveとして稼働させるホスト2をStandbyにした後、リソースを登録します。

```
# pcs cluster standby <ホスト2>
# pcs cluster cib mysql_repl
# pcs -f mysql_repl resource create mysql ocf:heartbeat:mysql
# pcs -f mysql_repl resource update mysql binary=/usr/bin/mysqld_safe
# pcs -f mysql_repl resource update mysql datadir=/var/lib/mysql
# pcs -f mysql_repl resource update mysql log=/var/log/mariadb/mariadb.log
# pcs -f mysql_repl resource update mysql pid=/run/mariadb/mariadb.pid
# pcs -f mysql_repl resource update mysql replication_user=repl
# pcs -f mysql_repl resource update mysql replication_passwd=slavepass
# pcs -f mysql_repl resource op add mysql start interval=0 timeout=120s
# pcs -f mysql_repl resource op add mysql stop interval=0 timeout=120s
# pcs -f mysql_repl resource op add mysql monitor interval=20s timeout=30s
# pcs -f mysql_repl resource op add mysql monitor interval=10s role=Master timeout=30s
# pcs -f mysql_repl resource op add mysql monitor interval=30s role=Slave timeout=30s
# pcs -f mysql_repl resource op add mysql promote interval=0 timeout=120s
# pcs -f mysql_repl resource op add mysql demote interval=0 timeout=120s
# pcs -f mysql_repl resource op add mysql notify interval=0 timeout=90s
# pcs cluster cib-push mysql_repl
```

Master/Slaveセットの作成し、クラスターリソースを開始します。

```
pcs resource master mysql-clone mysql master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
pcs resource start mysql-clone
```

ホスト1の起動確認後ホスト2を起動します。

```
pcs cluster unstandby <ホスト2>
```

# フェイルオーバ確認
`pcs cluster standby <ホスト1>`でMaster側をStandbyにするとMasterがホスト2に切り替わることを確認します。
Masterが切り替わったら`pcs cluster unstandby <ホスト1>`でStandby解除するとホスト1はSlaveとして稼働を開始するはずです。

# 参考
- [PacemakerでMySQLレプリケーション構成 – CentOS7+MariaDB編](http://gmt-24.net/archives/tag/pacemaker)