タイトルの通り、Nagiosのクラスタ冗長化構成を組んでみました。crmコマンドでなくpcsコマンド中心で設定しています。
- システム環境
- OS設定
- DRBD導入
- DRBDテスト
- Nagios導入
- Pacemaker+Corosyncインストール
- クラスタセットアップ
- Nagiosの冗長クラスタ化
- 障害停止の場合のTips
- 参考情報
システム環境
実際に動かしたVagrantfileを貼っておきます。
サーバー | 用途 | 備考 |
---|---|---|
node1 | クラスタMaster Server | DRBDデータ同期用の追加ディスク付き |
node2 | クラスタSlave Server | DRBDデータ同期用の追加ディスク付き |
target | 監視対象サーバ |
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure(2) do |config| config.vm.box = "centos/7" config.vm.define "node1" do | s | s.vm.network 'private_network', ip: '192.168.110.10' s.vm.network 'private_network', ip: '192.168.210.10', virtualbox__intnet: "back_net" s.vm.hostname = 'node1' s.vm.provider 'virtualbox' do |vb| vb.memory = '512' #DRBD用追加ディスク file_to_disk = "./additional_disk_#{s.vm.hostname}.vdi" unless File.exist?(file_to_disk) vb.customize ['createhd', '--filename', file_to_disk, '--size', 2 * 1024] end vb.customize ['storageattach', :id, '--storagectl', 'IDE Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk] end end config.vm.define "node2" do | s | s.vm.network 'private_network', ip: '192.168.110.11' s.vm.network 'private_network', ip: '192.168.210.11', virtualbox__intnet: "back_net" s.vm.hostname = 'node2' s.vm.provider 'virtualbox' do |vb| vb.memory = '512' #DRBD用追加ディスク file_to_disk = "./additional_disk_#{s.vm.hostname}.vdi" unless File.exist?(file_to_disk) vb.customize ['createhd', '--filename', file_to_disk, '--size', 2 * 1024] end vb.customize ['storageattach', :id, '--storagectl', 'IDE Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk] end end #監視対象の仮想マシン config.vm.define "target" do | s | s.vm.network 'private_network', ip: '192.168.110.200' s.vm.hostname = 'target' s.vm.provider 'virtualbox' do |vb| vb.memory = '256' end end end
OS設定
node1/node2の両方に以下の設定を行います。
Vagrantで設定した仮想マシンはhostsファイルに自ホスト名を127.0.0.1で登録してしまうので、それを削除してからhostsファイルにエントリを追加します。
名前解決
# sed -i.old -e "s/$(hostname)//g" /etc/hosts # cat <<EOS >> /etc/hosts 192.168.110.10 node1 192.168.110.11 node2 192.168.110.200 target EOS
SELinux
今回は切り分けのためにSELinux無効化しておきます。
# sed -i "s/\(^SELINUX=\).*/\1permissive/" /etc/selinux/config # setenforce 0
DRBD導入
DRBD導入(node1・node2同一手順)
elrepoを使えるようにします。
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
DRBDをインストールします。
# yum -y install drbd84-utils kmod-drbd84
追加ディスクにパーティションを作っておきます。この時点ではファイルシステムは作成しません。
# parted -s -a optimal /dev/sdb mklabel gpt -- mkpart primary 1 -1 # ls /dev/sdb* /dev/sdb /dev/sdb1
DRBD設定ファイル(node1・node2同一手順)
DRBDの設定ファイルを投入します。
# cat <<EOF > /etc/drbd.d/nagios.res resource nagios_disk { on node1{ device /dev/drbd0; disk /dev/sdb1; address 192.168.210.10:7789; meta-disk internal; } on node2 { device /dev/drbd0; disk /dev/sdb1; address 192.168.210.11:7789; meta-disk internal; } } EOF
DRBDのメタデータを初期化します。
# drbdadm create-md nagios_disk
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
初期同期
サービスを起動します。master側でsystemctlコマンド実行すると待ちになります。node2側で同様のコマンドを実行するとmaster/node2の双方のコマンドが完了します。ついでにサービスも自動起動するようにしておきます。
# systemctl start drbd.service
DRBDのステータスを確認してみて、Diskless/Disklessでディスクが認識されてない状態の場合は、nagios_diskを起動します。
# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by phil@Build64R7, 2016-01-12 14:29:40 0: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 # drbdadm up nagios_disk
もう一度DRBDのステータスを確認すると、Inconsistent/Inconsistentに変わっています。ディスクが認識されたので次はSecondary/SecondaryでPrimaryが無い状態を解消するためにnode1をPrimaryに昇格します。
# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by phil@Build64R7, 2016-01-12 14:29:40 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10483356
node1をPrimaryに設定してからステータスを確認すると、同期が始まっているのがわかります。
[node1]# drbdadm -- --overwrite-data-of-peer primary nagios_disk [node1]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by phil@Build64R7, 2016-01-12 14:29:40 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:413784 nr:0 dw:0 dr:414696 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10069572 [>....................] sync'ed: 4.0% (9832/10236)M finish: 0:09:28 speed: 17,716 (12,928) K/sec
DRBDテスト
同期完了確認
Primary/Secondary両方がUpToDateとなっていることから、同期が完了していることを確認します。
[node1]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate
DRBD手動フェールオーバー
node1側でファイルシステムを作成してマウントができることを確認してみます。
[node1]# mkfs.ext4 /dev/drbd0 [node1]# mkdir /mnt/nagiosdata [node1]# mount /dev/drbd0 /mnt/nagiosdata
先ほどMountしたディスクにテキストをはき出します。
[node1]# date > /mnt/nagiosdata/drbdtest.txt [node1]# cat /mnt/nagiosdata/drbdtest.txt Mon Apr 4 22:51:22 EDT 2016
ディスクをアンマウントしてnode1をSecondaryに降格します。
[node1]# umount /mnt/nagiosdata [node1]# drbdadm secondary nagios_disk [node1]# drbd-overview 0:nagios_disk/0 Connected Secondary/Secondary UpToDate/UpToDate
node2側をPrimaryに昇格して、ディスクをマウントすると、先ほどのテキストファイルが見えました。
[node2]# drbdadm primary nagios_disk [node2]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate [node2]# mkdir /mnt/nagiosdata [node2]# mount /dev/drbd0 /mnt/nagiosdata [node2]# cat /mnt/nagiosdata/drbdtest.txt Mon Apr 4 22:51:22 EDT 2016
DRBD切り戻し
切り戻します。先ほどの手順を逆にします。
node2側でアンマウント+Secondary降格
[node2]# umount /mnt/nagiosdata [node2]# drbdadm secondary nagios_disk
node1をPrimary昇格+マウントして中身を確認してみます。
[node1]# drbdadm primary nagios_disk [node1]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate [node1]# mount /dev/drbd0 /mnt/nagiosdata [node1]# cat /mnt/nagiosdata/drbdtest.txt Mon Apr 4 22:51:22 EDT 2016
Nagios導入
DRBDで同期されているディスクを使ってNagiosをインストールしてみます。
Nagiosインストール(node1/node2共通)
node1/node2両方のノードにnagiosをインストールします。
yum -y install epel-release yum -y install nagios nagios-plugins-all
Nagios設定ファイルのDRBDディスクへの移動
現在node1側にDRBDで同期されているディスクが/mnt/nagiosdataでマウントされています。
[node1]# drbd-overview 0:nagios/0 Connected Primary/Secondary UpToDate/UpToDate /mnt/nagiosdata ext4 9.8G 37M 9.2G 1%
DRBDディスク上にノード間でフェールオーバーしたいデータを置くディレクトリを作成します。
[node1]# mkdir -p /mnt/nagiosdata/etc/nagios [node1]# mkdir -p /mnt/nagiosdata/usr/lib64/nagios [node1]# mkdir -p /mnt/nagiosdata/var/log/nagios
Nagiosの設定ファイルを作成したディレクトリにコピーします。
[node1]# cp -a /etc/nagios /mnt/nagiosdata/etc [node1]# cp -a /usr/lib64/nagios /mnt/nagiosdata/usr/lib64 [node1]# cp -a /var/log/nagios /mnt/nagiosdata/var/log
元ファイルはバックアップしておきます。
[node1]# mv /etc/nagios{,.org} [node1]# mv /usr/lib64/nagios{,.org} [node1]# mv /var/log/nagios{,.org}
移動したディレクトリに対してSymbolic Link作成します。
[node1]# ln -s /mnt/nagiosdata/etc/nagios /etc/nagios [node1]# ln -s /mnt/nagiosdata/usr/lib64/nagios /usr/lib64/nagios
/var/log/nagiosだけはSymbolic LinkではNagiosが起動しなかったので、設定ファイルで直接DRBDディスク上のファイルを見るように変更します。
[node1]# sed -i.org -e "s@\(/var/log\)@/mnt/nagiosdata\1@g" /etc/nagios/nagios.cfg
Nagiosが起動できるか確認します。
[node1]# systemctl start nagios httpd [node1]# systemctl status nagios httpd
ブラウザでアクセスしてみます。
http://192.168.110.10/nagios
user | password |
---|---|
nagiosadmin | nagiosadmin |
NagiosにTargetを監視する設定を追加してみます。この監視設定をフェールオーバー時の確認にも利用します。
[node1]# cat <<EOS >> /etc/nagios/objects/localhost.cfg define host{ use linux-server host_name target alias target address 192.168.110.200 } define service{ use local-service host_name target service_description PING check_command check_ping!100.0,20%!500.0,60% } EOS
Nagiosに設定を読み込ませます。
[node1]# systemctl restart nagios
Targetの監視が開始していることが確認できます。
Nagios手動フェールオーバー
DRBDのステータス確認します。UpToDate/UpToDateであることから同期が完了していることがわかります。
[node1]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate /mnt/nagiosdata ext4 9.8G 45M 9.2G 1%
node1側でNagiosを停止して、DRBD同期しているディスクをアンマウントしておきます。
[node1]# systemctl stop nagios [node1]# umount /dev/drbd0
node1側作業
node1をSecondaryに降格します。
[node1]# drbdadm secondary nagios_disk
drbd-overviewでSecondary/Secondaryになっていることを確認します。
[node1]# drbd-overview 0:nagios_disk/0 Connected Secondary/Secondary UpToDate/UpToDate
node2側作業
node2側をPrimaryに昇格します。
[node2]# drbdadm primary nagios_disk [node2]# drbd-overview 0:nagios/0 Connected Primary/Secondary UpToDate/UpToDate
マウントします。
[node2]# mount /dev/drbd0 /mnt/nagiosdata
node1同様に元ファイルはバックアップしておきます。
[node2]# mv /etc/nagios{,.org} [node2]# mv /usr/lib64/nagios{,.org} [node2]# mv /var/log/nagios{,.org}
移動してきたディレクトリに対してSymbolic Link作成します。
[node2]# ln -s /mnt/nagiosdata/etc/nagios /etc/nagios [node2]# ln -s /mnt/nagiosdata/usr/lib64/nagios /usr/lib64/nagios
この時点でnode2側でもNagiosが起動するはずです。
[node2]# systemctl start nagios httpd
接続してみてnode1側で設定した通り、targetが監視対象として監視されていることを確認してみます。
http://192.168.110.11/nagios
user | password |
---|---|
nagiosadmin | nagiosadmin |
終わったらNagiosを停止して、ディスクをアンマウントし、Secondaryに降格しておきます。
[node2]# systemctl stop nagios [node2]# umount /dev/drbd0 # drbdadm secondary nagios_disk # drbd-overview 0:nagios_disk/0 Connected Secondary/Secondary UpToDate/UpToDate
Pacemaker+Corosyncインストール
クラスタを構築するためにPacemakerとCorosync、それを制御するためのpcsをインストールします。
パッケージ導入(node1/node2)
Pacemaker,Corosyncとpcsコマンド入れます。
# yum -y install pacemaker corosync pcs
通信用ユーザ設定(node1/node2)
自動的にhaclusterユーザが作成されているのでパスワードを設定します。
# id hacluster uid=189(hacluster) gid=189(haclient) groups=189(haclient) # passwd hacluster
PCSサービス起動(node1/node2)
PCSサービスを起動・有効化します。
# systemctl enable pcsd Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service. # systemctl start pcsd # systemctl status pcsd ● pcsd.service - PCS GUI and remote configuration interface Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2016-04-04 01:37:22 EDT; 4s ago Main PID: 12378 (pcsd) CGroup: /system.slice/pcsd.service ├─12378 /bin/sh /usr/lib/pcsd/pcsd start ├─12382 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/bin/ruby -I/usr/lib/pcsd /usr/lib/pcsd/ssl.rb ├─12383 /usr/bin/ruby -I/usr/lib/pcsd /usr/lib/pcsd/ssl.rb └─12387 python2 /usr/lib/pcsd/systemd-notify-fix.py Apr 04 01:37:22 node1 systemd[1]: Starting PCS GUI and remote configuration interface... Apr 04 01:37:22 node1 systemd[1]: Started PCS GUI and remote configuration interface.
クラスタセットアップ
node1側からクラスタのセットアップを実行していきます。
認証情報を設定します。
[node1]# pcs cluster auth node1 node2 -u hacluster -p p@ssw0rd --force node1: Authorized node2: Authorized
クラスタを作成します。
[node1]# pcs cluster setup --name mycluster node1 node2 Shutting down pacemaker/corosync services... Redirecting to /bin/systemctl stop pacemaker.service Redirecting to /bin/systemctl stop corosync.service Killing any remaining services... Removing all cluster configuration files... node1: Succeeded node2: Succeeded Synchronizing pcsd certificates on nodes node1, node2... node1: Success node2: Success Restaring pcsd on the nodes in order to reload the certificates... node1: Success node2: Success
クラスタを開始します。
# pcs cluster start --all
node1: Starting Cluster...
node2: Starting Cluster...
この時点だとSTONITH設定が無いことによるエラーが出ていて、正常にクラスタが動かないので、一旦stonith設定を無効化します。
# crm_verify -L -V error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity ] Errors found during check: config not valid # pcs property set stonith-enabled=false # crm_verify -L -V メッセージ無し
pcs statusコマンドまたはcrm_monコマンドで「Online: [ node1 node2 ]」であることを確認する。
# pcs status Cluster name: mycluster Last updated: Tue Apr 12 01:55:08 2016 Last change: Tue Apr 12 01:54:58 2016 by root via cibadmin on node1 Stack: corosync Current DC: node1 (version 1.1.13-10.el7_2.2-44eb2dd) - partition with quorum 2 nodes and 0 resources configured Online: [ node1 node2 ] Full list of resources: PCSD Status: node1: Online node2: Online Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
仮想IPアドレスでフェールオーバー確認
pcsコマンドを使って仮想IPアドレスから設定してみます。
[node1]# pcs resource create RES_VIP_NAGIOS ocf:heartbeat:IPaddr2 ip=192.168.110.150 cidr_netmask=24 op monitor interval=10s [node1]# pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 [node1]# ip addr show ------中略------ 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:94:e8:cf brd ff:ff:ff:ff:ff:ff inet 192.168.110.10/24 brd 192.168.110.255 scope global eth1 valid_lft forever preferred_lft forever inet 192.168.110.150/24 brd 192.168.110.255 scope global secondary eth1 #<----追加されている valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe94:e8cf/64 scope link valid_lft forever preferred_lft forever
上記のocf::hertbeat:IPaddr2というところは、リソースエージェント(RA)と呼ばれるもので、リソースの状態確認や制御を行います。実体は以下のファイルになります。
/usr/lib/ocf/resource.d/heartbeat/IPaddr2
作成した仮想IPをnode2側に動かしてみます。
[node1]# pcs resource move RES_VIP_NAGIOS node2
node2側でcrm_monを開いておくとリソースが移動してくるのが確認できます。
[node2]#crm_mon Last updated: Tue Apr 12 01:58:09 2016 Last change: Tue Apr 12 01:58:00 2016 by root via crm_resource on node1 Stack: corosync Current DC: node1 (version 1.1.13-10.el7_2.2-44eb2dd) - partition with quorum 2 nodes and 1 resource configured Online: [ node1 node2 ] RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node2
node2側で設定を確認すればIPが移動してきたのがわかります。
[node2]# ip addr show | grep inet -----------中略--------- inet 192.168.110.150/24 brd 192.168.110.255 scope global secondary eth1
node1に戻すことも可能です。
[node1]# pcs resource move RES_VIP_NAGIOS node1 [node1]# pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 [node1]# ip addr show | grep inet -----------中略--------- inet 192.168.110.150/24 brd 192.168.110.255 scope global secondary eth1
Nagiosの冗長クラスタ化
DRBDクラスタ化
DRBDはクラスタ側で管理するので、サービスは自動起動は無効化しておきます。
# systemctl disable drbd
DRBDの状態にも問題無いか確認しておきます。
[node1]# drbd-overview 0:nagios_disk/0 Connected Secondary/Secondary UpToDate/UpToDate
まずはDRBDのクラスタリソースを作成します。
# pcs resource create RES_DRBD_NAGIOS ocf:linbit:drbd params drbd_resource="nagios_disk" op monitor interval="5s" # pcs resource master MS_DRBD_NAGIOS RES_DRBD_NAGIOS master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
この時点ではunmanagedのステータスになっていて、クラスタ管理におかれていません。
# pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started master Master/node2 Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] RES_DRBD_NAGIOS (ocf::linbit:drbd): FAILED master (unmanaged) RES_DRBD_NAGIOS (ocf::linbit:drbd): FAILED node2 (unmanaged)
以下のコマンドでステータスをクリアすると、DRBDがクラスタ管理下に置かれました。
# pcs resource cleanup MS_DRBD_NAGIOS Waiting for 2 replies from the CRMd.. OK Cleaning up RES_DRBD_NAGIOS:0 on node1, removing fail-count-RES_DRBD_NAGIOS Cleaning up RES_DRBD_NAGIOS:0 on node2, removing fail-count-RES_DRBD_NAGIOS * The configuration specifies that 'MS_DRBD_NAGIOS' should remain stopped # pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node1 ] Slaves: [ node2 ]
DRBDディスクをnode2側にフェールオーバーします。
# pcs resource move MS_DRBD_NAGIOS node2 --master # pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node2 ] Slaves: [ node1 ]
node2がPrimaryになっているのがわかります。
[node2]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate
node1側にリソースを切り戻します。
# pcs resource move MS_DRBD_NAGIOS node1 --master # pcs resource RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node1 ] Slaves: [ node2 ]
別のコンソール立ち上げて以下のコマンドなどで状況みながら、フェールオーバーしたり切り戻したりすると動きがわかります。
[node1]# watch -n 2 drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate
DRBD以外のクラスタリソース作成
DRBDのリソース以外のリソースを作成します。
# pcs resource create RES_FS_NAGIOS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/nagiosdata" fstype="ext4" # pcs resource create RES_SERVICE_NAGIOS systemd:nagios params op monitor interval="5s" timeout="10s" # pcs resource create RES_SERVICE_HTTPD systemd:httpd params op monitor interval="5s" timeout="10s"
グループ化やリソースの起動順序を定義します。
pcs resource group add GP_NAGIOS RES_FS_NAGIOS RES_SERVICE_NAGIOS RES_SERVICE_HTTPD RES_VIP_NAGIOS pcs constraint order promote MS_DRBD_NAGIOS then start RES_FS_NAGIOS pcs constraint order start RES_FS_NAGIOS then start RES_SERVICE_NAGIOS
この時点で構築途中のエラーが溜まっていて、GP_NAGIOSがStopしている場合などは以下のコマンドでクリアできます。
pcs resource cleanup GP_NAGIOS
これでNagiosの冗長化クラスタの構築が完了しました。現時点の状態は以下の通りです。
# crm_mon -rfA Last updated: Tue Apr 12 06:16:31 2016 Last change: Tue Apr 12 06:16:28 2016 by hacluster via crmd on node1 Stack: corosync Current DC: node2 (version 1.1.13-10.el7_2.2-44eb2dd) - partition with quorum 2 nodes and 6 resources configured Online: [ node1 node2 ] Full list of resources: Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node1 ] Slaves: [ node2 ] Resource Group: GP_NAGIOS RES_FS_NAGIOS (ocf::heartbeat:Filesystem): Started node1 RES_SERVICE_NAGIOS (systemd:nagios): Started node1 RES_SERVICE_HTTPD (systemd:httpd): Started node1 RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1 Node Attributes: * Node node1: + master-RES_DRBD_NAGIOS : 10000 * Node node2: + master-RES_DRBD_NAGIOS : 10000 Migration Summary: * Node node2: * Node node1: # pcs constraint order Ordering Constraints: promote MS_DRBD_NAGIOS then start RES_FS_NAGIOS (kind:Mandatory) start RES_FS_NAGIOS then start RES_SERVICE_NAGIOS (kind:Mandatory)
フェールオーバー確認
node1でクラスタを停止してみます。
[node1]# pcs cluster stop
node2にリソースが移動します。crm_monなどを使うとリソースの移動する様子がリアルタイムで見ることができます。
[node2]# pcs resource Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node2 ] Stopped: [ node1 ] Resource Group: GP_NAGIOS RES_FS_NAGIOS (ocf::heartbeat:Filesystem): Started node2 RES_SERVICE_NAGIOS (systemd:nagios): Started node2 RES_SERVICE_HTTPD (systemd:httpd): Started node2 RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node2
node1でクラスタを再開してみます。
[node1]# pcs cluster start
node1に自動でフェールバックします。
# pcs resource Master/Slave Set: MS_DRBD_NAGIOS [RES_DRBD_NAGIOS] Masters: [ node1 ] Slaves: [ node2 ] Resource Group: GP_NAGIOS RES_FS_NAGIOS (ocf::heartbeat:Filesystem): Started node1 RES_SERVICE_NAGIOS (systemd:nagios): Started node1 RES_SERVICE_HTTPD (systemd:httpd): Started node1 RES_VIP_NAGIOS (ocf::heartbeat:IPaddr2): Started node1
resource-stickinessの値を変更することで自動フェールオーバーされないようにできます。
# pcs resource defaults resource-stickiness="INFINITY" migration-threshold="1"
仮想IPアドレスを使ってNagiosのを確認しながらやると瞬断があるくらいで、十分使えることがわかります。通知の抑制などの設定も問題無く引き継がれます。
http://192.168.110.150/nagios/
障害停止の場合のTips
スプリットブレイン
リソースを移動せずにシャットダウンした場合などはDRBDがどちらがPrimaryかわからなくなるスプリットブレインという状態になります。以下のように、どちらのノードも自分以外の情報がわからなく(UnKnown)なっています。
[node1]# drbd-overview 0:nagios_disk/0 StandAlone Secondary/Unknown UpToDate/DUnknown
[node2]# drbd-overview 0:nagios_disk/0 StandAlone Primary/Unknown UpToDate/DUnknown /mnt/nagiosdata ext4 2.0G 15M 1.9G 1%
この際にdrbd-overviewがUnconfiguredとなっている場合は先にDiskを認識させます。
# drbd-overview 0:nagios_disk/0 Unconfigured . . # drbdadm up nagios_diks
上記の場合状態の場合を想定して以下の方法でスプリットブレインから回復できます。
今回はnode1の変更分を犠牲にしてnode2を正として扱います。
[node1]# drbdadm secondary nagios_disk [node1]# drbdadm -- --discard-my-data connect nagios_disk
node2で接続すると、差分同期が走り正常な状態に戻ります。
[node2]# drbdadm connect nagios_disk [node2]# drbd-overview 0:nagios_disk/0 SyncSource Primary/Secondary UpToDate/Inconsistent /mnt/nagiosdata ext4 2.0G 15M 1.9G 1% [====>...............] sync'ed: 25.0% (26636/29528)K [node2]# drbd-overview 0:nagios_disk/0 Connected Primary/Secondary UpToDate/UpToDate /mnt/nagiosdata ext4 2.0G 15M 1.9G 1%
フェールバック
障害でダウンした時点で、node1は障害ノードとしてフラグが立っています。障害復旧後にリソースを移動しようとしても移動できません。その場合はフラグをクリアするために以下のコマンドを実行後にリソースを移動すると移動できるようになります。
# pcs resource cleanup GP_NAGIOS # pcs resource cleanup MS_DRBD_NAGIOS
参考情報
pacemaker/pcs-crmsh-quick-ref.md at master · ClusterLabs/pacemaker · GitHub
http://www.oss-d.net/drbd-pacemaker-corosync
動かして理解するPacemaker ~CRM設定編~ その2 « Linux-HA Japan
Chapter 1. Red Hat High Availability Add-On Configuration and Management Reference Overview