LinuxHA Japan の CentOS 7 のリポジトリで Pacemaker/Corosync を試す


[LinuxHA Japan][linux-ha-jp] で 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 クラスタをアクティブ/スタンバイの２台で構成し、仮想 IP のフェイルオーバーを試してみました。

Pacemaker/Heartbeat と比べるとクラスタの起動が異様に早いように感じました（pacemaker を起動してから `crm_mon` でクラスタへのジョインが確認できるまでの時間）。

なお、他にもいろいろ設定しなければならない項目があるようなので（pacemaker の環境変数とか）、もうちょっといろいろ弄ってみます。

## 参考サイト

- http://linux-ha.osdn.jp/wp/archives/4051
- https://blog.3ware.co.jp/2015/05/corosync-conf-5/
- http://www.oss-d.net/drbd-pacemaker-corosync

[linux-ha-jp]: http://linux-ha.osdn.jp/wp/archives/4051