作っておぼえるHAシステム3

DRBDのインストールと設定が終わりましたので、PacemakerをインストールしてMariaDBのHAクラスタを仕上げます。

Pacemakerのインストール

yum コマンドで PacemakerとCorosyncをインストールします。リポジトリの設定はDRBDのインストールで行っていますので、次のコマンドでPacemaker 1.1.21がインストールできます。

[root@node1 ~]# yum install corosync pacemaker crmsh
読み込んだプラグイン:fastestmirror, linbit
Loading mirror speeds from cached hostfile
* base: mirror.aktkn.sg
* extras: download.nus.edu.sg
* updates: ftp-srv2.kddilabs.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ corosync.x86_64 0:2.4.5.linbit-1.44.c245.el7 を インストール
.....

crmshはcrmコマンドのパッケージです。LINBITのリポジトリではcrmshを独自に保守しており、RHEL8、CentOS8向けにもcrmコマンドが公開されています。

yumコマンドの実行が終わるとPacemakerとCorosync、crmコマンドが使えるようになります。

Corosyncの設定

Corosyncは設定ファイル(/etc/corosync/corosync.conf)を定義して設定します。最低限の設定は次のようになります。

[root@node1 ~]# cat /etc/corosync/corosync.conf
totem {
    version: 2
    cluster_name: cluster2
    secauth: off
    transport: udpu
    rrp_mode: passive
}

nodelist {
    node {
        ring0_addr: 10.5.0.1
        ring1_addr: 10.5.1.1
        nodeid: 1
    }

    node {
        ring0_addr: 10.5.0.2
        ring1_addr: 10.5.1.2
        nodeid: 2
    }
}

quorum {
    provider: corosync_votequorum
    two_node: 1
}

logging {
    to_logfile: yes
    logfile: /var/log/cluster/corosync.log
    to_syslog: yes
}

Corosyncではノード間の死活監視を2つのネットワークを利用します。
nodelist{..}のnode{..}にring0_addr、ring1_addrの定義があるのはそれぞれのネットワークの設定値になります。

Corosyncの起動

Corosyncは単独で起動することができません。systemctlコマンドでPacemakerを起動すると連動して起動する仕組みになっています。

[root@node1 ~]# systemctl start pacemaker

このsystemctlコマンドはnode1、node2両方のノードで実行します。

[root@node2 ~]# systemctl start pacemaker

Corosyncがちゃんと起動されたかはcorosync-cfgtoolで確認します。”status = ring X active with no faults”と表示されれば問題ありません。

[root@node1 ~]# corosync-cfgtool -s
Printing ring status.
Local node ID 1
RING ID 0
	id	= 10.5.0.1
	status	= ring 0 active with no faults
RING ID 1
	id	= 10.5.1.1
	status	= ring 1 active with no faults

Corosyncが正常に起動すると、Pacemakerの関連プロセスも起動するので、psコマンドで確認してみて下さい。(fオプションをつけて実行します。)

[root@node1 ~]# ps axf
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        S<     0:00  \_ [kworker/0:0H]
    6 ?        S      0:02  \_ [ksoftirqd/0]
    7 ?        S      0:00  \_ [migration/0]
  .....
  .....
 1314 ?        Ss     0:00 /usr/libexec/postfix/master -w
 1319 ?        S      0:00  \_ qmgr -l -t unix -u
29411 ?        S      0:00  \_ pickup -l -t unix -u
24474 ?        SLsl   3:24 corosync
14911 ?        Ss     0:00 /usr/sbin/pacemakerd -f
14912 ?        Ss     0:00  \_ /usr/libexec/pacemaker/cib
14913 ?        Ss     0:00  \_ /usr/libexec/pacemaker/stonithd
14914 ?        Ss     0:00  \_ /usr/libexec/pacemaker/lrmd
14915 ?        Ss     0:00  \_ /usr/libexec/pacemaker/attrd
14916 ?        Ss     0:00  \_ /usr/libexec/pacemaker/pengine
14917 ?        Ss     0:00  \_ /usr/libexec/pacemaker/crmd
[root@node1 ~]# 

Pacemaker 1.1.21の場合、pacemakerdの子プロセスとしてcibやstonithd、lrmdなどが起動していることがわかります。

MariaDBのインストール

MariaDBを両ノードでインストールします。

[root@node1 ~]# yum install mariadb-server -y
読み込んだプラグイン:fastestmirror, linbit
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mariadb-server.x86_64 1:5.5.68-1.el7 を インストール
.....
.....
インストール:
  mariadb-server.x86_64 1:5.5.68-1.el7                                                          

