Pacemaker + Corosyncを用いてクラスタ環境の構築 - Pacemaker, Corosyncの構築

お仕事でLinux環境でHAクラスタを検証する必要が出てきたので、手順を調べてみました。

RHEL 6.4環境で検証しております:

1
2
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)

当然ながらCentOS6でも動作するかと思います。RHEL 7 or CentOS7ではOSの仕組みが変わっていると思いますので、ここでまとめた手順の通りにしてもおそらく動作しません。

ホスト名一覧などは以下のとおりです:

#HostnameIP AddressRemarks
1rhel-act192.168.56.31Active server
2rhel-sta192.168.56.32Standby server
3rhel-logical192.168.56.30Logical hostname / floating IP
4rhel-iscsi192.168.56.40iScsi server

簡単なネットワーク図はこちら:

network diagram

Pacemaker + Corosyncのインストール方法を説明します。

以下のコマンドを実行し、インストールします。なお、rhel-actおよびにrhel-staサーバ上で実施します:

1
# yum install -y pacemaker cman pcs

セットアップ方法を説明します。

以下のコマンドを実行し、Quorumを無効化します。なお、rhel-actおよびにrhel-staサーバ上で実施します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# cd /etc/sysconfig/
# cp -p cman cman.${YYYYMMDD}
# vi cman
# diff -u cman.${YYYYMMDD} cman
--- cman.20160625       2016-05-11 17:59:29.000000000 +0800
+++ cman        2016-06-25 15:25:21.217999988 +0800
@@ -10,7 +10,7 @@
 #     startup. Quorum is needed by many other applications, so we may as
 #     well wait here.  If CMAN_QUORUM_TIMEOUT is zero, quorum will
 #     be ignored.
-#CMAN_QUORUM_TIMEOUT=45
+CMAN_QUORUM_TIMEOUT=0

 # CMAN_SHUTDOWN_TIMEOUT -- amount of time to wait for cman to become a
 #     cluster member before calling 'cman_tool' leave during shutdown.

クラスタ操作で利用するhauserユーザのパスワードを設定します。rhel-actおよびにrhel-staサーバで同じパスワードを指定してあげます。ここでは「p@ssword」を指定することとします。

なお、rhel-actおよびにrhel-staサーバ上で実施してください。

1
2
3
4
5
6
# passwd hacluster
Changing password for user hacluster.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.

クラスタ関連デーモンのpcsdデーモンをOS起動時に自動起動するように設定します。なお、rhel-actおよびにrhel-staサーバ上で実施してください:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cd
# service pcsd status
pcsd is stopped
# service pcsd start
Starting pcsd:                                             [  OK  ]
# service pcsd status
pcsd (pid  1345) is running...
# chkconfig --list > 001-before.txt
# chkconfig pcsd on
# chkconfig --list > 001-after.txt
# diff -u 001-before.txt 001-after.txt
--- 001-before.txt      2016-06-25 15:29:00.331999983 +0800
+++ 001-after.txt       2016-06-25 15:29:09.834999999 +0800
@@ -21,7 +21,7 @@
 ntpdate                0:off   1:off   2:off   3:off   4:off   5:off   6:off
 oddjobd                0:off   1:off   2:off   3:off   4:off   5:off   6:off
 pacemaker              0:off   1:off   2:off   3:off   4:off   5:off   6:off
-pcsd                   0:off   1:off   2:off   3:off   4:off   5:off   6:off
+pcsd                   0:off   1:off   2:on    3:on    4:on    5:on    6:off
 postfix                0:off   1:off   2:on    3:on    4:on    5:on    6:off
 quota_nld              0:off   1:off   2:off   3:off   4:off   5:off   6:off
 rdisc                  0:off   1:off   2:off   3:off   4:off   5:off   6:off

クラスタ関連デーモンのpcsdデーモンから起動されるようですので、OS起動時にCorosyncを自動起動しないように設定します。なお、rhel-actおよびにrhel-staサーバ上で実施してください:

1
# chkconfig corosync off

以下のコマンドを実行して、クラスタのセットアップを実行します。なお、rhel-act or rhel-staのいずれか一方で実行してください。

以下のコマンドを実行し、クラスタソフトで利用するOSユーザ・パスワードを指定します:

