お仕事で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の仕組みが変わっていると思いますので、ここでまとめた手順の通りにしてもおそらく動作しません。
ホスト名一覧などは以下のとおりです:
# | Hostname | IP Address | Remarks |
---|
1 | rhel-act | 192.168.56.31 | Active server |
2 | rhel-sta | 192.168.56.32 | Standby server |
3 | rhel-logical | 192.168.56.30 | Logical hostname / floating IP |
4 | rhel-iscsi | 192.168.56.40 | iScsi server |
簡単なネットワーク図はこちら:
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_logical
をrhel-sta
に移動させる場合、以下のコマンドを実行します:
1
| # pcs resource move program_logical rhel-sta
|