読者です 読者をやめる 読者になる 読者になる

Nagiosクラスタ冗長化[CentOS7/Pacemaker/Corosync/DRBD/pcs]を組んでみた

Nagios Pacemaker

タイトルの通り、Nagiosクラスタ冗長化構成を組んでみました。crmコマンドでなくpcsコマンド中心で設定しています。

システム環境

実際に動かした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

f:id:yomon8:20160412231111p:plain

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の監視が開始していることが確認できます。 f:id:yomon8:20160412231144p:plain

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アドレスでフェールオーバー確認

クラスタリソースとして仮想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の冗長クラスタ

ついにNagiosをDRBDをクラスタ化します。

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

DRBDユーザーズガイド バージョン8.4版

DRBDユーザーズガイド バージョン8.4版