1
2
3
# pcs cluster auth rhel-act rhel-sta -u hacluster -p p@ssw0rd
rhel-act: Authorized
rhel-sta: Authorized

以下のコマンドを実行し、クラスタソフト上でクラスタを構成します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# pcs cluster setup --start --name cluster rhel-act rhel-sta
Destroying cluster on nodes: rhel-act, rhel-sta...
rhel-act: Stopping Cluster (pacemaker)...
rhel-sta: Stopping Cluster (pacemaker)...
rhel-sta: Successfully destroyed cluster
rhel-act: Successfully destroyed cluster

Sending cluster config files to the nodes...
rhel-act: Updated cluster.conf...
rhel-sta: Updated cluster.conf...

Starting cluster on nodes: rhel-act, rhel-sta...
rhel-act: Starting Cluster...
rhel-sta: Starting Cluster...

Synchronizing pcsd certificates on nodes rhel-act, rhel-sta...
rhel-act: Success
rhel-sta: Success

Restarting pcsd on the nodes in order to reload the certificates...
rhel-act: Success
rhel-sta: Success

以下のコマンドを実行し、構成したクラスタを有効化します:

1
2
3
# pcs cluster enable --all
rhel-act: Cluster Enabled
rhel-sta: Cluster Enabled

crm_verifyコマンドを実行し、設定内容を検証します:

1
2
3
4
5
# 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

上の例では、STONITHの設定でエラーが出ています。今回の例ではSTONITHは使用しないため、無効化します。また、Quorumも利用しないため、無効化します。無効化するための設定は以下になります:

1
2
# pcs property set stonith-enabled=false
# pcs property set no-quorum-policy=ignore

クラスタリソースの登録方法を説明します。

pcs resource create vip ocf:heartbeat:IPaddr2を実行し、論理IPアドレスを登録します。ここでは、192.168.56.30を登録します。なお、クラスタリソースグループとしてresource-groupを指定しています:

1
2
3
4
5
6
# pcs resource create vip ocf:heartbeat:IPaddr2 ¥
    ip="192.168.59.30" cidr_netmask "24" nic="eth0" ¥
    op start timeout="20s" on-fail="restart" ¥
    op stop timeout="20s" on-fail="block" ¥
    op monitor interval="10s" timeout="20s" on-fail="restart" ¥
    --group resource-group

