はじめに
冗長構成のためにcorosyncやheartbeatのを学ぼうと思いました。動作が良く分かっていないので、冗長構成を作りながら学んで行こうと思います。
CentOSで仮想IPを持たせ、Apacheの冗長構成を作成します。
コピペで後追い復習ができるようにしているので、Confや設定が多くなっています。
やること
仮想環境を4つ準備します。(CentOS6 Master/Slave, CentOS7 Master/Slave)
★ クラスタ制御をheartbeatとcorosyncで切り替えてみます。
◆ CentOS6と、Centos7のpacemaker+corosyncに違いがあるか確認します。
OS | クラスタ制御 | リソース制御 | 比較1 | 比較2 |
---|---|---|---|---|
CentOS 6 | heartbeat 3 | pacemaker 1.0 | ★ | |
CentOS 6 | corosync 1 | pacemaker 1.0 | ★ | ◆ |
CentOS 7 | corosync 2 | pacemaker 1.1 | ◆ |
コマンドの内容に関しては、本家の焼き直しです。
流れは以下の通りです。
- Vagrantを準備する
- Pacemakerを準備する
- CentOS6にheartbeat3とcorosync1とpacemaker1.0をインストールする
- CentOS7にcorosync2とpacemaker1.1をインストールする
- CentOS6でheartbeat3を動作させる
- CentOS6でpacemaker1.0を動作させる
- CentOS7でpacemaker1.1を動作させる
- 違いを感じる
環境は以下の通りです。
Windows 8.1 Pro x64
vagrant : 2.0.0
Oracle VM VirtualBox : 5.1.26 r117224 (Qt5.6.2)
Virtual machine : CentOS 6.5
Virtual machine : CentOS 7.1.1503
Network
------------------------
CentOS6
Main : 192.168.144.0/24
VM-1 : 192.168.144.21
VM-2 : 192.168.144.22
VM1-HTTPD : 192.168.144.20
Cluster : 192.168.145.0/24
VM-1(eth2) : 192.168.145.21 # Master
VM-2(eth2) : 192.168.145.22 # Slave
------------------------
CentOS7
Main : 192.168.144.0/24
VM-1 : 192.168.144.51
VM-2 : 192.168.144.52
VM1-HTTPD : 192.168.144.50
Cluster : 192.168.145.0/24
VM-1(eth2) : 192.168.145.51 # Master
VM-2(eth2) : 192.168.145.52 # Slave
------------------------
Apache : 2.4.27
OpenSSL : 1.0.2l
注意
分量がすごく多いです。回線速度にもよりますが、再現には最低でも1時間程度かかると思います。
学習時は、環境を1つに絞って実施したほうが効率が良いかもしれません。
特別な記述のない限り、記載された作業はMaster/Slaveの両方で実施します。
結論
やっていて気づいたことです。
heartbeatとcorosync
- ノードの指定でheartbeat3は
$id
が必要ですが、corosyncは必要ないようです。$idはheartbeatのUUIDになります。
pacemaker1.0と1.1
-
crm node list
やrecource
などのコマンドは、どちらも同じように使えるようです。 -
crm configure edit
で、CIBにダブルコーテーションを入力し保存しても、次に編集するときにダブルコーテーションが無くなっています。 - corosync1+pacemaker1.0は、stackにopenaisと表示されます。corosync2+pacemaker1.1は、stackにcorosyncと表示されます。stackにはクラスタ制御部分が表示されるようで、どちらもcorosyncを使っているので、リソース制御にopenaisを使っていることを示しているわけではないと思いますが…リソース制御部にOpenAISもあるので少し心配になりました。
corosync1と2
- Linux-ha Japan様の手続き上で見える違いですが、corosync1(+pacemaker1.0)ではcorosyncで認証キーの生成をしていません。corosync2(+pacemaker1.1)では、
corosync-keygen
で鍵を生成しています。corosync1(CentOS6)でも生成できますが、/dev/random
を使用するので、vagrant upしたばかりだとエントロピーが足りないと言われます。corosync2の手続きで認証キーを作成していますが、認証キーが無くても動作しました。 - corosync1ではCIBのノード名が
node VM-1
とhostnameのみ、corosync2ではnode 1084789043: VM-1
のように、値が入ります。
Vagrantの準備
Vagrant、Virtualboxのインストールや、Vagrant boxの追加の説明は割愛します。
以下をVagrantfileに追加します。
### CentOS6 VM-1のとき
(前略)
config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 6122, host_ip: "127.0.0.1"
config.vm.network "private_network", ip: "192.168.144.21", virtualbox__intnet: "intnet"
config.vm.network "private_network", ip: "192.168.145.21", virtualbox__intnet: "intnet"
config.vm.provider "virtualbox" do |vm|
vm.memory = 512
end
(後略)
-
end
はファイル終端のendではありません。 - リストに従い、VMによって割り振るIPアドレスを指定します。
- SSHポートは任意の値で構いません。1,000の桁をOSのバージョン、100の桁をMaster/Slaveの情報を入れると分かりやすいと思います。(CentOS7 VM-2なら7222)
Pacemakerのインストール
リポジトリのダウンロード
リポジトリをダウンロードします
osdn.netからダウンロードできるツリーはRHELのバージョンで分かれています。
[1-01]がRHEL7系、[1-02]がRHEL6系、[1-03]がRHEL5系です。
Linux-HA-Japanの公式ページによると2017年9月現在、1.1系と1.0系があります。
Pacemaker1.1にはcorosync2系、
Pacemaker1.0にはheartbeat2系とあります。
1.0でダウンロードできるリポジトリにはheartbeat-3.0.5-1.1.el6.x86_64.rpmとあり、el5のリポジトリパッケージもheartbeat-3.0.5-1.1.el5.i386.rpm、インストール方法にもheartbeat3とあるので誤記かもしれません。
### 両方ダウンロードします
# pacemaker 1.1.16 + corosync
wget -P /tmp https://ja.osdn.net/dl/linux-ha/pacemaker-repo-1.1.16-1.1.el6.x86_64.rpm
# pacemaker 1.0.13 + heartbeat
wget -P /tmp https://ja.osdn.net/dl/linux-ha/pacemaker-1.0.13-2.1.el6.x86_64.repo.tar.gz && \
tar xvf /tmp/pacemaker-1.0.13-2.1.el6.x86_64.repo.tar.gz -C /tmp && \
cp /tmp/pacemaker-1.0.13-2.1.el6.x86_64.repo/pacemaker.repo /etc/yum.repos.d/pacemaker.repo
# pacemaker 1.1.16 + corosync
wget -P /tmp https://ja.osdn.net/dl/linux-ha/pacemaker-repo-1.1.16-1.1.el7.x86_64.rpm
# pacemaker 1.0.13 + heartbeat
RHEL7系のpacemakerは1.1.12からでこの組み合わせは選べないようです
Linux-HA Japan(ja.osdn.net)
OSDNのlinux-ha Japanのダウンロード一覧(linux-ha.osdn.jp)
CentOS-Base.repoの編集
事前にCentOS同梱のものと混在しないようにexcludeを設定します。
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
# baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+ exclude=pacemaker* corosync* resource-agents* crmsh* cluster-glue* libqb* fence-agents* pcs*
# released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
# baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+ exclude=pacemaker* corosync* resource-agents* crmsh* cluster-glue* libqb* fence-agents* pcs*
# additional packages that may be useful
参考資料
3. インストール前の準備(linux-ha.osdn.jp)
インストール
ダウンロードしたリポジトリからインストールします。
heartbeatは自動起動しないように設定します。
### 選択してインストールする
[root@VM-1]# yum -c /etc/yum.repos.d/pacemaker.repo install -y corosync.x86_64 heartbeat.x86_64 pacemaker.x86_64
### インストール後のchkconfig
[root@VM-1]# chkconfig | grep -E 'heartbeat|corosync'
corosync 0:off 1:off 2:off 3:off 4:off 5:off 6:off
heartbeat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
### heartbeatの自動起動を無効化
[root@VM-1]# chkconfig --level 2345 heartbeat off
[root@VM-1]# yum install -y /tmp/pacemaker-repo-1.1.16-1.1.el7.x86_64.rpm && \
yum install -y pacemaker-all
### 自動起動の確認(末尾のdisabled)
[root@VM-1]# systemctl status pacemaker | grep loaded
Loaded: loaded (/usr/lib/systemd/system/pacemaker.service; disabled)
[root@VM-1]# systemctl status corosync | grep loaded
Loaded: loaded (/usr/lib/systemd/system/corosync.service; disabled)
- Linux-HA-Japanのインストール手順では、クラスタ制御の選択にかかわらず、heartbeatもcorosyncもインストールさせているようです。どちらのRA(Resource Agent)も使えるようにするためでしょうか。
インストールしたバージョンを確認します。
[root@VM-1]# corosync -v
Corosync Cluster Engine, version '1.4.6'
Copyright (c) 2006-2009 Red Hat, Inc.
[root@VM-1]# corosync -v
Corosync Cluster Engine, version '2.4.2'
Copyright (c) 2006-2009 Red Hat, Inc.
[root@VM-1]# /usr/lib64/heartbeat/crmd version
CRM Version: 1.0.13 (a83fae5)
[root@VM-1]# /usr/sbin/pacemakerd --version
Pacemaker 1.1.16-1.el7
Written by Andrew Beekhof
- heartbeatのバージョンの確認方法はわかりません。
- pacemakerのバージョンは、crmdのバージョンにあてはまるようです。pacemaker1.0系と1.1系で見えるcrmdのバージョンがそのように見えます
設定
CentOS6ではpacemaker1.0をheartbeat3とcorosync1から動作させます。ここではheartbeat、corosyncを設定します。
CentOS7ではpacemakerとcorosyncを設定します。
基本的にVM-1で作成・編集したものを、SCPを使ってVM-2側に上書きコピーします。
/etc/hosts
相互に名前で通信できるように設定します。
# CentOS6
echo -e "192.168.144.21 VM-1\n\
192.168.144.22 VM-2\n\
192.168.144.20 VM1-HTTPD" >> /etc/hosts
# CentOS7
echo -e "192.168.144.51 VM-1\n\
192.168.144.52 VM-2\n\
192.168.144.50 VM1-HTTPD" >> /etc/hosts
[root@VM-1]# scp -p /etc/hosts root@VM-2:/etc/hosts
conf系の設定
Pacemaker
pacemaker1.1系のみ、追加の設定が必要です。
pacemakerの設定ファイルを設定します。
設定ファイル
# 不要、ファイルが無い
[root@VM-1]# sed -ie 's:#\ PCMK_fail_fast=no:#\ PCMK_fail_fast=no\nPCMK_fail_fast=yes:g' /etc/sysconfig/pacemaker
[root@VM-1]# scp -p /etc/sysconfig/pacemaker root@VM-2:/etc/sysconfig/pacemaker
- Pacemaker1.1系をCentOS6で利用するときは、修正内容が異なります。ここでは割愛します。linux-ha.osdn.jpのページを参照してください。
参考資料
5.3. pacemaker設定ファイルの設定(RHEL 7用)(linux-ha.osdn.jp)
起動スクリプト
Pacemakerの起動スクリプトを設定します。(CentOS7)
[root@VM-1]# cp -p /usr/lib/systemd/system/pacemaker.service \
/etc/systemd/system/pacemaker.service
[root@VM-1]# sed -ie "s:# ExecStopPost=/bin/sh -c 'pidof crmd || killall -TERM corosync':# ExecStopPost=/bin/sh -c 'pidof crmd || killall -TERM corosync'\nExecStopPost=/bin/sh -c 'pidof crmd || killall -TERM corosync':g" /etc/systemd/system/pacemaker.service
[root@VM-1]# scp -p /etc/systemd/system/pacemaker.service root@VM-2:/etc/systemd/system/pacemaker.service
- Pacemaker1.1系をCentOS6で利用するときは、修正内容が異なります。ここでは割愛します。
参考資料
5.4.2. クラスタ起動スクリプトの設定(RHEL 7用)(linux-ha.osdn.jp)
corosync
corosyncの設定です。
corosync.confの作成と、corosync認証鍵ファイルの設定、クラスタ起動スクリプトの設定が必要です。
confの作成
corosync1系と2系で若干異なるようです。
aisexec {
user: root
group: root
}
service {
name: pacemaker
ver: 0
use_mgmtd: yes
}
totem {
version: 2
secauth: off
threads: 0
rrp_mode: active
clear_node_high_bit: yes
token: 4000
consensus: 10000
rrp_problem_count_timeout: 3000
interface {
ringnumber: 0
bindnetaddr: 192.168.145.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
logging {
fileline: on
to_syslog: yes
syslog_facility: local2
syslog_priority: info
debug: off
timestamp: on
}
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: none
clear_node_high_bit: yes
token: 4000
censensus: 10000
join: 60
interface {
member {
memberaddr: 192.168.145.51
}
member {
memberaddr: 192.168.145.52
}
ringnumber: 0
bindnetaddr: 192.168.145.0
mcastport: 5405
ttl: 1
}
transport: udpu
}
logging {
fileline: off
to_logfile: yes
to_syslog: no
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
syslog_facility: local2
logger_subsys {
subsys: AMF
debug: off
}
}
quorum {
provider: corosync_votequorum
expected_votes: 2
two_node: 1
}
[root@VM-1]# scp -p /etc/corosync/corosync.conf root@VM-2:/etc/corosync/corosync.conf
-
{
}
が出てきたら必ず改行が必要です。中括弧を}}
のように重複させてもエラーになります。 - ディレクティブの行末に**
{
は置けますが、ディレクティブの最後に}
を置くことはできないようです。}
**は1行に1つそれだけを置く必要があります。 - corosync1/2系とも同じ仕様のようです。
### CentOS6
[root@VM-1]# service corosync start
Starting Corosync Cluster Engine (corosync): [FAILED]
### CentOS7
[root@VM-1]# service corosync start
Job for corosync.service failed. See 'systemctl status corosync.service' and 'journalctl -xn' for details.
[root@VM-1]# jounalctl -xn
(前略)
-- Unit corosync.service has begun starting up.
Sep 19 12:42:02 VM-1 corosync[25365]: [MAIN ] parser error: Missing closing brace
Sep 19 12:42:02 VM-1 corosync[25365]: [MAIN ] Corosync Cluster Engine exiting with status 8 at main.c:1230.
Sep 19 12:42:02 VM-1 corosync[25359]: Starting Corosync Cluster Engine (corosync): [FEHLGESCHLAGEN]
Sep 19 12:42:02 VM-1 systemd[1]: corosync.service: control process exited, code=exited status=1
Sep 19 12:42:02 VM-1 systemd[1]: Failed to start Corosync Cluster Engine.
-- Subject: Unit corosync.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit corosync.service has failed.
--
-- The result is failed.
Sep 19 12:42:02 VM-1 systemd[1]: Unit corosync.service entered failed state.
### Not Good
aisexec { user: root
group: root }
### Good
aisexec {
user: root
group: root
}
参考資料
クラスタ制御部にCorosyncを使用する場合の設定(linux-ha.osdn.jp)
corosync.conf の各種項目を調べた(使うやつを中心に)(gist.github.com/inokappa)
認証鍵の作成
corosync認証鍵ファイルを設定します。
VM-1で認証鍵を生成し、SCPでVM-2へコピーします。
鍵の生成
[root@VM-1]# corosync-keygen -l
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
鍵のコピー(VM-1を操作してVM-1からVM-2へコピー)
[root@VM-1]# scp -p /etc/corosync/authkey root@VM-2:/etc/corosync/authkey
- CentOS6/pacemaker1.0+corosync1でも、
corosync-keygen
コマンドが動作しますが、認証鍵を生成しなくても動作するようです。生成する場合は/dev/random
を使うため、環境を作成したばかりだとエントロピーが足りないといわれる場合があります。
クラスタ起動スクリプトの設定
CentOS7のみcorosyncの起動スクリプトを修正します。
[root@VM-1]# cp -p /usr/lib/systemd/system/corosync.service \
/etc/systemd/system/corosync.service
[root@VM-1]# sed -ie 's:#Restart=on-failure:#Restart=on-failure\nRestart=on-failure:g' /etc/systemd/system/corosync.service
[root@VM-1]# sed -ie 's:#RestartSec=70:#RestartSec=70\nRestartSec=70:g' /etc/systemd/system/corosync.service
[root@VM-1]# sed -ie 's:#ExecStartPre=/sbin/modprobe softdog soft_margin=60:#ExecStartPre=/sbin/modprobe softdog soft_margin=60\nExecStartPre=/sbin/modprobe\ softdog:g' /etc/systemd/system/corosync.service
heartbeat
heartbeatの設定です。CentOS6での作業です。
/etc/ha.d/ha.cfの作成と、認証キーファイルの配置が必要です。
ha.cfの作成
pacemaker on
logfacility local1
debug 0
udpport 694
keepalive 2
warntime 20
deadtime 24
initdead 48
bcast eth2
node VM-1
node VM-2
watchdog /dev/watchdog
[root@VM-1]# scp -p /etc/ha.d/ha.cf root@VM-2:/etc/ha.d/ha.cf
-
logfacility local1
は、syslogまたはrsyslogでログを取るとき、既存の/var/log/messagesと分けるために設定します。 - nodeにはhostnameの名前を指定します。
認証キーの作成
鍵の生成
[root@VM-1]# echo -e "auth 1\n1 sha1 abcdefg" > /etc/ha.d/authkeys && \
chown root:root /etc/ha.d/authkeys && \
chmod 600 /etc/ha.d/authkeys
鍵のコピー(VM-1を操作してVM-1からVM-2へコピー)
[root@VM-1]# scp -p /etc/ha.d/authkeys root@VM-2:/etc/ha.d/authkeys
[root@VM-1]# service heartbeat start
Starting High-Availability services: Heartbeat failure [rc=6]. Failed.
heartbeat[5207]: 2017/09/14_00:36:24 info: Pacemaker support: on
heartbeat: udpport setting must precede media statementsheartbeat[5207]: 2017/09/14_00:36:24 ERROR: Cannot open keyfile [/etc/ha.d//authkeys]. Stop.
heartbeat[5207]: 2017/09/14_00:36:24 ERROR: Authentication configuration error.
heartbeat[5207]: 2017/09/14_00:36:24 ERROR: Configuration error, heartbeat not started.
参考資料
クラスタ制御部にHeartbeat3を使用する場合の設定(linux-ha.osdn.jp)
ログの設定
これまで設定では、heartbeatはsyslogにファシリティlocal1、corosyncはlocal2で保存するように設定しています。
クラスタ制御 | リソース制御 | ログの設定 | ディレクティブ |
---|---|---|---|
heartbeat3 | pacemaker1.0 | ha.cf | logfacility |
corosync1 | pacemaker1.0 | corosync.conf | to_syslog syslog_facility |
corosync2 | pacemaker1.1 | corosync.conf | to_syslog syslog_facility |
他のログ/var/log/messages
と分けて保存したいので、syslogのconfigを修正します。
下記のどちらか
/etc/syslog.conf
/etc/rsyslog.conf
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
# kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
- *.info;mail.none;authpriv.none;cron.none /var/log/messages
+ *.info;mail.none;authpriv.none;cron.none;local1.none;local2.none /var/log/messages
(中略)
+ # Heartbeat messages
+ local1.* /var/log/ha-log
+ # corosync messages
+ local2.* /var/log/corosync.log
# syslogのとき
[root@VM-1]# scp -p /etc/syslog.conf root@VM-2:/etc/syslog.conf
# rsyslogのとき
[root@VM-1]# scp -p /etc/rsyslog.conf root@VM-2:/etc/rsyslog.conf
- ここではheartbeatをlocal1へ、corosyncをlocal2へ出力するようにします。
参考資料
syslogを押さえよう!-ログの出力方法(thinkit.co.jp)
SYSLOGのファシリティとは?(www.furukawa.co.jp)
疎通の確認
heartbeatやcorosyncが起動する準備が整いました。
heartbeatやcorosyncを起動して、Master/Slave間で認識されるか確認します。
クラスタの起動と状態確認
CentOS6 heartbeatのパターンを試します。
heartbeatを起動します。
# --------------- VM-1側 ---------------
[root@VM-1]# service heartbeat start
Starting High-Availability services: Done.
# --------------- VM-2側 ---------------
[root@VM-2]# service heartbeat start
Starting High-Availability services: Done.
- heartbeatは起動後、1分程度経たないとcrm_monから確認できません。
[root@VM-1]# crm_mon -Afro1
Connection to cluster failed: connection failed
heartbeatの状態を確認します。
# --------------- VM-1側 ---------------
[root@VM-1]# crm_mon -Afro1
============
Last updated: Thu Sep 28 08:25:11 2017
Stack: Heartbeat
Current DC: vm-1 (6dfd3382-eddc-4762-84d5-2c047475b88c) - partition with quorum
Version: 1.0.13-a83fae5
1 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ vm-1 ]
Full list of resources:
Node Attributes:
* Node vm-1:
Operations:
* Node vm-1:
# --------------- VM-2側 ---------------
[root@VM-2]# crm_mon -Afro1
============
Last updated: Thu Sep 28 08:25:13 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
1 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ vm-2 ]
Full list of resources:
Node Attributes:
* Node vm-2:
Operations:
* Node vm-2:
CentOS7 corosyncのパターンを試します。
# --------------- VM-1側 ---------------
[root@VM-1]# systemctl start pacemaker
[root@VM-1]# crm_mon -Afro1
Stack: corosync
Current DC: VM-1 (version 1.1.16-1.el7-94ff4df) - partition WITHOUT quorum
Last updated: Thu Sep 28 13:20:23 2017
Last change: Thu Sep 28 13:19:34 2017 by hacluster via crmd on VM-1
1 node configured
0 resources configured
Online: [ VM-1 ]
No resources
Node Attributes:
* Node VM-1:
Operations:
* Node VM-1:
# --------------- VM-2側 ---------------
[root@VM-2]# systemctl start pacemaker
Stack: corosync
Current DC: VM-2 (version 1.1.16-1.el7-94ff4df) - partition WITHOUT quorum
Last updated: Thu Sep 28 13:20:54 2017
Last change: Thu Sep 28 13:19:36 2017 by hacluster via crmd on VM-2
1 node configured
0 resources configured
Online: [ VM-2 ]
No resources
Node Attributes:
* Node VM-2:
Operations:
* Node VM-2:
[root@VM-1]# crm_mon -Afro1
Stack: unknown
Current DC: NONE
Last updated: Thu Sep 28 13:19:19 2017 Last change:
0 nodes configured
0 resources configured
No resources
Node Attributes:
Operations:
- heartbeat, corosync, どちらも、自分自身の端末を認識しているようです。
- CentOS7でcorosync2+pacemaker1.1を起動するときは、pacemakerのサービスのみ起動させます。
-
mv /etc/corosync/authkey /etc/corosync/back.authkey.up
のように、認証キーファイルが無い状態でも動作します。
IP疎通の確認
ネットワークが正常につながっているか確認します。
CentOS7の記述は割愛します。
[root@VM-1]# ip a | grep -E 'inet |^[0-9]'
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.144.21/24 brd 192.168.144.255 scope global eth1
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.145.21/24 brd 192.168.145.255 scope global eth2
[root@VM-2]# ip a | grep -E 'inet |^[0-9]'
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.144.22/24 brd 192.168.144.255 scope global eth1
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.145.22/24 brd 192.168.145.255 scope global eth2
[root@VM-1]# ping 192.168.144.22 -c1
PING 192.168.144.22 (192.168.144.22) 56(84) bytes of data.
64 bytes from 192.168.144.22: icmp_seq=1 ttl=64 time=0.204 ms
--- 192.168.144.22 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.204/0.204/0.204/0.000 ms
- pingは通ります。
ポートが塞がっている可能性があるので、iptablesを止めてみます。
# CentOS6
service iptables stop
chkconfig --level 2345 iptables off
# CentOS7
systemctl stop firewalld
systemctl disable firewalld
### CentOS6 heartbeat3 + pacemaker1.0
[root@VM-1]# crm_mon -Afro1
============
Last updated: Thu Sep 28 08:27:59 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ vm-1 vm-2 ]
Full list of resources:
Node Attributes:
* Node vm-1:
* Node vm-2:
Operations:
* Node vm-1:
* Node vm-2:
### CentOS7 corosync2 + pacemaker1.1
[root@VM-1]# crm_mon -Afro1
Stack: corosync
Current DC: VM-1 (version 1.1.16-1.el7-94ff4df) - partition with quorum
Last updated: Thu Sep 28 13:23:08 2017
Last change: Thu Sep 28 13:22:42 2017 by hacluster via crmd on VM-2
2 nodes configured
0 resources configured
Online: [ VM-1 VM-2 ]
No resources
Node Attributes:
* Node VM-1:
* Node VM-2:
Operations:
* Node VM-2:
* Node VM-1:
Master/Slave間で認識するようになりました。
Firewallが必要な環境ではポートを空けます。
リソースの準備
仮想IPとApacheを準備します。
仮想IP
仮想IPはIPaddr2のリソースエージェントを使用するので、
IPアドレスを決めておくだけです。
Apache
Apacheはソースからインストールします。
デフォルトではMPM eventなので、preforkにするときはコンパイルに--with-mpm=prefork
を追加します。
### expat-develのインストール
yum install -y expat-devel gcc pcre pcre-devel && \
### ダウンロード openssl apr apr-util apache
wget -P /tmp https://www.openssl.org/source/openssl-1.0.2l.tar.gz && \
wget -P /tmp http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.6.2.tar.gz && \
wget -P /tmp http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.0.tar.gz && \
wget -P /tmp http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.27.tar.gz && \
### ダウンロードしたファイルの展開
tar xf /tmp/openssl-1.0.2l.tar.gz -C /tmp && \
tar xf /tmp/apr-1.6.2.tar.gz -C /tmp && \
tar xf /tmp/apr-util-1.6.0.tar.gz -C /tmp && \
tar xf /tmp/httpd-2.4.27.tar.gz -C /tmp && \
### 展開したファイルをVM-1用にコピー
cp -rp /tmp/openssl-1.0.2l /tmp/openssl-1.0.2l_vm1 && \
cp -rp /tmp/apr-1.6.2 /tmp/apr-1.6.2_vm1 && \
cp -rp /tmp/apr-util-1.6.0 /tmp/apr-util-1.6.0_vm1 && \
cp -rp /tmp/httpd-2.4.27 /tmp/httpd-2.4.27_vm1 && \
### インストール
cd /tmp/openssl-1.0.2l_vm1 ; /tmp/openssl-1.0.2l_vm1/config --prefix=/opt/openssl-1.0.2l_vm1 shared zlib -fPIC && \
make depend -I /tmp/openssl-1.0.2l && \
make -I /tmp/openssl-1.0.2l && make test -I /tmp/openssl-1.0.2l_vm1 && \
make install -I /tmp/openssl-1.0.2l_vm1 && \
cd /tmp/apr-1.6.2_vm1 ; /tmp/apr-1.6.2_vm1/configure --prefix=/opt/apr-1.6.2_vm1 && \
make -I /tmp/apr-1.6.2_vm1 && \
make install -I /tmp/apr-1.6.2_vm1 && \
cd /tmp/apr-util-1.6.0_vm1 ; /tmp/apr-util-1.6.0_vm1/configure --prefix=/opt/apr-util-1.6.0_vm1 --with-apr=/opt/apr-1.6.2_vm1 && \
make -I /tmp/apr-util-1.6.0_vm1 && make test -I /tmp/apr-util-1.6.0_vm1 && \
make install -I /tmp/apr-util-1.6.0_vm1 && \
cd /tmp/httpd-2.4.27_vm1 ; /tmp/httpd-2.4.27_vm1/configure \
--prefix=/opt/apache-2.4.27_vm1 \
--enable-ssl --with-ssl=/opt/openssl-1.0.2l_vm1 \
--with-apr=/opt/apr-1.6.2_vm1 \
--with-apr-util=/opt/apr-util-1.6.0_vm1 \
--enable-mpms-shared=all && \
make -I /tmp/httpd-2.4.27_vm1 && \
make install -I /tmp/httpd-2.4.27_vm1
### mod_systemdの適用
yum install --downloadonly --downloaddir=/tmp httpd && \
cd /tmp && \
rpm2cpio /tmp/httpd-2.4*el7.centos*x86_64.rpm | cpio -id ./usr/lib64/httpd/modules/mod_systemd.so && \
cp /tmp/usr/lib64/httpd/modules/mod_systemd.so /opt/apache-2.4.27_vm1/modules/mod_systemd.so && \
sed -i -e 's/<IfModule\ unixd_module>/LoadModule\ systemd_module\ modules\/mod_systemd.so\n<IfModule\ unixd_module>/g' /opt/apache-2.4.27_vm1/conf/httpd.conf
httpd.confの設定
httpd.confを編集します。
Listenディレクティブに仮想IPを指定します。
ServerNameには/etc/hostsで設定した名前を指定します。
### CentOS6
(前略)
# Listen 12.45.56.78:80
- Listen 80
+ Listen 192.168.144.20:80
(中略)
### CentOS7
(前略)
# Listen 12.45.56.78:80
- Listen 80
+ Listen 192.168.144.50:80
(中略)
### 共通
# ServerName www.example.com:80
+ ServerName VM1-HTTPD:80
(後略)
# 設定のコピー
[root@VM-1]# scp -p /opt/apache-2.4.27_vm1/conf/httpd.conf root@VM-2:/opt/apache-2.4.27_vm1/conf/httpd.conf
起動用ファイルの設定
起動用の設定ファイルを設置します。
ここではhttpd_vm1とします。
CentOS6系
cp -p /tmp/httpd-2.4.27_vm1/build/rpm/httpd.init /etc/init.d/httpd_vm1
(前略)
- httpd=${HTTPD-/usr/sbin/httpd}
+ #httpd=${HTTPD-/usr/sbin/httpd}
+ httpd=/opt/apache-2.4.27_vm1/bin/httpd
- pidfile=${PIDFILE-/var/run/${prog}.pid}
+ #pidfile=${PIDFILE-/var/run/${prog}.pid}
+ pidfile=/opt/apache-2.4.27_vm1/logs/httpd.pid
(中略)
check13 () {
- CONFFILE=/etc/httpd/conf/httpd.conf
+ #CONFFILE=/etc/httpd/conf/httpd.conf
+ CONFFILE=/opt/apache-2.4.27_vm1/conf/httpd.conf
(後略)
[root@VM-1]# scp -p /etc/init.d/httpd_vm1 root@VM-2:/etc/init.d/httpd_vm1
- pidfileは直接設定、lockfileはデフォルト。
CentOS7系
echo -e "[Unit]\n\
Description=The Apache HTTP Server\n\
After=network.target remote-fs.target nss-lookup.target\n\
Documentation=man:httpd(8)\n\
Documentation=man:apachectl(8)\n\n\
[Service]\n\
Type=forking\n\
ExecStart=/opt/apache-2.4.27_vm1/bin/apachectl start \n\
ExecReload=/opt/apache-2.4.27_vm1/bin/apachectl graceful\n\
ExecStop=/opt/apache-2.4.27_vm1/bin/apachectl stop\n\
# We want systemd to give httpd some time to finish gracefully, but still want\n\
# it to kill httpd after TimeoutStopSec if something went wrong during the\n\
# graceful stop. Normally, Systemd sends SIGTERM signal right after the\n\
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give\n\
# httpd time to finish.\n\
KillSignal=SIGCONT\n\
PrivateTmp=true\n\n\
[Install]\n\
WantedBy=multi-user.target" >> /usr/lib/systemd/system/httpd_vm1.service
[root@VM-1]# scp -p /usr/lib/systemd/system/httpd_vm1.service root@VM-2:/usr/lib/systemd/system/httpd_vm1.service
以上でApacheリソースの準備が完了しました。
冗長構成へ組み込む
リソースがそろったので、それぞれの環境で動作させます。
名前の混同を避けるため、マシン名を斜体、それ以外を太字で記述します。
ここでは、CentOS6で以下の流れで確認します。
リソースの追加、crm/*.rawファイルの確認、CIBへApacheとIPAddrの追加、リソースの起動、リソースの切り替えを行います。
CentOS7は冗長構成へ組み込む#2になります。
Heartbeat
CentOS6です。
リソース稼働の確認
Dummyリソース
Dummyリソースを作成し、正常に稼働するか確認します。
heartbeatをVM-1、VM-2で起動します。
# ------ 起動中のとき ------
[root@VM-1]# service heartbeat status
heartbeat OK [pid 5403 et al] is running on vm-1 [vm-1]...
# ------ 停止しているとき ------
[root@VM-1]# service heartbeat status
heartbeat is stopped. No process
[root@VM-1]# service heartbeat start
Starting High-Availability services: Done.
hostnameがha.cfのnodeと違うと以下のエラーが出て起動しません。
info: By default, cluster nodes are named by `uname -n` and must be declared with a 'node' directive in the ha.cf file.
heartbeatの設定をします。
heartbeatは/var/lib/heartbeat/crm/
にcib.xml
ファイルで設定を保持しています。
cib.xmlの一部を確認します。
### 後でファイルを調べるために余計なファイルを一度消去します
# --------------- VM-1側 ---------------
[root@VM-1]# rm -f /var/lib/heartbeat/crm/cib-*
[root@VM-1]# ls -l /var/lib/heartbeat/crm
total 12
-rw-r--r-- 1 hacluster haclient 2 Sep 28 08:27 cib.last
-rw------- 1 hacluster haclient 813 Sep 28 08:27 cib.xml
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:27 cib.xml.sig
# --------------- VM-2側 ---------------
[root@VM-2]# rm -f /var/lib/heartbeat/crm/cib-*
[root@VM-2]# ls -l /var/lib/heartbeat/crm
total 12
-rw-r--r-- 1 hacluster haclient 2 Sep 28 08:27 cib.last
-rw------- 1 hacluster haclient 813 Sep 28 08:27 cib.xml
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:27 cib.xml.sig
[root@VM-1]# cat /var/lib/heartbeat/crm/cib.xml | grep uuid
<cib epoch="6" num_updates="0" admin_epoch="0" validate-with="pacemaker-1.0" crm_feature_set="3.0.1" have-quorum="1" dc-uuid="962ec26d-9e70-45a1-a93a-0a5455486024" cib-last-written="Thu Sep 28 08:27:54 2017">
[root@VM-2]# cat /var/lib/heartbeat/crm/cib.xml | grep uuid
<cib epoch="6" num_updates="0" admin_epoch="0" validate-with="pacemaker-1.0" crm_feature_set="3.0.1" have-quorum="1" dc-uuid="962ec26d-9e70-45a1-a93a-0a5455486024" cib-last-written="Thu Sep 28 08:27:48 2017">
- 属性の順番がVM-1とVM-2で異なるときがありますが、同じ内容が保たれているようです。
設定のcib.xmlを編集します。
crm configure edit
はviでClusterInformation Base(CIB)を編集するモードです。
[root@VM-1]# crm configure edit
node $id="6dfd3382-eddc-4762-84d5-2c047475b88c" VM-1
node $id="962ec26d-9e70-45a1-a93a-0a5455486024" VM-2
+ primitive VM-dummy ocf:pacemaker:Dummy \
+ op start interval="0s" timeout="90s" \
+ op monitor interval="3s" timeout="20s" \
+ op stop interval="0s" timeout="100s"
property $id="cib-bootstrap-options" \
dc-version="1.0.13-a83fae5" \
- cluster-infrastructure="Heartbeat"
+ cluster-infrastructure="Heartbeat" \
+ stonith-enabled="false" \
+ no-quorum-policy="ignore"
- +と-は視認性のものなので、実際には入力しません。
:wq
の上書き保存で抜けたあと、リソースを確認します。INFO: building help index
と出る場合があるようです。
[root@VM-1]# crm configure edit
INFO: building help index
[root@VM-1]# crm_mon -Afro1
============
Last updated: Thu Sep 28 08:58:24 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
Online: [ vm-1 vm-2 ]
Full list of resources:
VM-dummy (ocf::pacemaker:Dummy): Started vm-2
Node Attributes:
* Node vm-1:
* Node vm-2:
Operations:
* Node vm-1:
* Node vm-2:
VM-dummy: migration-threshold=1000000
+ (3) start: rc=0 (ok)
+ (4) monitor: interval=3000ms rc=0 (ok)
- VM-2が Current DC となっており、VM-dummyリソースがVM-2で稼働しています。
cib.xml以外は?
crm configure editで編集していくと、/var/lib/heartbeat/crm/
の中身がどんどん増えていきます。一体何が起きているのかを確認します。
[root@VM-1]# ls -l /var/lib/heartbeat/crm
total 20
-rw------- 1 hacluster haclient 813 Sep 28 08:27 cib-5.raw
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:27 cib-5.raw.sig
-rw-r--r-- 1 hacluster haclient 1 Sep 28 08:57 cib.last
-rw------- 1 hacluster haclient 1411 Sep 28 08:57 cib.xml
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:57 cib.xml.sig
[root@VM-2]# ls -l /var/lib/heartbeat/crm/
total 20
-rw------- 1 hacluster haclient 813 Sep 28 08:27 cib-4.raw
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:27 cib-4.raw.sig
-rw-r--r-- 1 hacluster haclient 1 Sep 28 08:57 cib.last
-rw------- 1 hacluster haclient 1411 Sep 28 08:57 cib.xml
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:57 cib.xml.sig
- Dummyリソースを追加したあと、cib.xmlが更新され、VM-1ではcib-5.rawが、VM-2ではcib-4.rawが追加されています。ファイルサイズからすると、編集前のcib.xmlと一致しそうです。
増えた他のファイルを見てみます。
[root@VM-1]# cat /var/lib/heartbeat/crm/cib-5.raw.sig
ba7d98aeb04d9e36b39a36c19ee42dee
[root@VM-1]# cat /var/lib/heartbeat/crm/cib.last
6
[root@VM-2]# cat /var/lib/heartbeat/crm/cib-4.raw.sig
b29823d7a2d250a300a34ebce29f1f64
[root@VM-2]# cat /var/lib/heartbeat/crm/cib.last
5
- .sigは何かのハッシュ値でしょうか。
- cib.lastは、直前のrawの値に+1しているように見えます。
MD5ハッシュかどうか確認します。
[root@VM-1]# cat /var/lib/heartbeat/crm/cib-5.raw.sig
ba7d98aeb04d9e36b39a36c19ee42dee
[root@VM-1]# md5sum /var/lib/heartbeat/crm/cib*
188e4b4e9b6247b9ca14dbf9f8b9e11f /var/lib/heartbeat/crm/cib-5.raw
3df0f8bb96b4e051c17c0c8c2622b86c /var/lib/heartbeat/crm/cib-5.raw.sig
1679091c5a880faf6fb5e6087eb1b2dc /var/lib/heartbeat/crm/cib.last
917e62d6445e44b5824160ea0634de31 /var/lib/heartbeat/crm/cib.xml
a2768f34ed12868a3e819d84dce8dc3d /var/lib/heartbeat/crm/cib.xml.sig
- どれも当てはまりません。MD5ではないようです。諦めました。
cib.lastは本当に直前のcib-[]の値に+1しているのか確認します。
VM-dummyリソースを停止状態にしてみます。
[root@VM-1]# crm resource stop VM-dummy
もしくは
[root@VM-1]# crm configure edit
(中略)
primitive VM-dummy ocf:pacemaker:Dummy \
op start interval="0s" timeout="90s" \
op monitor interval="3s" timeout="20s" \
- op stop interval="0s" timeout="100s"
+ op stop interval="0s" timeout="100s" \
+ meta target-role="Stopped"
リソースが停止していることを確認します。
[root@VM-1]# crm_mon -Afro1
(前略)
VM-dummy (ocf::pacemaker:Dummy): Stopped
(中略)
Operations:
* Node vm-1:
* Node vm-2:
VM-dummy: migration-threshold=1000000
+ (3) start: rc=0 (ok)
+ (4) monitor: interval=3000ms rc=0 (ok)
+ (5) stop: rc=0 (ok)
増えたファイルを確認します。
[root@VM-1]# ls -l /var/lib/heartbeat/crm/
total 28
-rw------- 1 hacluster haclient 813 Sep 28 08:27 cib-5.raw
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:27 cib-5.raw.sig
-rw------- 1 hacluster haclient 1411 Sep 28 08:57 cib-6.raw
-rw-r--r-- 1 hacluster haclient 32 Sep 28 08:57 cib-6.raw.sig
-rw-r--r-- 1 hacluster haclient 1 Sep 28 09:06 cib.last
-rw------- 1 hacluster haclient 1592 Sep 28 09:06 cib.xml
-rw-r--r-- 1 hacluster haclient 32 Sep 28 09:06 cib.xml.sig
[root@VM-1]# cat /var/lib/heartbeat/crm/cib-6.raw.sig
bdfdf7c98398fc73f126a0ed6672d4f6
[root@VM-1]# cat /var/lib/heartbeat/crm/cib.last
7
- 増えています。cib.lastは使用中のcib.xmlの世代を示しているようです。cib-00.rawの00の部分が世代を表し、直前に使用されたcib.xmlは、cib.lastの値から1を引いた数のrawファイルになると思われます。
Apacheリソース
クラスタ管理が正常に稼働することがわかったので、apacheを管理するVM-1-apacheリソースを追加します。
ついでに、VM-dummyを削除し、VM-1-apacheをVM-1gへグルーピングします。
VM-1-apacheはVM-1をメインとして動いて欲しいので、VM-1lというlocationも設定します。
[root@VM-1]# crm resource stop VM-dummy
もしくは ```meta target-role="Stopped"```を
リソースの末尾に記載して停止します。
[root@VM-1]# crm configure edit
node $id="6dfd3382-eddc-4762-84d5-2c047475b88c" VM-1
node $id="962ec26d-9e70-45a1-a93a-0a5455486024" VM-2
+ # VM-1-apacheリソースをストップ状態で追加
+ primitive VM-1-apache lsb:httpd_vm1 \
+ op start interval="0s" timeout="90s" \
+ op monitor interval="3s" timeout="20s" \
+ op stop interval="0s" timeout="100s" standby="on" \
+ meta target-role="Stopped"
- # VM-dummyを削除
- primitive VM-dummy ocf:pacemaker:Dummy \
- op start interval="0s" timeout="90s" \
- op monitor interval="3s" timeout="20s" \
- op stop interval="0s" timeout="100s" standby="on" \
- meta target-role="Stopped"
+ # VM-1gグループへVM-1-apacheの2つのリソースを追加します
+ group VM-1g VM-1-apache
property $id="cib-bootstrap-options" \
dc-version="1.0.13-a83fae5" \
cluster-infrastructure="Heartbeat" \
stonith-enabled="false" \
no-quorum-policy="ignore"
どのようになるか確認します。
[root@VM-1]# crm_mon -Afro1
============
Last updated: Thu Sep 28 09:13:33 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
Online: [ vm-1 vm-2 ]
Full list of resources:
Resource Group: VM-1g
VM-1-apache (lsb:httpd_vm1): Stopped
Node Attributes:
* Node vm-1:
* Node vm-2:
Operations:
* Node vm-1:
* Node vm-2:
VM-dummy: migration-threshold=1000000
+ (3) start: rc=0 (ok)
+ (5) stop: rc=0 (ok)
- リソースグループVM-1gの下にVM-1-apacheが、停止状態で存在することが確認できます。
- また、OperationsのNode VM-2 に、VM-dummyが残っており、Stop状態から比較すると、
+ (4) monitor: interval=3000ms rc=0 (ok)
が消えています。
参考資料
動かして理解するPacemaker ~CRM設定編~ その2(linux-ha.osdn.jp)
動かして理解するPacemaker ~CRM設定編~ その3(linux-ha.osdn.jp)
VM-1上でapacheを起動する準備が整いました。
IPaddr2
IPaddr2を使い、仮想IPのリソースをVM-1-VIPとして設定します。
Apacheで追加したVM-1gグループと、VM-1lロケーションに追加します。
crmの設定には他にもcolocationやorderがあります。
location →場所:どのノードで起動するか?
colocation→同居:どのリソースと一緒に起動するか?
order →順序:どのリソースの前/後に起動するか?
どう組み合わせればよいか迷ってしまいますが、
例えば、「group grp1 resource1 resource2」は「resource1と2は必ず同居し」、「resource1→resource2の順序で起動」を定義します。
とあるため、groupを使えば、colocationとorderを別途使う必要がないようです。
参考資料
動かして理解するPacemaker ~CRM設定編~ その3(linux-ha.osdn.jp)
ここでは、VM-1をMasterとして、仮想IPとApacheを起動さます。
Apacheのhttpd.confのListenディレクティブで、仮想IPを指定しているため、仮想IPを持っていない状態でApacheは起動しません。
それを踏まえて、仮想IPが設定されたあとにApacheが起動するようにします。
groupの定義では、Apacheの前に仮想IPのリソースを追加します。
[root@VM-1]# crm configure edit
node $id="6dfd3382-eddc-4762-84d5-2c047475b88c" VM-1
node $id="962ec26d-9e70-45a1-a93a-0a5455486024" VM-2
+ # IPaddr2のVM-1-VIPリソースをStopped状態で追加
+ primitive VM-1-VIP ocf:heartbeat:IPaddr2 \
+ params \
+ ip="192.168.144.20" \
+ cidr_netmask="24" \
+ op start interval="0s" timeout="60s" on-fail="restart" \
+ op monitor interval="10s" timeout="60s" on-fail="restart" \
+ op stop interval="0s" timeout="60s" on-fail="block" \
+ meta target-role="Stopped"
primitive VM-1-apache lsb:httpd_vm1 \
op start interval="0s" timeout="90s" \
op monitor interval="3s" timeout="20s" \
op stop interval="0s" timeout="100s" standby="on" \
meta target-role="Stopped"
+ # group VM-1gにVM-1-VIPリソースを追加
- group VM-1g VM-1-apache
+ group VM-1g VM-1-VIP VM-1-apache
property $id="cib-bootstrap-options" \
dc-version="1.0.13-a83fae5" \
cluster-infrastructure="Heartbeat" \
stonith-enabled="false" \
no-quorum-policy="ignore
設定された内容を確認します。
[root@VM-1]# crm_mon -ro1
(前略)
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Stopped
VM-1-apache (lsb:httpd_vm1): Stopped
Operations:
* Node vm-1:
* Node vm-2:
VM-dummy: migration-threshold=1000000
+ (3) start: rc=0 (ok)
+ (5) stop: rc=0 (ok)
- まだOperationにVM-2でVM-dummyが稼働していた履歴?が残っています。
VM-2で稼働していたVM-dummyリソースの履歴を削除します。
VM-2側でモニターしながら確認します。
[root@VM-2]# crm_mon -Afro
[root@VM-1]# crm resource cleanup VM-dummy VM-2
Cleaning up VM-dummy on VM-2
Waiting for 2 replies from the CRMd..
# --- 失敗するとき
No messages received in 60 seconds.. aborting
- 削除に成功するときはメッセージはありません。VM-2でモニターしていると、VM-dummyが削除されるのが確認できます。
- 削除に失敗したときは、VM-1、VM-2でheartbeatを再起動します。
- Operationsからリソースの履歴?が削除されました。
VM-1gの起動順と、crm_monで表示される序列が一致しているか確認します。
上記設定では、apacheが起動したあと、仮想IPが割り振られる順序となっているため、apacheの起動に失敗します。
httpd.confのListenで仮想IPアドレスを指定しているので、仮想IPを持っていないマシンでapacheは起動しません。
仮想IPが割り振られたあと、apacheが起動する順序に修正します。
[root@VM-1]# crm configure edit
(中略)
- group VM-1g VM-1-VIP VM-1-apache
+ group VM-1g VM-1-apache VM-1-VIp
(後略)
# 順序が入れかわっているか確認する
[root@VM-1]# crm_mon -r1
(前略)
Full list of resources:
Resource Group: VM-1g
VM-1-apache (lsb:httpd_vm1): Stopped
VM-1-VIP (ocf::heartbeat:IPaddr2): Stopped
(後略)
# もとに戻す
[root@VM-1]# crm configure edit
(中略)
- group VM-1g VM-1-apache VM-1-VIp
+ group VM-1g VM-1-VIP VM-1-apache
(後略)
- crm_monで確認できる並び順は起動順と同じで、視覚的に確認できることがわかりました。
グループVM-1gはVM-1で稼働させたいので、ロケーションを設定します。
[root@VM-1]# crm configure edit
node $id="6dfd3382-eddc-4762-84d5-2c047475b88c" VM-1
node $id="962ec26d-9e70-45a1-a93a-0a5455486024" VM-2
primitive VM-1-VIP ocf:heartbeat:IPaddr2 \
params \
ip="192.168.144.20" \
cidr_netmask="24" \
op start interval="0s" timeout="60s" on-fail="restart" \
op monitor interval="10s" timeout="60s" on-fail="restart" \
op stop interval="0s" timeout="60s" on-fail="block" \
meta target-role="Stopped"
primitive VM-1-apache lsb:httpd_vm1 \
op start interval="0s" timeout="90s" \
op monitor interval="3s" timeout="20s" \
op stop interval="0s" timeout="100s" standby="on" \
meta target-role="Stopped"
group VM-1g VM-1-VIP VM-1-apache
+ # VM-1lロケーションへVM-1gグループを追加します
+ location VM-1l VM-1g \
+ rule 200: #uname eq VM-1 \
+ rule 100: #uname eq VM-2
property $id="cib-bootstrap-options" \
dc-version="1.0.13-a83fae5" \
cluster-infrastructure="Heartbeat" \
stonith-enabled="false" \
no-quorum-policy="ignore
- ロケーションの情報はcrm_monから確認することができません。
参考資料
月刊あんどりゅーくん(12月号)(linux-ha.osdn.jp)
Pacemaker/Heartbeat で良く使うクラスタ操作コマンド(ngyuki.hatenablog.com)
稼働の確認
リソースが揃ったので、稼働させてみます。
仮想IPの有効化
仮想IP(192.168.144.20/24)が振られていないことを確認します。
[root@VM-1]# ip a | grep 144
inet 192.168.144.21/24 brd 192.168.144.255 scope global eth1
- VM-1-VIPでnicを指定していないので、VM-1-VIPのparamで設定しているネットワークと同じネットワークのIPアドレスを持つNICに、仮想IPが割り振られるようです。
- 同じネットワークのNICが2つ以上ある場合はどこに振られるかわかりません。
VM-1-VIPを有効化し、IPアドレスを確認します。
[root@VM-1]# crm resource start VM-1-VIP
[root@VM-1]# ip a | grep 144
inet 192.168.144.21/24 brd 192.168.144.255 scope global eth1
inet 192.168.144.20/24 brd 192.168.144.255 scope global secondary eth1
IPアドレスが割り振られていることが確認できました。
crm_monからもリソースがスタートしていることを確認できます。
============
Last updated: Thu Sep 28 09:43:50 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
Online: [ vm-1 vm-2 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started vm-1
VM-1-apache (lsb:httpd_vm1): Stopped
Node Attributes:
* Node vm-1:
* Node vm-2:
Operations:
* Node vm-1:
VM-1-VIP: migration-threshold=1000000
+ (4) start: rc=0 (ok)
+ (5) monitor: interval=10000ms rc=0 (ok)
* Node vm-2:
Apacheの起動
apacheが起動していないことを確認します。
[root@VM-1]# ps aux | grep httpd | grep -v grep
apacheのリソースを起動します。
[root@VM-1]# crm resource start VM-1-apache
[root@VM-1]# crm_mon -f1
============
Last updated: Thu Sep 28 09:54:01 2017
Stack: Heartbeat
Current DC: vm-2 (962ec26d-9e70-45a1-a93a-0a5455486024) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
Online: [ vm-1 vm-2 ]
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started vm-1
VM-1-apache (lsb:httpd_vm1): Started vm-1
Migration summary:
* Node vm-1:
* Node vm-2:
[root@VM-1]# ps ax | grep httpd | grep -v grep
18932 ? Ss 0:00 /opt/apache-2.4.27_vm1/bin/httpd
18934 ? Sl 0:00 /opt/apache-2.4.27_vm1/bin/httpd
18935 ? Sl 0:00 /opt/apache-2.4.27_vm1/bin/httpd
18936 ? Sl 0:00 /opt/apache-2.4.27_vm1/bin/httpd
[root@VM-1]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
[root@VM-2]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
切り替え
稼働が確認できましたので、リソースをVM-1からVM-2へ移してみます。
VM-2側で、常にリソースの状態を確認しておきます。
[root@VM-2] crm_mon -Afro
(前略)
Online: [ vm-1 vm-2 ]
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started vm-1
VM-1-apache (lsb:httpd_vm1): Started vm-1
(後略)
VM-1のheartbeatを停止します。
[root@VM-1]# service heartbeat stop
Stopping High-Availability services: Done.
[root@VM-1]# ip a | grep 144
inet 192.168.144.21/24 brd 192.168.144.255 scope global eth1
(前略)
Online: [ vm-2 ]
OFFLINE: [ vm-1 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started vm-2
VM-1-apache (lsb:httpd_vm1): Started vm-2
(後略)
- VM-1がオフラインとなり、VM-2でリソースが稼働していることがわかります。
VM-1のときと同様に、curlで確認します。
[root@VM-1]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
- VM-2側で正常にApacheが起動しているようです。
VM-1のheartbeatを起動し、VM-1へリソースが戻るか確認します。
[root@VM-1]# service heartbeat start
Starting High-Availability services: Done.
- VM-2側で起動していたリソースが、再度VM-2側に起動することがわかります。
- httpdプロセスやIPアドレスの確認は割愛します。
以上で、heartbeat3+pacemaker1.0の動作確認が完了しました。
corosync
引き続き、CentOS6上でcorosync1+pacemaker1.0の動作を確認します。
設定の確認
VM-1、VM-2のheartbeatを停止します。
[root@VM-1]# service heartbeat stop
Stopping High-Availability services: Done.
[root@VM-2]# service heartbeat stop
Stopping High-Availability services: Done.
corosyncを起動します。
[root@VM-1]# service corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
[root@VM-2]# service corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
crm_monで状況を確認します。
[root@VM-1]# crm_mon -Afro1
============
Last updated: Thu Sep 28 10:16:59 2017
Stack: openais
Current DC: VM-1 - partition with quorum
Version: 1.0.13-a83fae5
4 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ VM-1 VM-2 ]
OFFLINE: [ vm-1 vm-2 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-1
VM-1-apache (lsb:httpd_vm1): Started VM-1
Node Attributes:
* Node VM-1:
* Node VM-2:
Operations:
* Node VM-1:
VM-1-apache: migration-threshold=1000000
+ (6) start: rc=0 (ok)
+ (7) monitor: interval=3000ms rc=0 (ok)
VM-1-VIP: migration-threshold=1000000
+ (4) start: rc=0 (ok)
+ (5) monitor: interval=10000ms rc=0 (ok)
* Node VM-2:
- 先ほどと同じようですが、オンラインにVM-1とVM-2がいるようですが、vm-1とvm-2がオフラインになっているようです。
確認します。
[root@VM-1]# crm configure show
node $id="6dfd3382-eddc-4762-84d5-2c047475b88c" vm-1
node $id="962ec26d-9e70-45a1-a93a-0a5455486024" vm-2
node VM-1
node VM-2
primitive VM-1-VIP ocf:heartbeat:IPaddr2 \
params ip="192.168.144.20" cidr_netmask="24" \
op start interval="0s" timeout="60s" on-fail="restart" \
op monitor interval="10s" timeout="60s" on-fail="restart" \
op stop interval="0s" timeout="60s" on-fail="block" \
meta target-role="Started"
primitive VM-1-apache lsb:httpd_vm1 \
op start interval="0s" timeout="90s" \
op monitor interval="3s" timeout="20s" \
op stop interval="0s" timeout="100s" standby="on" \
meta target-role="Started"
group VM-1g VM-1-VIP VM-1-apache
location VM-1l VM-1g \
rule $id="VM-1l-rule" 200: #uname eq VM-1 \
rule $id="VM-1l-rule-0" 100: #uname eq VM-2
property $id="cib-bootstrap-options" \
dc-version="1.0.13-a83fae5" \
cluster-infrastructure="openais" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
expected-quorum-votes="2"
- どうやら
node
が4つ登録されているようです。heartbeatでは$id
のあるノードでしたが、corosyncではhostnameだけでノードを管理しているようです。
heartbeatで使用していたと思われるノードを削除します。
# ノードの確認
[root@VM-1]# crm node list
VM-1: normal
VM-2: normal
vm-1(6dfd3382-eddc-4762-84d5-2c047475b88c): normal
vm-2(962ec26d-9e70-45a1-a93a-0a5455486024): normal
# ノードの削除
[root@VM-1]# crm node delete vm-1
INFO: node vm-1 not found by crm_node
INFO: node vm-1 deleted
[root@VM-1]# crm node delete vm-2
INFO: node vm-2 not found by crm_node
INFO: node vm-2 deleted
どうなったか確認します。
[root@VM-1]# crm status
============
Last updated: Thu Sep 28 10:25:50 2017
Stack: openais
Current DC: VM-1 - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, 2 expected votes
1 Resources configured.
============
OFFLINE: [ VM-1 VM-2 ]
- どうやら認識しているノードを削除してしまったようです。
もう一度削除してみます。
[root@VM-1]# crm node delete VM-1
INFO: node VM-1 appears to be still active
INFO: check output of crm_node -l
ERROR: failed to delete node VM-1
- 削除できないようです。
手動で削除します。
[root@VM-1]# crm configure edit
- node VM-1
- node VM-2
(後略)
状況を確認します。
[root@VM-1]# crm status
============
Last updated: Thu Sep 28 10:39:12 2017
Stack: openais
Current DC: VM-1 - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ VM-1 VM-2 ]
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-1
VM-1-apache (lsb:httpd_vm1): Started VM-1
- 自動的にノードが追加され、VM-1でリソースが稼働しているようです。
切り替え
heartbeatのときと同様に、VM-1でcorosyncを停止させ、VM-2にリソースが移行するか確認します。
VM-2側でリソースの状態を確認しておきます。
[root@VM-2] crm_mon -Afro
(前略)
Online: [ VM-1 VM-2 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-1
VM-1-apache (lsb:httpd_vm1): Started VM-1
(後略)
VM-1のcorosyncを停止します。
[root@VM-1]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:.... [ OK ]
Online: [ VM-2 ]
OFFLINE: [ VM-1 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-2
VM-1-apache (lsb:httpd_vm1): Started VM-2
- 無事切り替わりました。
curl VM1-HTTPD
を実行しても、正常にかえってきます。 - 切替りにかかる時間は、crm_monを見る限りcorosyncのほうが圧倒的に少ないようです。
当然といえば当然ですが、リソース管理はpacemakerで行っているので、リソース管理部分の書式は同一でも動作しました。
ノードの管理方法がheartbeat3とcorosync1っているので、ノードの記述が異なっていたのは当然といえば当然かもしれません。
さて、crm status
コマンドで、heartbeatとcorosyncで異なっていました。
heartbeat稼働時
Stack: Heartbeat
corosync稼働時
Stack: openais
- Stackの部分が、corosyncではなくopenaisになっています。前身のOpenAISプロジェクトの名残でしょうか。
冗長構成へ組み込む#2
CentOS7でcorosyncを動作させます。
この段階で、CentOS7にcorosync、pacemaker、Apache、Apacheの起動スクリプトがインストールされているはずです。
pacemakerの状態を確認し、起動します。
### 状態を確認
# 停止しているとき
[root@VM-1]# systemctl status pacemaker | grep Active
Active: inactive (dead)
# 起動しているとき
[root@VM-1]# systemctl status pacemaker | grep Active
Active: active (running) since Do 2017-09-28 13:19:14 CEST; 22min ago
# 起動
[root@VM-1]# systemctl start pacemaker
[root@VM-1]# crm configure edit
node 1084789043: VM-1
node 1084789044: VM-2
+ primitive VM-1-VIP ocf:heartbeat:IPaddr2 \
+ params ip=192.168.144.20 cidr_netmask=24 \
+ op start interval=0s timeout=60s on-f ail=restart \
+ op monitor interval=10s timeout=60s on- fail=restart \
+ op stop interval=0s timeout=60s on-fail=block \
+ meta target-role=Stopped
+ primitive VM-1-apache systemd:httpd_vm1 \
+ op start interval=0s timeout=90s \
+ op monitor interval=3s timeout=20s \
+ op stop interval=0s timeout=100s standby=on \
+ meta target-role=Stopped
+ group VM-1g VM-1-VIP VM-1-apache
+ location VM-1l VM-1g \
+ rule 200: #uname eq VM-1 \
+ rule 100: #uname eq VM-2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.16-1.el7-94ff4df \
- cluster-infrastructure=corosync
+ cluster-infrastructure=corosync \
+ stonith-enabled=false \
+ no-quorum-policy=ignore \
+ expected-quorum-votes=2
# vim: st filetype=pcmk:
- nodeの表示され方が違うようです。
- $idの指定がありません。
- CentOS7はlsbではなくsystemdを使用します。
- コメントが残るようです。
- ダブルコーテーションは自動的に削除されます。
状態の確認
[root@VM-1]# crm_mon -fr1
Stack: corosync
Current DC: VM-1 (version 1.1.16-1.el7-94ff4df) - partition with quorum
Last updated: Thu Sep 28 14:02:10 2017
Last change: Thu Sep 28 13:58:56 2017 by root via cibadmin on VM-1
2 nodes configured
2 resources configured (4 DISABLED)
Online: [ VM-1 VM-2 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Stopped (disabled)
VM-1-apache (systemd:httpd_vm1): Stopped (disabled)
Migration Summary:
* Node VM-2:
* Node VM-1:
- Stoppedの横にdisabledがついています。
- なぜか 4 DISABLEDとなっています。
稼働の確認
リソースを有効にします。
[root@VM-1]# crm resource start VM-1-VIP
[root@VM-1]# crm resource start VM-1-apache
# crm_mon 推移の例
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Stopped (disabled)
VM-1-apache (systemd:httpd_vm1): Stopped (disabled)
↓
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Stopped
VM-1-apache (systemd:httpd_vm1): Stopped (disabled)
↓
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-1
VM-1-apache (systemd:httpd_vm1): Stopped
↓
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-1
VM-1-apache (systemd:httpd_vm1): Started VM-1
- 状態は
Stopped (disabled)
からStopped
を経由し、Started VM-1
と変化しました。3パターンあるようです。
切り替え
VM-1のpacemakerを停止し、リソースをVM-2で起動するようにします。
[root@VM-1]# systemctl stop pacemaker
[root@VM-1]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
[root@VM-2]# crm_mon -fr1
Stack: corosync
Current DC: VM-2 (version 1.1.16-1.el7-94ff4df) - partition with quorum
Last updated: Thu Sep 28 14:16:24 2017
Last change: Thu Sep 28 14:04:35 2017 by root via cibadmin on VM-2
2 nodes configured
2 resources configured
Online: [ VM-2 ]
OFFLINE: [ VM-1 ]
Full list of resources:
Resource Group: VM-1g
VM-1-VIP (ocf::heartbeat:IPaddr2): Started VM-2
VM-1-apache (systemd:httpd_vm1): Started VM-2
Migration Summary:
* Node VM-2:
- 正常に切り替わっているようです。
CentOS7でcorosync2+pacemaker1.1で冗長構成が正常に動作することが確認できました。
cibのしくみ
heartbeat3では/var/lib/heartbeat/crm
にcibファイルが増えていきましたが、corosync2ではどうなるのか確認してみます。
確認してみると、/var/libの中でそれらしいpacemaker/cib/というディレクトリの中にcibファイルが見つかりました。
cib.lastを見て、ディレクトリ内のcib-00.rawのもっとも大きい値に+1されているか確認します。
[root@VM-1]# cat /var/lib/pacemaker/cib/cib.last
- heartbeat3のときと比べると、保存先が異なるだけでやっている内容は同じのようです。
corosync1+pacemaker1.0ではどうでしょうか。
上記で作成したCentOS6で確認してみます。
[root@VM-1]# cat /var/lib/pacemaker/cib/cib.last
cat: /var/lib/pacemaker/cib/cib.last: No such file or directory
ディレクトリが無いといわれるので、heartbeat3で使用していた/var/lib/heartbeat/crmを確認します
[root@VM-1]# service corosync start
Starting Corosync Cluster Engine (corosync): [ OK
]
[root@VM-1]# cat /var/lib/heartbeat/crm/cib.last
53
# ダミーリソースを追加して cib.lastの値が増えることを確認する
[root@VM-1]# crm configure primitive dummy-resource ocf:pacemaker:Dummy \
op start interval="0s" timeout="90s" \
op monitor interval="3s" timeout="20s" \
op stop interval="0s" timeout="100s" \
meta target-role="Stopped"
[root@VM-1]# cat /var/lib/heartbeat/crm/cib.last
54
# ダミーリソースを削除する
[root@VM-1]# crm configure delete dummy-resource
- /var/lib/heartbeat/crm/ディレクトリを使用していることがわかりました。同じpacemaker1.0を使用しているので当然といえば当然です。
以上で、作業は終わりです。
crm configure [リソースの定義] # リソースの追加
crm configure delete [リソース名] # リソースの削除
crm resource start # リソースの開始
crm resource stop # リソースの停止
crm resource cleanup [リソース名] [ノード名]
# 故障履歴の削除
crm node list # ノードの一覧
crm node delete [ノード名] # ノードの削除
タイトルにある違いを感じるは、実施しているうちに感じ取れましたので、結論にまとめています。