依存性関連をインストールしました:
  mariadb.x86_64 1:5.5.68-1.el7                  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7   
  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7    perl-DBD-MySQL.x86_64 0:4.023-6.el7            
  perl-DBI.x86_64 0:1.627-4.el7                  perl-Data-Dumper.x86_64 0:2.145-3.el7          
  perl-IO-Compress.noarch 0:2.061-2.el7          perl-Net-Daemon.noarch 0:0.48-5.el7            
  perl-PlRPC.noarch 0:0.2020-14.el7             

完了しました!

インストール後、起動して動作を確認して下さい。

[root@node1 ~]# systemctl start mariadb
[root@node1 ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2020-12-17 20:37:01 JST; 1min 9s ago
  Process: 21080 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 21045 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 21079 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           ├─21079 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─21244 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb...

12月 17 20:36:58 node1.sios.com systemd[1]: Starting MariaDB database server...
12月 17 20:36:58 node1.sios.com mariadb-prepare-db-dir[21045]: Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.
12月 17 20:36:59 node1.sios.com mysqld_safe[21079]: 201217 20:36:59 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
12月 17 20:36:59 node1.sios.com mysqld_safe[21079]: 201217 20:36:59 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
12月 17 20:37:01 node1.sios.com systemd[1]: Started MariaDB database server.

起動確認ができたら停止します。

[root@node1 ~]# systemctl stop mariadb

停止を忘れると、PacemakerでMariaDBを起動したときにエラーになります。

データベースのデータをDRBDで管理

MariaDBのデータをDRBDでレプリケーションします。node1で/var/lib/mysqlの中にあるファイルをDRBDのデバイスにコピーします。/dev/drbd0を一時的に/mntにマウントしてここにファイルをコピーします。

[root@node1 ~]# drbdadm primary r0
[root@node1 ~]# mount /dev/drbd0 /mnt
[root@node1 ~]# cp -afpv /var/lib/mysql/* /mnt
[root@node1 ~]# umount /mnt
[root@node1 ~]# drbdadm secondary r0

Pacemakerの設定登録

crmコマンドを使ってPacemakerの設定を読み込みます。設定をcib.txtというファイルにしてcrmからロードすると確実に設定できます。

[root@node1 ~]# cat cib.txt 
primitive res_drbd_r0 ocf:linbit:drbd \
	params drbd_resource=r0 \
	op start interval=0 timeout=240 \
	op stop interval=0 timeout=100
primitive res_fsmnt Filesystem \
	params device="/dev/drbd0" directory="/var/lib/mysql" fstype=xfs options=noatime \
	op start interval=0 timeout=60 \
	op stop interval=0 timeout=60
primitive res_ipadr IPaddr2 \
	params ip=192.168.3.50 cidr_netmask=24 nic=enp0s3 \
	op start interval=0 timeout=20 \
	op stop interval=0 timeout=20 \
	op monitor interval=10 timeout=20
primitive res_mysql mysql \
	params binary="/usr/bin/mysqld_safe" \
	op start interval=0 timeout=120 \
	op stop interval=0 timeout=120 \
	op monitor interval=20 timeout=30
group rg_mariadb res_ipadr res_fsmnt res_mysql
ms ms_drbd_r0 res_drbd_r0 \
	meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation c_mariadb inf: rg_mariadb ms_drbd_r0:Master
location l_mariadb rg_mariadb 100: node1.sios.com
order o_mariadb inf: ms_drbd_r0:promote rg_mariadb:start
property cib-bootstrap-options: \
	stonith-enabled=false \
	no-quorum-policy=ignore
rsc_defaults rsc-options: \
	resource-stickiness=200

このファイルをcrmコマンドを使って読み込みます。

[root@node1 ~]# crm configure load replace cib.txt

しばらくすると、PacemakerがMariaDBをnode1.sios.comで起動します。

Pacemakerにはcrm_monという監視のツールがあるので、これを使って動作を確認してます。

[root@node1 ~]# crm_mon -frAD1

Online: [ node1.sios.com node2.sios.com ]

Full list of resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node1.sios.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node1.sios.com
     res_mysql	(ocf::heartbeat:mysql):	Starting node1.sios.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node1.sios.com ]
     Slaves: [ node2.sios.com ]

Node Attributes:
* Node node1.sios.com:
    + master-res_drbd_r0              	: 10000     
* Node node2.sios.com:
    + master-res_drbd_r0              	: 10000     

Migration Summary:
* Node node1.sios.com:
* Node node2.sios.com:

node1でDRBDがPrimaryになり、ファイルシステムが/var/lib/mysqlにマウントされ、MariaDBが起動したことがわかります。