Edited at

2台でHA構築 (CentOS7)


今回の構成


  • CentOS 7.7 1908 x86_64

  • 192.168.100.62 (db1)

  • 192.168.100.63 (db2)


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



準備


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



NetworkManagerが起動していることを確認

$ rpm -qa NetworkManager

NetworkManager-1.18.0-5.el7.x86_64

$ systemctl status NetworkManager


スクリーンショット_2019-09-20_10-20-00.png


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




OS周り


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のパッケージをインストール

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

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


/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

パッケージ インストール

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


/etc/corosync/corosync.conf


/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起動


起動

sudo systemctl start pacemaker



クラスタ状態確認

sudo /usr/sbin/crm_mon -A



OS起動時にpacemakerを起動

sudo systemctl enable pacemaker



master/standby 切替

crm node standby

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

crm node online



crm設定


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



設定ファイルのsyntaxチェック

/usr/sbin/crm_verify -L -V



show

crm configure show



DRBD

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


インストール

yum install -y drbd84-utils kmod-drbd84



設定(/dev/vda2)


/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

# 初期化

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/


DRBDデバイスの初期化(時間かかる)

# Primary側でのみ実施

drbdadm -- --overwrite-data-of-peer primary r0

mkfs.ext4 /dev/drbd1

# Primary側でのみ実施

mkfs.ext4 /dev/drbd1
mount /dev/drbd1 /var/lib/mysql/


/etc/fstab

/dev/drbd1      /var/lib/mysql  ext4 defaults,noauto,nofail 1 1


# 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リソースを追加


r0

crm configure primitive \

drbd_mysql ocf:linbit:drbd \
params drbd_resource="r0" \
op monitor interval="15s"


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"


mount(/varlib/mysql)

crm configure primitive \

fs_mysql ocf:heartbeat:Filesystem \
params device="/dev/drbd1" \
directory="/var/lib/mysql" \
fstype="ext4"


crmにip設定を追加


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

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


mysqlのRPMをインストール


mysql初期設定

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

[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


初回起動


初回設定

/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


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


mysql_stop.sh(停止)

/opt/mysql/bin/mysqladmin \

-S /var/run/mysqld/mysqld.sock2 shutdown -uroot

sh mysql_start.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