上記のコマンドを実行後、pcs statusコマンドを実行し、クラスタリソースが登録されているかを確認します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# pcs status
Cluster name: cluster
Last updated: Sat Jun 25 16:11:19 2016          Last change: Sat Jun 25 16:11:17 2016 by root via cibadmin on rhel-act
Stack: cman
Current DC: rhel-sta (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 1 resource configured

Online: [ rhel-act rhel-sta ]

Full list of resources:

 Resource Group: resource-group
     vip        (ocf::heartbeat:IPaddr2):       Started rhel-act

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

iSCSIを利用した共有ディスクリソースを登録します。

iSCSIを利用したクラスタリソース登録用のPacemakerスクリプトがインストールされていなかったため、まずはrhel-actおよびにrhel-staサーバ上で以下のコマンドを実行し、スクリプトを登録します:

1
2
3
# cd /usr/lib/ocf/resource.d/heartbeat/
# wget https://raw.githubusercontent.com/ClusterLabs/resource-agents/master/heartbeat/iscsi --no-check-certificate
# chmod +x iscsi

ダウンロード後、rhel-act or rhel-staサーバ上で以下のコマンドを実行します。まずはpcs resource create shared_device ocf:heartbeat:iscsiを実行し、iSCSIで共有ディスクを参照できるようにします:

1
2
3
4
5
6
7
8
pcs resource create shared_device  ocf:heartbeat:iscsi  \
  params \
    portal="192.168.59.40:3260" \
    target="iqn.2016-06.local.test.has:sdb" \
  op start on-fail=block \
  op stop on-fail=block \
  op mointor on-fail=restart \
  --group resource-group

その後、pcs resource create shared_mount Filesystemを実行し、iSCSIで参照できるようになったデバイスをマウントします:

1
2
3
4
5
6
7
8
pcs resource create shared_mount Filesystem \
  device="/dev/sdb1" \
  directory="/share" \
  fstype="ext4" \
  op start on-fail=block \
  op stop on-fail=block \
  op mointor on-fail=restart \
  --group resource-group

お仕事で使うプログラムは、

  • 起動コマンドを指定する
  • 停止コマンドを指定する
  • 状態監視コマンドを指定する

という方法でクラスタソフトに登録することを想定していましたが、クラスタソフト側ではそのような登録をすることができませんでした。しょうがないので、以下のようなクラスタリソース登録用のスクリプトを作成しました。/usr/lib/ocf/resource.d/heartbeat/anythingという名称で保存してください:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/bin/sh

# OCF instance parameters
#       OCF_RESKEY_start_cmd
#       OCF_RESKEY_stop_cmd
#       OCF_RESKEY_monitor_cmd
#

# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs

# FIXME: Attributes special meaning to the resource id
#       OCF_RESKEY_start_cmd
#       OCF_RESKEY_stop_cmd
#       OCF_RESKEY_monitor_cmd
start_cmd="$OCF_RESKEY_start_cmd"
stop_cmd="$OCF_RESKEY_stop_cmd"
mointor_cmd="$OCF_RESKEY_monitor_cmd"

anything_status() {
        su - root -c "$OCF_RESKEY_monitor_cmd"
        RESULT=$?

        if [ $RESULT -eq 0 ]; then
          return $OCF_SUCCESS
        else
          return $OCF_NOT_RUNNING
        fi
}

anything_start() {
        if ! anything_status
        then
                su - root -c "$OCF_RESKEY_start_cmd"

                if anything_status
                then
                        ocf_log debug "Resource has started successfully"
                        return $OCF_SUCCESS
                else
                        ocf_log err "Resource fails to start."
                        return $OCF_ERR_GENERIC
                fi
        else
                # If already running, consider start successful
                ocf_log debug "Resource is already running"
                return $OCF_SUCCESS
        fi
}

anything_stop() {
        local rc=$OCF_SUCCESS

        if anything_status
        then
                su - root -c "$OCF_RESKEY_stop_cmd"
        fi

        if ! anything_status
        then
                rc=$OCF_SUCCESS
        fi
        return $rc
}

anything_monitor() {
        su - root -c "$OCF_RESKEY_monitor_cmd"
        RESULT=$?

        echo ${OCF_RESKEY_monitor_cmd} >> /root/result.txt
        echo $RESULT >> /root/result.txt

        if [ $RESULT -eq 0 ]; then
          return $OCF_SUCCESS
        else
          return $OCF_NOT_RUNNING
        fi
}


anything_validate() {
        return $OCF_SUCCESS
}

anything_meta() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="test">
<version>1.0</version>
<longdesc lang="en">
This is a generic OCF RA to manage almost anything.
</longdesc>
<shortdesc lang="en">Manages an arbitrary service</shortdesc>

<parameters>
<parameter name="start_cmd" required="1" unique="1">
<longdesc lang="en">
The start command to execute the resource.
</longdesc>
<shortdesc lang="en">Full path name of the start command to be executed</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="stop_cmd" required="1" unique="1">
<longdesc lang="en">
The stop command to execute the resource.
</longdesc>
<shortdesc lang="en">Full path name of the stop command to be executed</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="monitor_cmd">
<longdesc lang="en">
Command to run in monitor operation
</longdesc>
<shortdesc lang="en">Command to run in monitor operation</shortdesc>
<content type="string"/>
</parameter>
</parameters>
<actions>
<action name="start"   timeout="60s" />
<action name="stop"    timeout="60s" />
<action name="monitor" depth="0"  timeout="30s" interval="30" />
<action name="meta-data"  timeout="5" />
<action name="validate-all"  timeout="5" />
</actions>
</resource-agent>
END
exit 0
}

case "$1" in
        meta-data|metadata|meta_data)
                anything_meta
        ;;
        start)
                anything_start
        ;;
        stop)
                anything_stop
        ;;
        monitor)
                anything_monitor
        ;;
        validate-all)
                anything_validate
        ;;
        *)
                ocf_log err "$0 was called with unsupported arguments: $*"
                exit $OCF_ERR_UNIMPLEMENTED
        ;;
esac

その後、以下のコマンドを実行し、プログラムをクラスタリソースとして登録します:

1
2
3
4
5
6
pcs resource create program_logical ocf:heartbeat:anything \
  params \
    start_cmd="/path/to/start-command"  \
    stop_cmd="/path/to/stop-command" \
    monitor_cmd="/path/to/status-check-command" \
  --group resource-group

