CentOS7 2台でレプリケーション

CentOS7 2台でレプリケーション

* [pacemaker » gmt-24.net](http://gmt-24.net/archives/tag/pacemaker)
* [Building a high-available failover cluster with Pacemaker, Corosync & PCS | Jensd's I/O buffer](http://jensd.be/?p=156)
* [インフラ構築手順書 PaceMaker環境の構築・運用で使うコマンド集](http://infra.blog.shinobi.jp/Entry/107/)

を実践した。

## corosync.conf

* [corosync - CentOS7 3台でクラスタ構築、仮想IPを体験 - Qiita](http://qiita.com/tukiyo3/items/3f8b99be73798df857fd)の2ノード版。


```diff:corosync.conf
  quorum {
        provider: corosync_votequorum
        expected_votes: 2
+       two_node: 1
  }
```

# MariaDBの設定 
## server-idをそれぞれ一意に定義

```diff:(n1)/etc/my.cnf.d/my_custom.cnf
+ log-bin=mysql-bin
+ relay-log=relay-bin

+ server-id=1
```

```bash:(n2)
server-id=2
```

## (n1)ひな形作成

```bash:mariadb起動
systemctl start mariadb
```

```sql:レプリケーション用ユーザを作成
-- 他のサーバからアクセスできるようにレプリケーション用ユーザを作成
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%' IDENTIFIED BY 'tieP7iLu';

-- 読み取り専用に切り替えるためにlocalhostにもユーザを作成
GRANT SUPER,REPLICATION SLAVE,REPLICATION CLIENT,PROCESS ON *.* TO 'repl'@'localhost' IDENTIFIED BY 'tieP7iLu';

-- 設定反映
FLUSH PRIVILEGES;
```

* パスワードは同じものにしておく。

```bash:mariadb停止
systemctl stop mariadb
```

## n1の/var/lib/mysql/をn2にコピー


### (n1)圧縮

```bash:(n1)圧縮
tar czf ~/mysql.tar.gz /var/lib/mysql
```

### (n2)転送

```bash:転送n1->n2
scp n1:mysql.tar.gz ~
```

```bash:(n2)削除
rm -rf /var/lib/mysql/
```

```bash:(n2)解凍
tar xzf ~/mysql.tar.gz
mv ~/var/lib/mysql/ /var/lib/
```

----

# (n1)pacemakerの設定

## n2はStandbyにしておく(Slaveとして稼働させるため)

```bash:
pcs cluster standby n2
```


## (n1)cib編集

```bash:現在の設定をファイルに保存
pcs cluster cib mysql_repl
```

```bash:コマンドが長いのでalias
alias cib="pcs -f mysql_repl resource"
```

```bash:設定
cib create mysql ocf:heartbeat:mysql \
    binary=/usr/bin/mysqld_safe \
    pid=/var/run/mariadb/mariadb.pid
    
cib update mysql replication_user=repl
cib update mysql replication_passwd=tieP7iLu

cib op add mysql start interval=0 timeout=120s
cib op add mysql stop interval=0 timeout=120s

cib op add mysql monitor interval=20s timeout=30s
cib op add mysql monitor interval=10s role=Master timeout=30s
cib op add mysql monitor interval=30s role=Slave timeout=30s

cib op add mysql promote interval=0 timeout=120s
cib op add mysql demote interval=0 timeout=120s
cib op add mysql notify interval=0 timeout=90s
```

> Error: add_operation has been deprecated, please use 'op add'

これだけ注意。

```bash:設定反映
pcs cluster cib-push mysql_repl
```

## (n1)Master/Slave設定を作成

```bash:
pcs resource master mysql-clone mysql \
    master-max=1 master-node-max=1 \
    clone-max=2 clone-node-max=1 notify=true
```

```bash:設定にエラーがないか確認
# crm_verify -L -V
   error: unpack_resources: 	Resource start-up disabled since no STONITH resources have been defined
   error: unpack_resources: 	Either configure some or disable STONITH with the stonith-enabled option
   error: unpack_resources: 	NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
```

```bash:stonith-enabledを無効にしないとエラー扱いになる
pcs property set stonith-enabled=false
```

```bash:エラーがないことを確認。
# crm_verify -L -V
```

```bash:ignore&nbsp;low&nbsp;quorum
pcs property set no-quorum-policy=ignore
pcs property
```

## mysqlリソースの起動を確認


```bash:
pcs resource enable mysql
```

```bash:
# pcs resource
...
 Master/Slave Set: mysql-clone [mysql]
     Masters: [ n1 ]
     Stopped: [ n2 ]
...
```

```bash:他ノードのスタンバイ状態の解除
pcs cluster unstandby --all
```


```bash:
# pcs resource
...
 Master/Slave Set: mysql-clone [mysql]
     Masters: [ n1 ]
     Slaves: [ n2 ]
...
```

## MariaDB master/slave確認


```mysql:
SHOW BINLOG EVENTS\G
SHOW MASTER STATUS;
```

```mysql:Master_Host値を確認
SHOW SLAVE STATUS\G
```

```mysql:その他
START SLAVE;
STOP SLAVE;
```

* その他参考: [MySQL レプリケーションのセットアップ手順 - わくわく技術ランド](http://wadslab.net/wiki/index.php?MySQL%20%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A4%CE%A5%BB%A5%C3%A5%C8%A5%A2%A5%C3%A5%D7%BC%EA%BD%E7)


# トラブルシューティング

## mysqlのSlaveが起動してこない

> 〜 'unknown error' (1): 〜

* `pcs resource enable mysql`しても起動できない。

```bash:状態確認
# pcs resource failcount show mysql
Failcounts for mysql
 n2: INFINITY
```

```bash:エラー解除
# pcs resource failcount reset mysql
# pcs resource failcount show mysql
```

`n2`をOS再起動するとSlaveが起動してくる。

* ログは`/var/log/mysqld.log`に出力されます。


@takehironetさんからご指摘いただきました。

> resourceのfailcountのリセットはfailcount resetで良いと思います。cleanupはresource直下のサブコマンドだったかと(ご確認ください)

## 気づいた点

* レプリケーションの障害時、復旧まで手作業で１時間はかかる予感がするので`DRBD`が良い気がしてきた。