まあ需要により組んだ備忘録です。これ以上あたためると忘却の彼方になるので一応書きます。
間際に言われて年末はさんでたけど年明けてすぐなんとかなってよかったです。
冗長化とか真面目にやると、なんでそんなめんどくさ難しいことするの気持ち悪いって反応が稀にあるけど本音は関係者の皆様含めた安眠のためとご所望のとおり働くだけくらいで建前はSLAと事業継続性ですかね。パブリッククラウドでマネージドのやつで保障されてるなら不要なんじゃないかと思うかな。
一応なんとなく書くとDRBDとは異なるホストのディスクをマスタ・スレーブとして同期してくれるもので、PacemakerとCorosyncとpcsは壊れたらマスタスレーブを自動であらかじめ設定したとおり切り替えてくれるものでnfsはファイル共有を提供してくれて複数のwebなどのクライアントから同じディスクマウントして読み書きする(ランダム高頻度書き込みに向いていない)やつです。普及してるのは2台構成で組むもので今回も同じ2台構成です。
今回はCentOS6のheartbeat・crmベースだったのをCentOS7でpacemaker・corosync・pcsになったので丸ごと調査検証しなおしって感じでやりがいがありました。
具体的に言うとinitdがsystemdに変わったせいで各種起動停止手順も異なるしPacemaker的なResouceAgentを考え直す必要があったりなど。
CentOS7.4を用意
7.1だとpcsがまともに動かなかったりしました。メジャーバージョン切り替わったばっかのやつより3世代くらい経たほうがバグがつぶされて安定して必要な設定が増えたりなど(覚えてる範囲だとchronydや今回だとpcsd)改善されている気がします。firewalldはdisable前提ですみません。有効な人は別途色々止め方が要る感じだったと思いますがここでは書かないのでググってください。
(物理でもVMでもどっちでもよくて2台。あとデータ同期用の領域として別のディスクをアタッチ。回線は物理ならHA通信用のチャネルボンディングもあるとよさげだったりしますが今回は特になにもしてないです)
yum update
cat /etc/redhat-release
ハードウェアの認識さすのとdrbdをいれてその設定をする
・ファイルシステムの確認。ルートデバイスとは別にくっつけてdrbdの領域とする。lvmはとりあえずしないことに。
fdisk -l
領域の拡張は省略。
DRBDパッケージインストール
wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el7/x86_64/RPMS/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
rpm -ivh elrepo-release*
sed -i 's/enabled=1/enabled = 0/g' /etc/yum.repos.d/elrepo.repo
yum install --enablerepo=elrepo kmod-drbd84*
rpm -qa | grep kernel
yum update kernel-devel kernel-headers kernel-debug-devel kernel-tools-libs kernel-tools
reboot
drbd.confを作成
2ノードで同じものを配置。
# cp -p /etc/drbd.conf{,.org}
# vi /etc/drbd.conf
# include "drbd.d/global_common.conf";
# include "drbd.d/*.res";
global {
usage-count no;
}
common {
syncer { rate 125M; }
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger; halt -f";
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
# outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
}
}
resource drbd0 {
protocol C;
# handlers {
# outdate-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";
# }
startup {
degr-wfc-timeout 120; # 2 minutes.
}
disk {
# on-io-error pass_on;
on-io-error detach;
fencing resource-only;
}
net {
}
on mynode03 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.33.0.42:7788;
meta-disk internal;
}
on mynode04 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.33.0.43:7788;
meta-disk internal;
}
}
handlersがheartbeatの頃のファイルが存在してなかったので修正しました。
メタデータ初期化、起動
drbdadm create-md drbd0
systemctl start drbd.service
systemctl status drbd.service
systemctl enable drbd.service
systemctl is-enabled
cat /proc/drbd
Secondary/Secondaryになってるので片方をプライマリにする
drbdadm primary drbd0 --force
drbdadm status
ext4でフォーマット。マウントポイント作成、マウント。
mke2fs -t ext4 /dev/drbd0
mkdir -p /drbd
mount /dev/drbd0 /drbd
df -h
ls -al /drbd
あとumount /drbd
でマウント外して切り替え。
マウント外れてればプライマリにしたいノードでdrbdadm primary <drbd-resource>
うつだけですね。
でマウントして書き込みテストする。(監視で定期書き込みテストは入れたほうが無難)
nfs設定
(実はリソースまともに動かねーよという状態から渡されたのでnfs設定は後から調べて書いたものです。)
とりあえずいれて止めとくのとnfsの状態ディレクトリバックアップ
yum install nfs-utils
systemctl status rpcbind nfs-server
systemctl stop rpcbind nfs-server
umount /drbd
cp -Rf /var/lib/nfs /var/lib/_nfs
NFSサーバの状態ファイルは/var/lib/nfs配下にあるので、
待機サーバ側でもそれを引き継げるように、ミラーリングの領域(/dev/drbd)へシンボリックしておく
mount /dev/drbd0 /drbd/
mv /var/lib/nfs /drbd/
mv /drbd/TEST-FILE /drbd/nfs/zabbix_file_exists.chk
ln -s /drbd/nfs /var/lib/nfs
umount /drbd
drbdadm secondary drbd0
drbdadm primary drbd0
mount /dev/drbd0 /drbd
mv /var/lib/nfs{,.org}
ln -s /drbd/nfs /var/lib/nfs
umount /drbd
drbdadm secondary drbd0
drbdadm primary drbd0
mount /dev/drbd0 /drbd
mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs
クライアントから見るIPを指定しとく。
# vi /etc/sysconfig/nfs
STATD_HOSTNAME=mynode-vip
同ファイル内のRPCNFSDCOUNTもCPUコア数(ぐぐるとコアあたり4~8と出てくる)に合わせて増やしても。負荷的に問題ないなら不要ですが。
あとexportsで公開ディレクトリの設定を。
vi /etc/exports
/drbd 10.33.0.0/255.255.252.0(async,rw,no_root_squash)
exportfs -ra
クライアントからマウントして書き込みテストを適宜。
まあResouceAgentでexportsは設定するので要らないかもしれないです。
/var/lib/nfsが要るのかどうかもよくわからないけど一応やっといた体。
クラスタリングソフトを入れて設定をする
yum install corosync pacemaker pcs
わたされたときに/etc/yum.confにクラスタリングソフトのexcludeが追記されてて入れなおしたりなどの検証に手間取りましたがそういうのがなければyum普通にbaseやupdatesから入ると思われます。LinuxHAjapanのリポジトリダウンロードしてpacemaker1.1入れるのはcorosyncもpcsも安定してないのでしない方がいいと思いました。
systemctl start pcsd
systemctl enable pcsd
systemctl status pcsd
ちなみにpcsコマンドでnodeのauthが通らないという現象に遭遇して色々したんですがrubyまわりの開発ツール導入やらOSのアップデートやらpcsdのmakeインストール(結局戻した)やら色々やってみて何が効いたのかさっぱりわからないことになりましたすみません。入れなおしたりしたログは、とりあえず割愛。一応pcsがauthできないのの対応過程で追加で入れてたやつをここに置いときます。
yum install glib2-devel libtool-ltdl-devel libuuid-devel net-snmp-agent-libs fence-virt net-snmp-utils telnet pexpect python-requests gnutls-utils device-mapper-multipath sg3_utils python-suds libvirt-client
yum install rubygem-bundler ruby-devel python-devel pam-devel libffi-devel
hostsの設定
# vi /etc/hosts
10.33.0.8 mynode-vip
10.33.0.42 mynode03
10.33.0.43 mynode04
corosyncの設定
いちおうパブリッククラウド上だったのでmcastじゃなくてunicastになるように設定。
bindnetaddr
で対向のアドレスを指定しtransport: udpu
でunicastの設定。(heartbeatのha.cfなどでやってたようなクラスタの疎通確認の経路の指定)
あとinterfaceとnodelistにさっきhostsに書いたアドレスを設定。
# vi /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: active
# clear_node_high_bit: yes
token: 4000
# consensus: 10000
# join: 60
cluster_name: my_cluster
interface {
member {
memberaddr: 10.33.0.42
}
member {
memberaddr: 10.33.0.43
}
ringnumber: 0
bindnetaddr: 10.33.0.43
# mcastaddr: 239.255.1.1
# mcastport: 5405
# ttl: 1
}
transport: udpu
}
nodelist {
node {
ring0_addr: mynode03
nodeid: 1
}
node {
ring0_addr: mynode04
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
expected_votes: 2
# two_node: 1
}
logging {
# to_logfile: yes
# logfile: /var/log/cluster/corosync.log
to_syslog: yes
syslog_facility: local0
timestamp: on
# logger_subsys {
# subsys: AMF
# debug: off
# }
}
# }
ログは上記だとsyslogにしか出してないですがファシリティ分けて別に出すならrsyslogとlogrotatedの設定が要るので忘れないようにどうぞ。
コメントだらけなのは最低限要る設定を模索していたためと入れなおしてた過程で旧いやつだと動作が不安定だったりしたためです。
corosyncはpacmakerを起動すると勝手に上がってくるので自動起動はどっちでもいい感じでした。
一応以下を修正し起動確認ました。設定に問題がなければ普通に起動します。
# diff /usr/lib/systemd/system/corosync.service /etc/systemd/system/corosync.service
3d2
< Documentation=man:corosync man:corosync.conf man:corosync_overview
19c18
< #Restart=on-failure
---
> Restart=on-failure
21c20
< #RestartSec=70
---
> RestartSec=70
23a23
> ExecStartPre=/sbin/modprobe softdog
# systemctl start corosync
# systemctl status corosync
# systemctl stop corosync
あと鍵が要るらしいので一応片方で作って両ノードに置いとく感じです
@mynode03
# corosync-keygen -l
# scp -p /etc/corosync/authkey user@mynode04:/tmp/
@mynode04
# chown root. /tmp/authkey
# mv /tmp/authkey /etc/corosync/
Pacemakerの設定
しなくても動くので要らないかもしれない。
# diff /etc/sysconfig/pacemaker{,.org}
78d77
< PCMK_fail_fast=yes
nodeをauthしてpcsでクラスタ起動する。
# passwd hacluster
# systemctl start pacemaker
# systemctl status pacemaker
# pcs cluster auth mynode04 mynode03 -u hacluster -p xxxxx --force
# pcs cluster start --all
# pcs cluster status
# pcs status
ちなみに
pcs cluster setup <clustername> <node1> <node2>
とするとcorosync.confが作成されるようです。
あとpcs cluster enable --all
はsystemctl enable pacemaker corosync pcsd
と同じ意味。
(corosyncと各種ResouceAgentはPacamakerがハンドリングするのでdisableでも大丈夫。)
pcsコマンドによる設定
-fで設定ファイル指定して書き込んだやつをpushして反映という流れ。
pacemakerのリソースとして登録することでそのクラスタ切り替えをハンドリングできるように。
リソースエージェントのスクリプト群はocfのは/usr/lib/ocf/resource.d
の下に。
## stonithとめる
crm_verify -L -V
pcs -f drbd_cfg property set stonith-enabled=false
pcs cluster cib-push drbd_cfg
crm_verify -L -V
## フェイルバック抑制らしいのとスムーズに切り替えるらしい設定ほか
pcs -f drbd_cfg resource defaults resource-stickiness=200
pcs -f drbd_cfg resource defaults failure-timeout="3600s"
pcs -f drbd_cfg property set start-failure-is-fatal="false"
## drbdのデバイスのリソース設定
pcs -f drbd_cfg resource create res_drbd0 ocf:linbit:drbd \
drbd_resource=drbd0 \
op monitor interval=10s on-fail=restart role=Master timeout=20s \
op monitor interval=20s on-fail=restart role=Slave timeout=20s \
op promote interval=0s on-fail=restart timeout=90s \
op demote interval=0s on-fail=block timeout=90s \
op start interval="0" timeout="240" \
op stop interval=0s on-fail=block timeout=100s
## drbdのクローンの設定
pcs -f drbd_cfg resource master ms_drbd0 res_drbd0 \
master-max=1 master-node-max=1 \
clone-max=2 clone-node-max=1 \
notify=true
## 一度設定をpushしておく
pcs cluster cib-push drbd_cfg
## 設定pushしたものを取り出して確認しておく
pcs cluster cib fs_cfg
## drbdのファイルシステムのマウントの設定
pcs -f drbd_cfg resource create res_FS_NFS Filesystem \
device="/dev/drbd0" \
directory="/drbd" \
fstype="ext4"
## クローンにはdrbdにマウントされたファイルシステムが必須の設定
pcs -f drbd_cfg constraint colocation add res_FS_NFS with ms_drbd0 \
INFINITY with-rsc-role=Master
## クローンをマスタに昇格させるときにファイルシステムを開始する
pcs -f drbd_cfg constraint order promote ms_drbd0 then start res_FS_NFS
## Mailto(アラート通知設定)
pcs -f drbd_cfg resource create res_Mailto_NFS ocf:heartbeat:MailTo \
email="user@domain" subject="(myalert-mail-prefix)" \
op start interval=0 timeout=60s on-fail=restart \
op monitor interval=10s timeout=60s on-fail=restart \
op stop interval=0 timeout=60s on-fail=block
## VIP(NFS公開用仮想IP)
pcs -f drbd_cfg resource create res_VIP_NFS ocf:heartbeat:IPaddr2 \
ip=10.33.0.8 cidr_netmask=22 \
op start interval=0 timeout=60s on-fail=restart \
op stop interval=0 timeout=60s on-fail=block \
op monitor interval=30s timeout=60s on-fail=restart
## VIPcheck(VIPをモニタリングするリソース)
## /usr/lib/ocf/resource.d/heartbeat/VIPcheckが見当たらなかったのでlinux-haのパッケージから入れた。
## rpm -ivh /opt/linux-ha/pacemaker/rpm/{pm_extras*,cluster-glue-1.0*}
## pcs -f drbd_cfg resource create res_VIPcheck_NFS ocf:heartbeat:VIPcheck \
## target_ip=10.33.0.8 count=1 wait=10 \
## op start interval=0 timeout=90s on-fail=block \
## op stop interval=0 timeout=90s on-fail=block
## ↓ ※せっかく入れたけどRA(リソースエージェント)とまるのでpingで代替えすることにした(リソースグループから外してcloneにした)
pcs -f drbd_cfg resource delete res_VIPcheck_NFS
pcs -f drbd_cfg resource create res_VIPcheck_NFS ocf:pacemaker:ping \
name=nfssrv_ping \
dampen=5s \
multiplier=1000 \
host_list=10.33.0.8 \
op monitor interval=10s \
--clone
## NFSサーバ用リソース
pcs -f drbd_cfg resource create res_NFS systemd:nfs-server \
op start interval=0 timeout=60s on-fail=block \
op monitor interval=10s timeout=60s on-fail=restart \
op stop interval=0 timeout=60s on-fail=block
## ※ocf:heartbeatをやめてsystemdにしたら安定的に動いた
## exportfs(もともとなかったが一応追加した)
pcs -f drbd_cfg resource create res_exportfs_NFS ocf:heartbeat:exportfs \
clientspec="10.33.0.0/22" options="async,rw,no_root_squash" directory="/drbd" fsid="root"
## グループ化(rg_NFS)
pcs -f drbd_cfg resource group add rg_NFS res_VIP_NFS res_FS_NFS res_NFS res_exportfs_NFS res_Mailto_NFS
## drbdとグループの制約(コロケーションと順序)を追加
pcs -f drbd_cfg constraint colocation add master ms_drbd0 with rg_NFS INFINITY with-rsc-role=Master
pcs -f drbd_cfg constraint order promote ms_drbd0 then start rg_NFS
## drbdとNFSサーバの制約(コロケーション=同居制約)を★切り替えテスト後に追加
pcs -f drbd_cfg constraint colocation add res_NFS with ms_drbd0 INFINITY with-rsc-role=Master
## ※with-rsc-role=Masterがないとdrbdを自らつかみにいかない感じだった
## 一応なんとなくロケーション制約を設定してみた(スコア値は正数の数が多いほうが優先度高い)
pcs constraint location rg_NFS prefers mynode03=100 mynode04=50
## 設定をpush
pcs cluster cib-push drbd_cfg
## 設定を確認
pcs config show
pcs constraint --full
リソースグループに入ってるリソースを消すだけなら特に作り直さなくていいけど、
リソースグループは変えたかったら消して作り直す感じでリソースグループ消すと付随する制約が勝手に消えるのでもろとも作り直しが要りました。
ステータスを確認するとクラスタの状態がわかります。
以下の例だと03側のノードにリソースが寄ってる様子が分かるかと。
# pcs status
Cluster name: my_cluster
Stack: corosync
Current DC: mynode04 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
Last updated: Fri Jan 5 17:54:33 2018
Last change: Fri Jan 5 17:52:58 2018 by root via cibadmin on mynode03
2 nodes configured
9 resources configured
Online: [ mynode03 mynode04 ]
Full list of resources:
Master/Slave Set: ms_drbd0 [res_drbd0]
Masters: [ mynode03 ]
Slaves: [ mynode04 ]
Clone Set: res_VIPcheck_NFS-clone [res_VIPcheck_NFS]
Started: [ mynode03 mynode04 ]
Resource Group: rg_NFS
res_VIP_NFS (ocf::heartbeat:IPaddr2): Started mynode03
res_FS_NFS (ocf::heartbeat:Filesystem): Started mynode03
res_NFS (systemd:nfs-server): Started mynode03
res_exportfs_NFS (ocf::heartbeat:exportfs): Started mynode03
res_Mailto_NFS (ocf::heartbeat:MailTo): Started mynode03
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
スコアの優先度はcrm_simulate -sL
で現状が確認できる模様。
優先度高い INFINITY > 200 > 100 > 0 > -100 > -INFINITY 優先度低い、という理解でおります。
ちなみにINIFINITYに設定されてるリソースを手動moveするとロケーション制約が追加されてそれを削除するまで二度と切り替わらないみたいなことになってだいぶ冷や汗でました。
フェイルアクションの消し方はpcs resource cleanup
でよさそう。
制約はidをpcs constraint --full
で確認してからpcs constraint remove cli-ban-ms_drbd0-on-mynode03
みたいな感じでidを指定して消すようでした。
切り替えテストは普通にプロセス切ったりIPおとしてみたりリブートしてみたりなどでよさそう。
(切り替えテストの結果次第で制約を追加する必要があるかもしれないnfsserverプロセス断で切り替わらなかったので制約追加しました★↑)
(クライアントからの見え方はマウントされてるとこの読み書きテストなどで)
スタンバイにするにはpcs cluster standby <node>
で戻すにはpcs cluster unstandby <node>
で。
pcsコマンドは気軽に制約入れられてしまうため作業開始前と後にpcs cluster cib fs_cfg.$(date +%Y%m%d_%H%M)
など打ってdiff
るのと-fつけてpushするなどしないと危ういのかなと思いました。
あとリソースエージェントのリストと設定可能な詳細オプションが書かれたやつの見方。
マニュアル見ながら認識できない設定を入れたり必要なのが無くて作動しないのを防ぐというか。
ocf:heartbeat
のResouceAgent
は特にnfsserver
は不安定だったのでsystemd
にしました。
MailTo
は検索したらカスタマイズしてる人が結構いました。
pcs resource list
pcs resource list ocf
pcs resource list pacemaker
pcs resource describe ocf:heartbeat:IPaddr2
pcs resource describe ocf:pacemaker:ping
pcs resource describe systemd:nfsserver
クラスタを消し去るにはpcs cluster destroy --all
するとauth通ってる全ノードのクラスタ情報がcorosync.confもろとも消されるらしいです。(これだけ聞いただけで試してない)
ちなみにCentOS7.1だとやっぱりpcsコマンドのauthが通らずそうすると--allのオプションは効かないけどクラスタは組めて切り替えは可能だったりなど。
とりあえずこんなところで。
参考
参考にさせてもらいました。ありがとうありがとう。
CentOS7.1でPacemaker+corosyncによるクラスタを構成する - とあるエンジニアの技術メモ
CentOS7でPacemaker×Corosyncを動かす - Rhythm & Biology
CentOS7のMariaDB(MySQL)をDRBDでHA化 – 1Q77
Pacemakerクラスタ管理コマンドまとめ - とあるエンジニアの技術メモ
HAクラスターシステム構築(Pacemaker+Corosync+pcs) - CentOSで自宅サーバー構築
アクティブ機のデータディスクが壊れたら遅滞なくフェイルオーバさせる方法 – Thirdware Tech Info
【学習メモ】corosyncとheartbeatを動かして違いを感じる - Qiita
Corosync.conf(5)マニュアル – Thirdware Tech Info
CentOS 7 で DRBD/Pacemaker/Corosync で High Availability NFS - Qiita
AWS Multi-AZにおける Pacemaker + Corosync による Elastic IP の付け替え - Qiita
Linbit Docs - ドキュメントLINBIT
Clusters from Scratch
Pacemaker 1.1 Configuration Explained – (12)利用と配置ストラテジ – Thirdware Tech Info
Pacemakerでフェールオーバー時にAmazon SNSに通知するResource Agent書いてみた - YOMON8.NET
Pacemakerのフェイルオーバ時にLINEに通知してみた - Qiita
CentOS 7 の Pacemaker/Corosync で snmptrap やメールで通知 - Qiita
centos7にpacemakerをインストールしてみる | 日常系エンジニアのTech Blog
6.8. Move Resources Manually
障害時にサブサーバへ自動で切り替える「高可用性WordPressシステム」の作り方 後編:DRBDの仕組みを学ぶ(6) - @IT
6.8. Specifying a Preferred Location
Chapter 6. Resource Constraints - Red Hat Customer Portal
インフラ構築手順書 冗長化構築 PaceMaker+MySQL
zabbix-server+pcs+corosyncでHAクラスタを構築する検証 - Qiita
Integrate DRBD with Pacemaker Clusters on RHEL7 / CentOS7
Pacemaker のリソースフェイルオーバーについて - NETWORK ENGINEER BLOG
Pacemaker and pcs on Linux example - cluster creation, add a node to cluster, remove a node from a cluster, desctroy a cluster - Fibrevillage