4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

2台でHA構築 (CentOS7)

Last updated at Posted at 2019-09-26

今回の構成

  • 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
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?