各種操作について説明します。

pcs statusコマンドを実行し、クラスタの状態を確認します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# pcs status
Cluster name: cluster
Last updated: Sun Jul 10 22:14:31 2016          Last change: Sun Jul 10 22:09:49 2016 by root via crm_attribute on rhel-act
Stack: cman
Current DC: rhel-act (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 5 resources configured

Online: [ rhel-act rhel-sta ]

Full list of resources:

 Resource Group: resource-group
     vip1       (ocf::heartbeat:IPaddr2):       Started rhel-act
     shared_device      (ocf::heartbeat:iscsi): Started rhel-act
     shared_mount       (ocf::heartbeat:Filesystem):    Started rhel-act
     program_logical    (ocf::heartbeat:anything):  Started rhel-act

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

pcs cluster standbyコマンドを実行し、ノードをオフラインにします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# pcs cluster standby rhel-act
# pcs status
Cluster name: cluster
Last updated: Sun Jul 10 22:18:02 2016          Last change: Sun Jul 10 22:16:14 2016 by root via crm_attribute on rhel-act
Stack: cman
Current DC: rhel-act (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 5 resources configured

Node rhel-act: standby
Online: [ rhel-sta ]

Full list of resources:

 Resource Group: resource-group
     vip1       (ocf::heartbeat:IPaddr2):       Started rhel-sta
     shared_device      (ocf::heartbeat:iscsi): Started rhel-sta
     shared_mount       (ocf::heartbeat:Filesystem):    Started rhel-sta
     program_logical    (ocf::heartbeat:anything):  Started rhel-sta

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

pcs cluster standby --allコマンドを実行すると、すべてのノードをオフラインにできます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# pcs cluster standby --all
# pcs status
Cluster name: cluster
Last updated: Sun Jul 10 22:20:14 2016          Last change: Sun Jul 10 22:19:26 2016 by root via crm_attribute on rhel-act
Stack: cman
Current DC: rhel-act (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 5 resources configured

Node rhel-act: standby
Node rhel-sta: standby

Full list of resources:

 Resource Group: resource-group
     vip1       (ocf::heartbeat:IPaddr2):       Stopped
     shared_device      (ocf::heartbeat:iscsi): Stopped
     shared_mount       (ocf::heartbeat:Filesystem):    Stopped
     program_logical    (ocf::heartbeat:anything):  Stopped

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

pcs cluster unstandbyコマンドを実行し、ノードをオンラインにします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# pcs cluster unstandby rhel-act
# pcs status
Cluster name: cluster
Last updated: Sun Jul 10 22:23:41 2016          Last change: Sun Jul 10 22:22:37 2016 by root via crm_attribute on rhel-act
Stack: cman
Current DC: rhel-act (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 5 resources configured

Node rhel-sta: standby
Online: [ rhel-act ]

Full list of resources:

 Resource Group: resource-group
     vip1       (ocf::heartbeat:IPaddr2):       Started rhel-act
     shared_device      (ocf::heartbeat:iscsi): Started rhel-act
     shared_mount       (ocf::heartbeat:Filesystem):    Started rhel-act
     program_logical    (ocf::heartbeat:anything):  Started rhel-act

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

pcs cluster unstandby --allコマンドを実行すると、すべてのノードをオンラインにできます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# pcs cluster unstandby --all
# pcs status
Cluster name: cluster
Last updated: Sun Jul 10 22:25:37 2016          Last change: Sun Jul 10 22:25:21 2016 by root via crm_attribute on rhel-act
Stack: cman
Current DC: rhel-act (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 5 resources configured

Online: [ rhel-act rhel-sta ]

Full list of resources:

 Resource Group: resource-group
     vip1       (ocf::heartbeat:IPaddr2):       Started rhel-act
     shared_device      (ocf::heartbeat:iscsi): Started rhel-act
     shared_mount       (ocf::heartbeat:Filesystem):    Started rhel-act
     program_logical    (ocf::heartbeat:anything):  Started rhel-act

PCSD Status:
  rhel-act: Online
  rhel-sta: Online

pcs resource moveコマンドを実行し、リソースの系切り替えを行います。たとえば、program_logicalrhel-staに移動させる場合、以下のコマンドを実行します:

1
# pcs resource move program_logical rhel-sta