2台でHA構築 (CentOS7)

* [2台でHA構築 (CentOS6.9) 2018年追記 - Qiita](https://qiita.com/tukiyo3/items/162e131007365fc4fe80) をベースに CentOS7 での設定方法を確認した。

## 今回の構成

* CentOS 7.7 1908 x86_64
* 192.168.100.62 (db1)
* 192.168.100.63 (db2)

```go:version
CentOS7.7 x86_64

pacemaker-1.1.18
corosync-2.4.4
crmsh-2.1.9

drbd84-utils-9.6.0
kmod-drbd84-8.4.11
```

## 準備

* https://osdn.net/projects/linux-ha/releases/p14670
    * pacemaker-repo-1.1.19-1.1.el7.x86_64.rpm
* [CentOS 7 で Pacemaker を利用する場合の注意点 « Linux-HA Japan](http://linux-ha.osdn.jp/wp/archives/4798)

> CentOS 7 上で Pacemaker リポジトリパッケージを利用する場合は、必ず NetworkManager-config-server パッケージをインストールしてください。インストール後は一旦 NetworkManager を再起動してください。 

```sh:NetworkManagerが起動していることを確認
$ rpm -qa NetworkManager
NetworkManager-1.18.0-5.el7.x86_64

$ systemctl status NetworkManager
```

![スクリーンショット_2019-09-20_10-20-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/892178bb-2ced-0518-a869-da3789855be3.png)

* ネットワークの設定は`nmtui`を使うと簡単。

----


----

## OS周り

```sh:selinuxとiptablesを無効
# Enableの場合、無効化する。Disabledになっていれば次へ。
getenforce
# selinux次回起動時から無効
sed -i -e 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# iptable無効
systemctl stop firewalld
systemctl disable firewalld

reboot
```

### Linux-HAのパッケージをインストール

* [リリース [1-01] Pacemakerリポジトリパッケージ (RHEL7) 1.1.19-1.1 - Linux-HA Japan - OSDN](https://ja.osdn.net/projects/linux-ha/releases/70298)

```
rpm -ivh pacemaker-repo-1.1.19-1.1.el7.x86_64.rpm
```

パッケージが競合するので除外

```diff:/etc/yum.repos.d/CentOS-Base.repo
  [base]
+ exclude=pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents

  [updates]
+ exclude=pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents
```

パッケージ インストール

```sh
yum install -y {corosync,pacemaker}.x86_64 crmsh
```

### /etc/corosync/corosync.conf

```nginx:/etc/corosync/corosync.conf

totem {
        version: 2
        crypto_cipher: none
        crypto_hash: none
        interface {
                ringnumber: 0
                bindnetaddr: 192.168.100.0
                mcastport: 5405
                ttl: 1
        }
        transport: udpu
}
logging {
        fileline: off
        to_logfile: yes
        to_syslog: no
        logfile: /var/log/cluster/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
                subsys: QUORUM
                debug: off
        }
}
nodelist {
        node {
                ring0_addr: 192.168.100.62
                nodeid: 1
        }
        node {
                ring0_addr: 192.168.100.63
                nodeid: 2
        }
}
quorum {
        provider: corosync_votequorum
        expected_votes: 2
        two_node: 1
}
```

* reboot

### pacemaker起動

```sh:起動
sudo systemctl start pacemaker
```

```sh:クラスタ状態確認
sudo /usr/sbin/crm_mon -A
```


```sh:OS起動時にpacemakerを起動
sudo systemctl enable pacemaker
```

### master/standby 切替

```sh:
crm node standby

# master/standby切り替わったことを確認してから以下

crm node online
```

----

## crm設定

```sh:2台中1台ダウン時の設定
# STONITH無効化
crm configure property \
  stonith-enabled=false

# quorum無効化 (ノードの数が半分以下になったときはクラスタとしてサービス提供不可と見なすが2台構成で1台落ちたらその状態になるので無効化)
crm configure property \
  no-quorum-policy=ignore

# ノード復帰時に自動でリソースを元のノード上に移そうとするのを止める
crm configure rsc_defaults \
  resource-stickiness=100
```

```sh:設定ファイルのsyntaxチェック
/usr/sbin/crm_verify -L -V
```

```sh:show
crm configure show
```

## DRBD

```sh
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

yum history sync
```

```sh:インストール
yum install -y drbd84-utils kmod-drbd84
```

### 設定(/dev/vda2)

```nginx:/etc/drbd.d/r0.res
resource r0
{
    protocol C;
    net{
        # 書き込みパフォーマンス向上
        max-buffers 8000;
        max-epoch-size 8000;
        # TCP送信バッファの自動調整をする
        sndbuf-size 0;
    }
    syncer {
        # drbdadm verify用
        verify-alg sha1;
        rate 80M;
    }
    meta-disk internal;
    device /dev/drbd1;
    disk /dev/vdb;

    on db1.local {
        address 10.0.1.62:7788;
    }
    on db2.local {
        address 10.0.1.63:7788;
    }
}
```

```:/etc/hosts
192.168.100.62  db1
192.168.100.63  db2
```

* `nmtui`にてホスト名をdb1.localやdb2.localに設定されていることを確認。
* reboot

## create-md

```sh
# 初期化
dd if=/dev/zero of=/dev/vdb bs=1M count=100

# 両方のサーバーで実施
drbdadm -c /etc/drbd.conf create-md r0
drbdadm up r0

cat /proc/drbd
```

```
mkdir /var/lib/mysql/
```

```sh:DRBDデバイスの初期化(時間かかる)
# Primary側でのみ実施
drbdadm -- --overwrite-data-of-peer primary r0
```

```sh:
mkfs.ext4 /dev/drbd1
```

```sh:
# Primary側でのみ実施
mkfs.ext4 /dev/drbd1
mount /dev/drbd1 /var/lib/mysql/
```

```sh:/etc/fstab
/dev/drbd1      /var/lib/mysql  ext4 defaults,noauto,nofail 1 1
```

```sh:
# drbd primary / secondary 切り替え

# db1をsecondaryにする
umount /var/lib/mysql/
drbdadm secondary r0

# db2をprimaryにする
drbdadm primary r0
mount /dev/drbd1 /var/lib/mysql/
```

### crmにdrbdリソースを追加

```sh:r0
crm configure primitive \
  drbd_mysql ocf:linbit:drbd \
  params drbd_resource="r0" \
  op monitor interval="15s"
```

```sh:Master-Slave構成
crm configure ms \
  ms_drbd_mysql drbd_mysql \
  meta master-max="1" master-node-max="1" \
  clone-max="2" clone-node-max="1" \
  notify="true"
```

```sh:mount(/varlib/mysql)
crm configure primitive \
  fs_mysql ocf:heartbeat:Filesystem \
  params device="/dev/drbd1" \
  directory="/var/lib/mysql" \
  fstype="ext4"
```


### crmにip設定を追加

```sh:IPaddr2(192.168.100.65を割り当て)
crm configure primitive \
  ip_mysql ocf:heartbeat:IPaddr2 \
  params ip="192.168.100.65" \
  cidr_netmask="24" nic="eth0" iflabel="0"
```

### 最終設定

* `crm configure edit`

```sh
node 1: db1.local \
	attributes standby=off
node 2: db2.local \
	attributes standby=off

primitive MySQL2 mysql \
	params binary="/opt/mysql/bin/mysqld_safe" client_binary="/opt/mysql/bin/mysql" config="/etc/mysql/db2/my.cnf" datadir="/var/lib/mysql/db2" log="/var/lib/mysql/logs/db2/mysql.err" pid="/var/run/mysqld/db2.pid" socket="/var/run/mysqld/mysqld.sock2" \
	op monitor interval=60s \
	meta target-role=Started
primitive MySQLData ocf:linbit:drbd \
	params drbd_resource=r0 \
	op monitor interval=15s
primitive MySQLFS Filesystem \
	params device="/dev/drbd1" directory="/var/lib/mysql" fstype=ext4
primitive ip_mysql IPaddr2 \
	params ip=192.168.100.65 cidr_netmask=24 nic=eth0 iflabel=0
group MySQLGroup MySQLFS ip_mysql MySQL2
ms MySQLDataClone MySQLData \
	meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation mysql_on_drbd inf: MySQLGroup MySQLDataClone:Master
order MySQL2-after-MySQLFS inf: MySQLFS MySQL2
order MySQLFS-after-MySQLData inf: MySQLDataClone:promote MySQLGroup:start

property cib-bootstrap-options: \
	have-watchdog=false \
	dc-version=1.1.19-1.el7-c3c624e \
	cluster-infrastructure=corosync \
	stonith-enabled=false \
	no-quorum-policy=ignore
rsc_defaults rsc-options: \
	resource-stickiness=100

```

![スクリーンショット_2019-09-26_10-45-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e7933bf6-2cda-a329-5e6f-52b1dad3fde9.png)


## mysqlのRPMをインストール


## mysql初期設定

```sh
sudo -s

# 2台とも同じGIDにするため
groupadd -g 518 mysql
useradd -u 518 -g mysql -d /opt/mysql \
 -s /sbin/nologin mysql

mkdir -p \
 /opt/mysql/var/ \
 /var/lib/mysql/db2/ibdata/ \
 /var/lib/mysql/logs/db2/ibdata/ \
 /var/run/mysqld/

chown -R mysql:mysql \
 /opt/mysql/var/ \
 /var/lib/mysql/ \
 /var/run/mysqld/
```

### my.cnf

* /etc/my.cnf

```apache
[client]
user     = root
#password = xxxxxxxx
port     = 3306
socket   = /var/run/mysqld/mysqld.sock2

[mysqld]
user     = mysql
#bind-address = 192.168.xx.xx
port     = 3306
datadir  = /opt/mysql/var/
socket   = /var/run/mysqld/mysqld.sock2
# 200MB
max_binlog_size = 200000000
log-bin         = /var/lib/mysql/logs/db2/db2-bin
log-bin-index   = /var/lib/mysql/logs/db2/db2-bin.index

default-character-set=sjis

log=/tmp/query.log
log-long-format
```

### 初回起動

```sh:初回設定
/opt/mysql/bin/mysqld_safe \
  --defaults-file="/etc/my.cnf" \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql

/opt/mysql/bin/mysql_install_db \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql
```


### 起動

* mysql_start.sh

```sh:mysql_start.sh(起動)
/opt/mysql/bin/mysqld_safe \
  --defaults-file="/etc/my.cnf" \
  --datadir=/var/lib/mysql/db2/ \
  --user=mysql
```

```
sudo sh mysql_start.sh
```

### 停止

* mysql_stop.sh

```sh:mysql_stop.sh(停止)
/opt/mysql/bin/mysqladmin \
  -S /var/run/mysqld/mysqld.sock2 shutdown -uroot
```

```sh
sh mysql_start.sh
```

## ベンチマーク

```sh
yum install -y perl-DBI perl-DBD-MySQL

cd /opt/mysql/sql-bench

./run-all-tests \
 --server=mysql \
 --cmp=mysql,pg,solid \
 --user=root \
 --socket=/var/run/mysqld/mysqld.sock2 \
 --log
```