LinuxHA Japan で RHEL/CentOS 7 リポジトリパッケージがリリースされたようなので、CentOS 7 で Pacemaker/Corosync を試してみました。
なお、Corosync を使うのははじめてです(Heartbeat しか使ったことありませんでした)。
Vagrant
次のような Vagrant 環境で試しました。
Vagrant.configure(2) do |config|
config.vm.box = "your-centos7-box"
config.vm.define "pm1" do |cfg|
cfg.vm.hostname = "pm1"
cfg.vm.network "private_network", ip: "192.168.33.11", virtualbox__intnet: "pacemaker"
end
config.vm.define "pm2" do |cfg|
cfg.vm.hostname = "pm2"
cfg.vm.network "private_network", ip: "192.168.33.12", virtualbox__intnet: "pacemaker"
end
end
自作の CentOS 7 の box を使っているのですが、git や epel を追加しているだけの普通の CentOS 7 なので、適当な box に読み替えてください。
インストール
LinuxHA Japan のリポジトリを rpm で追加します。
yum -y install http://iij.dl.sourceforge.jp/linux-ha/63398/pacemaker-repo-1.1.12-1.1.el7.x86_64.rpm
rpm -ql pacemaker-repo
でインストールされたものを見てみると・・・
リポジトリそのものがローカルにインストールされるようです。
/etc/yum.repos.d/pacemaker.repo
/opt/linux-ha
/opt/linux-ha/pacemaker
/opt/linux-ha/pacemaker/repodata
:
/opt/linux-ha/pacemaker/rpm/pm_logconv-cs-2.0-1.el7.noarch.rpm
/opt/linux-ha/pacemaker/rpm/pssh-2.3.1-5.el7.noarch.rpm
/opt/linux-ha/pacemaker/rpm/resource-agents-3.9.5-1.589.b6443.el7.x86_64.rpm
幾つかのパッケージが CentOS 7 の extra リポジトリの同名パッケージと競合するため、yum-plugin-priorities
をインストールして LinuxHA Japan のリポジトリを優先するように設定します。
yum -y install yum-plugin-priorities ansible
yum-config-manager --setopt=linux-ha-ja-pacemaker.priority=10 --save
Pacemaker/Corosync をインストールします。pacemaker-all パッケージをインストールすると必要なものが一式入ります。
yum -y install pacemaker-all
設定
Corosync の設定ファイルを作成します。
すべてのノードで設定ファイルの内容は同じなので、片方のノードで設定ファイルを編集してもう片方のノードに転送するとよいでしょう。
サンプルの設定ファイルをコピーして編集します。
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
vim /etc/corosync/corosync.conf
bindnetaddr をネットワークアドレスに書き換えます。
bindnetaddr: 192.168.33.0
quorum のところに下記を追記します。
provider: corosync_votequorum
expected_votes: 2
two_node: 1
設定ファイルをもう片方のノードにコピーします。
rsync /etc/corosync/corosync.conf 192.168.33.12:/ -Rav
起動
pacemaker の systemd のユニットを見てみると、
grep corosync /usr/lib/systemd/system/pacemaker.service
次のようになっているので、
After=corosync.service
Requires=corosync.service
pacemaker だけ起動します(corosync は勝手に起動する)。
systemctl start pacemaker.service
しばらく待ってから crm_mon
を実行し、Online: [ pm1 pm2 ]
みたな表示があれば正常に起動しています。
crm_mon -1
ちなみに corosync じゃなくて pacemaker を起動しなければならないことに気がつくまで数時間試行錯誤しました。heartbeat のときは heartbeat の方を起動するようになっていたので・・・
Pacemaker の設定
ここまでくれば、あとは Pacemaker/Heartbeat のときと同じでいいのでしょうかね?
ためしに vip を付与してみます。
crm configure
でインタラクティブに設定します。
crm configure
次のように設定します。
property stonith-enabled="false"
property start-failure-is-fatal="false"
rsc_defaults migration-threshold="5"
rsc_defaults resource-stickiness="INFINITY"
rsc_defaults failure-timeout="3600s"
verify
commit
primitive vip1 ocf:heartbeat:IPaddr2 \
params ip="192.168.33.21" cidr_netmask="24" nic="enp0s8" \
op monitor interval="10" timeout="20" on-fail="restart" \
op start interval="0" timeout="20" \
op stop interval="0" timeout="20"
primitive vip2 ocf:heartbeat:IPaddr2 \
params ip="192.168.33.22" cidr_netmask="24" nic="enp0s8" \
op monitor interval="10" timeout="20" on-fail="restart" \
op start interval="0" timeout="20" \
op stop interval="0" timeout="20"
primitive vip3 ocf:heartbeat:IPaddr2 \
params ip="192.168.33.23" cidr_netmask="24" nic="enp0s8" \
op monitor interval="10" timeout="20" on-fail="restart" \
op start interval="0" timeout="20" \
op stop interval="0" timeout="20"
group vips vip1 vip2 vip3
verify
commit
quit
ip アドレスを確認します。
ip -f inet addr show dev enp0s8
片方のノードに仮想IPが付与されました。
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.33.11/24 brd 192.168.33.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.21/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.22/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.23/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
おもむろにサーバを停止してみます。
shutdown -h now
もう片方のサーバで仮想IPアドレスを確認します。
ip -f inet addr show dev enp0s8
仮想IPがフェイルオーバーしてます。
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.33.12/24 brd 192.168.33.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.21/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.22/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
inet 192.168.33.23/24 brd 192.168.33.255 scope global secondary enp0s8
valid_lft forever preferred_lft forever
シャットダウンしたノードをもう一度起動します。
vagrant up pm1
vagrant ssh pm1
pacemaker を起動します(自動起動を設定してなかったので)
systemctl start pacemaker.service
crm_mon でクラスタの状態を確認します。
crm_mon -1
クラスタに復帰しています。
Online: [ pm1 pm2 ]
Resource Group: group_vip
vip1 (ocf::heartbeat:IPaddr2): Started pm2
vip2 (ocf::heartbeat:IPaddr2): Started pm2
vip3 (ocf::heartbeat:IPaddr2): Started pm2
おもむろに Vagrant のホスト側から pm2 を強制終了します。
vagrant halt -f pm2
pm1 で crm_mon を確認します。
crm_mon -1
フェイルオーバーしてます。
Online: [ pm1 ]
OFFLINE: [ pm2 ]
Resource Group: group_vip
vip1 (ocf::heartbeat:IPaddr2): Started pm1
vip2 (ocf::heartbeat:IPaddr2): Started pm1
vip3 (ocf::heartbeat:IPaddr2): Started pm1
さいごに
LinuxHA Japan の yum リポジトリを使って、Pacemaker/Corosync クラスタをアクティブ/スタンバイの2台で構成し、仮想 IP のフェイルオーバーを試してみました。
Pacemaker/Heartbeat と比べるとクラスタの起動が異様に早いように感じました(pacemaker を起動してから crm_mon
でクラスタへのジョインが確認できるまでの時間)。
なお、他にもいろいろ設定しなければならない項目があるようなので(pacemaker の環境変数とか)、もうちょっといろいろ弄ってみます。