MySQL(Q4M) + DRBD + HA(Pacemaker/corosync) 構築手順 (インストール編)
オンプレ環境でMySQL+DRBD+HA構成を検証する機会があり、クラウド全盛のタイミングだが低レイヤーの知見として作業記録メモを残す。
クラウドのマネージドサービスを使用した場合、クラウドベンダー範疇の為意識されてないが参考資料として共有。
基本となる構成は、サービスを提供する「アクティブサーバ」と、いざという時のために予備機として待機している「スタンバイサーバ」の2台で構成される「アクティブ/スタンバイ」型のHA環境です。
- 以下構築要件
◎ 導入〜動作確認までの手順
■ DRBD構成
● パーティション確認
[root@drbd01 ~]# fdisk -l ディスク /dev/sda: 32.2 GB, 32212254720 バイト ヘッド 255, セクタ 63, シリンダ 3916 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x0008a1d3 デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 * 1 66 524288 83 Linux パーティション 1 は、シリンダ境界で終わっていません。 /dev/sda2 66 334 2150400 82 Linux スワップ / Solaris パーティション 2 は、シリンダ境界で終わっていません。 /dev/sda3 334 3917 28781568 83 Linux ディスク /dev/sdb: 107.4 GB, 107374182400 バイト ヘッド 255, セクタ 63, シリンダ 13054 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000
●epelレポジトリ追加
[root@drbd01 ~]# yum install http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/elrepo-release-6-8.el6.elrepo.noarch.rpm
● DRBDインストール
[root@drbd01 ~]# yum install --enablerepo=elrepo drbd83 kmod-drbd83 [root@drbd01 ~]# rpm -qa | grep drbd drbd83-utils-8.3.16-1.el6.elrepo.x86_64 kmod-drbd83-8.3.16-3.el6.elrepo.x86_64
● /etc/hosts設定
[root@drbd01 ~]vi /etc/hosts 10.131.6.1 drbd01 10.131.6.2 drbd02
● /etc/drbd.confの作成
[root@drbd01 ~]# vi /etc/drbd.conf # You can find an example in /usr/share/doc/drbd.../drbd.conf.example #include "drbd.d/global_common.conf"; #include "drbd.d/*.res"; global { usage-count yes; } common { protocol C; startup { degr-wfc-timeout 0; } net { cram-hmac-alg sha1; shared-secret {shared-secret-key}; } disk { on-io-error detach; } syncer { rate 50M; } } resource r0 { on drbd01 { device /dev/drbd0; disk /dev/sdb; meta-disk internal; address 10.131.6.1:7788; } on drbd02 { device /dev/drbd0; disk /dev/sdb; meta-disk internal; address 10.131.6.2:7788; } }
※hostsで登録した名称とhostnameが一致しない場合、エラーで起動出来たい為、下記設定行う。
[root@localhost ~]# drbdadm create-md r0 'r0' ignored, since this host (localhost.localdomain) is not mentioned with an 'on' keyword. [root@localhost ~]# hostname drbd01 [root@localhost ~]# logout
● DRBDのメタデータを初期化
[root@drbd01 ~]# drbdadm create-md r0 Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. success
● 自動起動ONにする
[root@drbd01 ~]# chkconfig drbd on [root@drbd01 ~]# chkconfig --list drbd drbd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
● DRBDサービス起動
[root@drbd01 ~]# /etc/init.d/drbd start Starting DRBD resources: [ d(r0) s(r0) n(r0) ].......... *************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 0 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 12]:yes .
● DRBDサービス起動後のステータス確認
[root@drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
● Primary 昇格と DRBD 同期(drbd01) drbd01 を一時的に Primary へ昇格させます。
[root@drbd01 ~]# drbdadm -- --overwrite-data-of-peer primary r0
● DRBDのステータス確認
[root@drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C ... sync'ed: 0.3% (102116/102396)M
drbd01は"SyncSource"になっていることがわかる。
● DRBDのステータス確認(drbd02)
[root@drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C ... sync'ed: 0.6% (101856/102396)M
drbd02は"SyncTarget"になっていることがわかる。
● 同期完了後の状態確認
sync'ed: **% が同期の進捗状況。「Inconsistent/UpToDate」ステータスになってる。
同期完了後の状態「UpToDate/UpToDate」が表示される。
[root@drbd03 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C
● DRBD ボリュームのマウント(drbd01)
DRBD ボリュームにファイルシステムを作成します。
[root@drbd01 ~]# mkfs.ext4 /dev/drbd0 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 6553600 inodes, 26213591 blocks 1310679 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 800 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: ^@done This filesystem will be automatically checked every 29 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
● DRBDマウントポイント作成(drbd01)
[root@drbd01 ~]# mkdir /data [root@drbd01 ~]# mount -t ext4 /dev/drbd0 /data/ [root@drbd01 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 27G 2.7G 23G 11% / tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 ext4 488M 39M 425M 9% /boot /dev/drbd0 ext4 99G 60M 94G 1% /data
● DRBDのステータス確認
[root@drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /data ext4
■ 動作確認
● 適当なファイルをノードAで作成(primary(drbd01))
[root@drbd01 ~]# echo "DRBD TEST from Node A" > /data/test.txt [root@drbd01 ~]# cat /data/test.txt DRBD TEST from Node A
● 一旦、primary→secondaryへ切替
[root@drbd01 ~]# umount /data [root@drbd01 ~]# drbdadm secondary r0
● drbdのステータス確認
[root@drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary UpToDate/UpToDate C
※ここで、一旦ノードB(secondary(drbd02))で作業に切り替える
● ノードBでステータス確認(secondary(drbd02))の為、マウントする
[root@drbd02 ~]# mkdir /data [root@drbd02 ~]# mount -t ext4 /dev/drbd0 /data/
● drbdのステータス確認(primary側を停止(secondaryへ切替)した為、primaryへ昇格してる)
[root@drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /data ext4
● ノードA(旧primary(drbd01))で書き込みしたデータの同期確認
[root@drbd02 ~]# cat /data/test.txt DRBD TEST from Node A
● データ同期確認用にデータ書き込み
[root@drbd02 ~]# echo "DRBD TEST from Node B" >> /data/test.txt
● ノードBをsecondaryへ切替
[root@drbd02 ~]# umount /data [root@drbd02 ~]# drbdadm secondary r0
● drbdのステータス確認
[root@drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary UpToDate/UpToDate C
※ここで、ノードA(primary(drbd01))へ作業を切り替える
● secondary→primaryへ切替
[root@drbd01 ~]# drbdadm primary r0 [root@drbd01 ~]# mount -t ext4 /dev/drbd0 /data/
● ノードB(secondary(drbd02))で書き込みしたデータが正常に同期してるか確認
[root@drbd01 ~]# cat /data/test.txt DRBD TEST from Node A DRBD TEST from Node B
● drbdのステータス確認(primaryへ切替してる事を確認)
[root@drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /data ext4
※ここで、ノードB(secondary(drbd02))へ作業を切り替える
● drbdのステータス確認(primaryが復旧した為、「Secondary/Primary」へ切替済みを確認)
[root@drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Primary UpToDate/UpToDate C
● 同期パーティション設定のmountポイントが解除されているか確認
[root@drbd02 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 27G 2.7G 23G 11% / tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 ext4 488M 39M 425M 9% /boot
■ HA構成
● Pacemakerリポジトリを取得、インストール
[root@drbd01 tmp]# wget https://ja.osdn.net/projects/linux-ha/downloads/62369/pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm [root@drbd01 tmp]# rpm -ivh pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm [root@drbd01 tmp]# yum install pacemaker-all
● /etc/corosync/corosync.conf設定
[root@drbd01 tmp]# /etc/corosync/corosync.conf
● /etc/corosync/corosync.conf設定
compatibility: whitetank aisexec { user: root group: root } service { name: pacemaker ver: 0 use_mgmtd: yes } amf { mode: disabled } totem { version: 2 secauth: off threads: 0 rrp_mode: none clear_node_high_bit: yes token: 4000 censensus: 7000 join: 60 interface { member { memberaddr: 10.131.6.103 #ノードA } member { memberaddr: 10.131.6.175 #ノードB } ringnumber: 0 bindnetaddr: 10.131.0.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: AMF debug: off } } quorum { provider: corosync_votequorum expected_votes: 2 two_node: 1 }
※ Pacemaker/Corosync の設定値について
https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-config-values/
● 自動起動ONにする
[root@drbd01 tmp]# chkconfig pacemaker on [root@drbd01 tmp]# chkconfig corosync on
● サービス起動
Pacemaker, Corosync起動(初回のみ)
両方のノードで起動する
[root@drbd01 tmp]# /etc/init.d/corosync start [root@drbd01 tmp]# /etc/init.d/pacemaker start
※ 手動で停止するときはこの順番で停止すること
[root@drbd01 tmp]# /etc/init.d/pacemaker stop [root@drbd01 tmp]# /etc/init.d/corosync stop
● Pacemakerの起動状態確認(片方のノードで実行すればよい)
[root@drbd01 tmp]# crm_mon -Aro Last updated: Fri Jun 21 14:49:37 2019 Last change: Fri Jun 21 14:43:01 2019 Stack: corosync Current DC: drbd03 (176359015) - partition with quorum Version: 1.1.12-561c4cf 2 Nodes configured 0 Resources configured Online: [ drbd01 drbd02 ] Full list of resources: Node Attributes: * Node drbd01: * Node drbd02: Operations: * Node drbd01: * Node drbd02:
● CRM設定
片方のノードで実行すればよい
[root@drbd01 tmp]# crm configure crm(live)configure# crm(live)configure# property no-quorum-policy=ignore stonith-enabled=false crm(live)configure# rsc_defaults resource-stickiness=INFINITY migration-threshold=1 crm(live)configure# commit crm(live)configure# exit
● DRBDを死活監視対象に設定
[root@drbd01 tmp]# crm configure crm(live)configure# primitive drbd_data ocf:linbit:drbd params drbdconf=/etc/drbd.conf drbd_resource=r0 \ op start interval=0s timeout=240s \ op monitor interval=10 role=Slave \ op monitor interval=11 role=Master \ op stop interval=0 timeout=100s on-fail=block crm(live)configure# ms ms-drbd_data drbd_data meta notify=true crm(live)configure# primitive fs_data ocf:heartbeat:Filesystem params run_fsck=no device=/dev/drbd0 directory=/data fstype=ext4 \ op start interval=0s timeout=60s \ op monitor interval=15 timeout=40s \ op stop interval=0 timeout=60s on-fail=ignore crm(live)configure# colocation coloc-drbd_fs inf: fs_data ms-drbd_data:Master crm(live)configure# order order-drbd_fs inf: ms-drbd_data:promote fs_data:start
● 設定反映
上記を実行すると設定のみ追加され、まだ登録されていません。
次の内容を実行して、設定を登録反映します。
crm(live)configure# commit crm(live)configure# exit
● 設定の確認
[root@drbd01 ~]# crm config crm(live)configure# show node 176359015: drbd01 node 176359087: drbd02 primitive drbd_data ocf:linbit:drbd \ params drbdconf="/etc/drbd.conf" drbd_resource=r0 \ op start interval=0s timeout=240s \ op monitor interval=10 role=Slave \ op monitor interval=11 role=Master \ op stop interval=0 timeout=100s on-fail=block primitive fs_data Filesystem \ params run_fsck=no device="/dev/drbd0" directory="/data" fstype=ext4 \ op start interval=0s timeout=60s \ op monitor interval=15 timeout=40s \ op stop interval=0 timeout=60s on-fail=ignore ms ms-drbd_data drbd_data \ meta notify=true colocation coloc-drbd_fs inf: fs_data ms-drbd_data:Master order order-drbd_fs inf: ms-drbd_data:promote fs_data:start property cib-bootstrap-options: \ dc-version=1.1.12-561c4cf \ cluster-infrastructure=corosync \ no-quorum-policy=ignore \ stonith-enabled=false \ last-lrm-refresh=1561106859 rsc_defaults rsc-options: \ resource-stickiness=INFINITY \ migration-threshold=1
● Pacemakerステータス確認
[root@drbd01 tmp]# crm_mon Last updated: Fri Jun 21 15:46:29 2019 Last change: Fri Jun 21 15:44:25 2019 Stack: corosync Current DC: drbd01 (176359015) - partition with quorum Version: 1.1.12-561c4cf 2 Nodes configured 3 Resources configured Online: [ drbd01 drbd02 ] Master/Slave Set: ms-drbd_data [drbd_data] Masters: [ drbd01 ] Slaves: [ drbd02 ] fs_data (ocf::heartbeat:Filesystem): Started drbd01
● 仮想IP作成/ha resources設定
◆ MySQLのリソースの追加
primitive mysqld lsb:mysqld
→「lsb」というのは、Linux Standard Baseの略。Linux標準で提供される/etc/init.d以下にある起動スクリプトのこと
◆ リソースのグループ、リソース間の制約・順序の設定
最後に、リソースのグループ、リソース間の制約(colocation(関連性)・順序の設定する。
group mysql fs_mysql ip_mysql mysqld
colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start
設定の意味は、
1行目は「ファイルシステムと共有IPとMySQLをグループ『mysql』に指定」
2行目は「mysqlグループとDRBDのマスターは同時に存在しなくてはならない」
3行目は「DRBDのマスターが起動した後に、mysqlグループが起動しなくてはならない」
ref)
https://qiita.com/fetaro/items/9a836ed0922c82f53a25
◆ 実際の追加手順
[root@drbd04 ~]# crm config crm(live)configure# primitive vip1 ocf:heartbeat:IPaddr2 \ params ip=10.131.xxx.xxx nic=eth1 cidr_netmask=24 \ op start interval=0s timeout=20s \ op stop interval=0s timeout=20s \ op monitor interval=30s crm(live)configure# primitive q4m lsb:q4m crm(live)configure# group grpora fs_data vip1 q4m INFO: resource references in colocation:coloc-drbd_fs updated INFO: resource references in order:order-drbd_fs updated crm(live)configure# commit crm(live)configure# exit
- crm(live)configure# group {グループ名} fs_data vip1 q4m ← groupを作成しリソース追加
- INFO: resource references in colocation:coloc-drbd_fs updated ← 既存のcolocationに追加
- INFO: resource references in order:order-drbd_fs updated ← 既存のorderに追加
colocation制約は複数のリソースを同一ノードで起動させる制約として用い、order制約はリソース同士のアクション(起動及び停止など)の順序を指定します。リソースグループは上記の制約を合わせたようなもので、同じリソースグループに指定したリソースは同一ノードで起動され、起動順序も指定されます。
● Pacemakerステータス確認
[root@drbd01 ~]# crm_mon Last updated: Tue Jun 25 14:14:14 2019 Last change: Tue Jun 25 14:13:47 2019 Stack: corosync Current DC: drbd01 (176359015) - partition with quorum Version: 1.1.12-561c4cf 2 Nodes configured 5 Resources configured Online: [ drbd01 drbd02 ] Master/Slave Set: ms-drbd_data [drbd_data] Masters: [ drbd01 ] Slaves: [ drbd02 ] Resource Group: {グループ名} fs_data (ocf::heartbeat:Filesystem): Started drbd01 vip1 (ocf::heartbeat:IPaddr2): Started drbd01 q4m (lsb:q4m): Started drbd01
[lsb経由でのサービス起動に関して]
lsb経由でのリソース起動は下記仕様に準拠し作成する必要がある。
lsb:initスクリプト名 /etc/init.d/initスクリプト名 に配置されたスクリプトをRAとして使用します。 Linuxに付属のinitスクリプトをRAとして使用することができます。 ただし、initスクリプトがLSBと呼ばれる仕様に準拠している必要があります。
▲例:q4mをlsb経由で管理出来るようにinitd起動スクリプト修正
変更前)
... condrestart(){ [ -e /var/lock/subsys/q4m ] && restart || : } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status mysqld ;; restart) restart ;; condrestart) condrestart ;; *) echo $"Usage: $0 {start|stop|status|condrestart|restart}" exit 1 esac exit $?
変更後)
... condrestart(){ [ -e /var/lock/subsys/q4m ] && restart || : } function stop_q4m() { stop return 0 } function status_q4m() { ps -p `cat $mypidfile` > /dev/null 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ] ; then return 0 else return 3 fi } function monitor_q4m() { ps -p `cat $mypidfile` > /dev/null 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ] ; then return 0 else return 3 fi } case $1 in start ) start ;; stop ) stop_q4m ;; status ) status_q4m ;; monitor ) monitor_q4m ;; esac exit $?
ref)
●インストール方法
http://infra.blog.shinobi.jp/Entry/44/
https://www39.atwiki.jp/th0901/pages/20.html
https://hogem.hatenablog.com/entry/20080706/1215341445
https://qiita.com/hkajikawa/items/b911a92365e4a7b70164#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%8C%E5%A3%8A%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%A8%E5%A3%8A%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D
●pcs を用いたインストール方法
https://knowledge.sakura.ad.jp/19690/
https://centossrv.com/pacemaker_drbd.shtml
●crmコマンドに関しては下記サイトがわかりやすい
https://dexlab.net/pukiwiki/index.php?Memo/Linux/Pacemaker
●DRBDエンジニアサイト
https://blog.3ware.co.jp/
●crm リソースのメタオプション
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/configuring_the_red_hat_high_availability_add-on_with_pacemaker/s1-resourceopts-haar
●lsbに関して
https://linux-ha.osdn.jp/wp/archives/3855#lsb
http://www.kurobuti.com/blog/?p=4667
http://server-helper.doorblog.jp/archives/4142815.html