- 2台でHA構築 (CentOS6.9) 2018年追記 - Qiita をベースに 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
準備
-
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
CentOS 7 上で Pacemaker リポジトリパッケージを利用する場合は、必ず NetworkManager-config-server パッケージをインストールしてください。インストール後は一旦 NetworkManager を再起動してください。
NetworkManagerが起動していることを確認
$ rpm -qa NetworkManager
NetworkManager-1.18.0-5.el7.x86_64
$ systemctl status NetworkManager
- ネットワークの設定は
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
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