【学習メモ】corosyncとheartbeatを動かして違いを感じる

#はじめに
冗長構成のために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** ||◆|

コマンドの内容に関しては、本家の焼き直しです。

流れは以下の通りです。

1. Vagrantを準備する
1. Pacemakerを準備する
    1. CentOS6にheartbeat3とcorosync1とpacemaker1.0をインストールする
    1.  CentOS7にcorosync2とpacemaker1.1をインストールする
1. CentOS6でheartbeat3を動作させる
1. CentOS6でpacemaker1.0を動作させる
1. CentOS7でpacemaker1.1を動作させる
1. 違いを感じる



環境は以下の通りです。

```text:環境
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](http://linux-ha.osdn.jp/wp/archives/891)になります。

#####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もある](https://www.slideshare.net/takmatsuo/ha-31244693/30)ので少し心配になりました。

#####corosync1と2
- Linux-ha Japan様の手続き上で見える違いですが、[corosync1(+pacemaker1.0)](http://linux-ha.osdn.jp/wp/archives/4219)ではcorosyncで認証キーの生成をしていません。[corosync2(+pacemaker1.1)](http://linux-ha.osdn.jp/wp/archives/4618#52_corosync)では、```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に追加します。

```bash: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の公式ページ](http://linux-ha.osdn.jp/wp/dl)によると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とあるので誤記かもしれません。

```bash:RHEL6系
### 両方ダウンロードします
# 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
```
```bash:RHEL7系
# 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)](https://ja.osdn.net/projects/linux-ha/releases/)
[OSDNのlinux-ha Japanのダウンロード一覧(linux-ha.osdn.jp)](http://linux-ha.osdn.jp/wp/dl)

###CentOS-Base.repoの編集
事前にCentOS同梱のものと混在しないようにexcludeを設定します。

```diff:/etc/yum.repos.d/CentOS-Base.repo(CentOS6/7共通)
[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)](http://linux-ha.osdn.jp/wp/archives/4618#3)

###インストール
ダウンロードしたリポジトリからインストールします。
heartbeatは自動起動しないように設定します。

```bash:CentOS6_Pacemaker_1.0
### 選択してインストールする
[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
```

```bash:CentOS7_Pacemaker1.1
[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)も使えるようにするためでしょうか。

インストールしたバージョンを確認します。

```bash:corosyncのバージョン確認(CentOS6)
[root@VM-1]# corosync -v
Corosync Cluster Engine, version '1.4.6'
Copyright (c) 2006-2009 Red Hat, Inc.
```
```bash:corosyncのバージョン確認(CentOS7)
[root@VM-1]# corosync -v
Corosync Cluster Engine, version '2.4.2'
Copyright (c) 2006-2009 Red Hat, Inc.
```
```bash:pacemakerのバージョン確認(CentOS6)
[root@VM-1]# /usr/lib64/heartbeat/crmd version
CRM Version: 1.0.13 (a83fae5)
```
```bash:pacemakerのバージョン確認(CentOS7)
[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のバージョンがそのように見えます](http://linux-ha.osdn.jp/wp/archives/3786/2#4)

#設定
CentOS6ではpacemaker1.0をheartbeat3とcorosync1から動作させます。ここではheartbeat、corosyncを設定します。
CentOS7ではpacemakerとcorosyncを設定します。
基本的にVM-1で作成・編集したものを、SCPを使ってVM-2側に上書きコピーします。

###/etc/hosts
相互に名前で通信できるように設定します。

```bash:/etc/hosts(CentOS6/7共通)
# 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の**設定ファイル**を設定します。
####設定ファイル

```bash:/etc/sysconfig/pacemaker(1.0系/CentOS6)
# 不要、ファイルが無い
```
```bash:/etc/sysconfig/pacemaker(1.1系CentOS7)
[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)](http://linux-ha.osdn.jp/wp/archives/4618#_pacemaker設定ファイルの設定)

####起動スクリプト
Pacemakerの**起動スクリプト**を設定します。(CentOS7)

```bash:/usr/lib/systemd/system/pacemaker.service(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)](http://linux-ha.osdn.jp/wp/archives/4618#_クラスタ起動スクリプトの設定_rhel_7用)

###corosync
corosyncの設定です。
**corosync.confの作成**と、**corosync認証鍵ファイルの設定**、**クラスタ起動スクリプトの設定**が必要です。

####confの作成
corosync1系と2系で若干異なるようです。

```bash:/etc/corosync/corosync.confの設定(CentOS6)
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
}
```

```bash:/etc/corosync/corosync.confの設定(CentOS7)
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
        }
```
```bash:/etc/corosync/corosync.confのコピー(CentOS6/7共通)
[root@VM-1]# scp -p /etc/corosync/corosync.conf root@VM-2:/etc/corosync/corosync.conf
```
- ```{``` ```}```が出てきたら必ず改行が必要です。中括弧を```}}```のように重複させてもエラーになります。
- ディレクティブの行末に**```{```**は置けますが、ディレクティブの最後に**```}```**を置くことはできないようです。**```}```**は1行に1つそれだけを置く必要があります。
- corosync1/2系とも同じ仕様のようです。

```bash:中括弧が問題で起動に失敗する例
### 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.
```
```bash:エラーが発生する設定ファイルの例
### Not Good
aisexec { user: root
          group: root }
### Good
aisexec {
          user: root
          group: root
}
```
参考資料
[クラスタ制御部にCorosyncを使用する場合の設定(linux-ha.osdn.jp)](http://linux-ha.osdn.jp/wp/archives/4219#Corosync)
[corosync.conf の各種項目を調べた（使うやつを中心に）(gist.github.com/inokappa)](https://gist.github.com/inokappa/124b1ee5f3e3fbe6b172)

####認証鍵の作成
corosync認証鍵ファイルを設定します。
VM-1で認証鍵を生成し、SCPでVM-2へコピーします。

```bash:認証鍵の作成(CentOS7/pacemaker1.1+corosync2のみ)
鍵の生成
[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の起動スクリプトを修正します。

```bash:/usr/lib/systemd/system/corosync.service(CentOS7)
[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の作成

```bash:/etc/ha.d/ha.cfの設定(CentOS6)
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
```
```bash:/etc/ha.d/ha.cfのコピー(CentOS6)
[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の名前を指定します。

####認証キーの作成
```bash:認証キーファイルの作成と配置(CentOS6)
鍵の生成
[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
```

```bash:authkeysの設定を忘れてheartbeatを起動したときのエラー
[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)](http://linux-ha.osdn.jp/wp/archives/4219#Heartbeat3)



##ログの設定
これまで設定では、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を修正します。

```diff:syslog.confの設定(CentOS6/7共通)
下記のどちらか
/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
```
```bash:syslog.conf設定のコピー(CentOS6/7共通)
# 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)](https://thinkit.co.jp/article/724/1)
[SYSLOGのファシリティとは？(www.furukawa.co.jp)](https://www.furukawa.co.jp/fitelnet/f/man/100/command-config/global_config/syslog_facility.htm)

#疎通の確認
heartbeatやcorosyncが起動する準備が整いました。
heartbeatやcorosyncを起動して、Master/Slave間で認識されるか確認します。


###クラスタの起動と状態確認
CentOS6 heartbeatのパターンを試します。

heartbeatを起動します。

```bash:CentOS6_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から確認できません。

```bash:起動後すぐにcrm_monを起動したときのエラー
[root@VM-1]# crm_mon -Afro1

Connection to cluster failed: connection failed
```

heartbeatの状態を確認します。

```bash:CentOS6_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のパターンを試します。

```bash: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:
```
```bash:起動直後でノードを認識していないとき
[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の記述は割愛します。

```bash:VM-1側(CentOS6)
[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
```
```bash:VM-2側(CentOS6)
[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
```
```bash:VM-1からVM-2へping(CentOS6)
[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を止めてみます。

```bash:iptablesの停止
# CentOS6
service iptables stop
chkconfig --level 2345 iptables off

# CentOS7
systemctl stop firewalld
systemctl disable firewalld
```
```bash:クラスタの確認
### 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```を追加します。

```bash:インストールのコピペ用(CentOS6/7共通)
### 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
```
```bash:CentOS7のみ追加
### 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で設定した名前を指定します。

```diff:httpd.confの設定(CentOS6/7)
### 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系
```bash:/etc/init.d/httpd_vm1の作成
cp -p /tmp/httpd-2.4.27_vm1/build/rpm/httpd.init /etc/init.d/httpd_vm1
```
```diff:/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系
```bash:/usr/lib/systemd/system/httpd_vm1.serviceの作成
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*で起動します。

```bash:heartbeatのステータス確認と起動(CentOS6)
# ------ 起動中のとき ------
[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と違うと以下のエラーが出て起動しません。

```bash:hostnameとha.cfのが異なるときのエラー(抜粋)
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の一部を確認します。

```bash:VM-1とVM-2でファイル構成が同じ
### 後でファイルを調べるために余計なファイルを一度消去します
# --------------- 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
```

```bash:
[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)を編集するモードです。

```diff:heartbeatの設定
[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```と出る場合があるようです。


```bash:dummyリソースの確認
[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/ ```の中身がどんどん増えていきます。一体何が起きているのかを確認します。

```bash:/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と一致しそうです。

増えた他のファイルを見てみます。

```bash:cib-*.sigとcib.last
[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ハッシュかどうか確認します。

```bash:VM-1側でcib-5.raw.sigの値と一致するものがあるか確認
[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**リソースを停止状態にしてみます。

```diff:VM-dummyリソースを停止(VM-1で操作します)
[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"
```
リソースが停止していることを確認します。

```bash:リソースの停止を確認(VM-1で操作します)
[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)
```
増えたファイルを確認します。

```bash:増えたファイルの確認(VM-1)
[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も設定します。

```diff:VM-dummyを削除しapache・グループ・ロケーションを追加する
[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"
```

どのようになるか確認します。

```diff:apache追加＋グルーピングの設定後
[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設定編～ その２(linux-ha.osdn.jp)](http://linux-ha.osdn.jp/wp/archives/3855)
[動かして理解するPacemaker ～CRM設定編～ その３(linux-ha.osdn.jp)](http://linux-ha.osdn.jp/wp/archives/3868)

*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設定編～ その３(linux-ha.osdn.jp)](https://linux-ha.osdn.jp/wp/archives/3868)

ここでは、VM-1をMasterとして、仮想IPとApacheを起動さます。
Apacheのhttpd.confのListenディレクティブで、仮想IPを指定しているため、仮想IPを持っていない状態でApacheは起動しません。
それを踏まえて、仮想IPが設定されたあとにApacheが起動するようにします。
groupの定義では、Apacheの前に仮想IPのリソースを追加します。

```diff:VirtualIPとGroupの設定追加
[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
```

設定された内容を確認します。

```bash:VirtualIPとapacheの関係
[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*側でモニターしながら確認します。

```bash:VM-2側でモニターする
[root@VM-2]# crm_mon -Afro
```
```bash:VM-2のVM-dummyリソースをクリーンアップ
[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が起動する順序に修正します。

```diff:groupのVM-1-VIPとVM-1-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*で稼働させたいので、ロケーションを設定します。

```bash:ロケーションの追加
[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)](http://linux-ha.osdn.jp/wp/archives/2528/3)
[Pacemaker/Heartbeat で良く使うクラスタ操作コマンド(ngyuki.hatenablog.com)](http://ngyuki.hatenablog.com/entry/20110511/p1)

###稼働の確認
リソースが揃ったので、稼働させてみます。
####仮想IPの有効化
仮想IP(192.168.144.20/24)が振られていないことを確認します。

```bash:IPの確認
[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アドレスを確認します。

```bash: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からもリソースがスタートしていることを確認できます。

```bash:IPaddr2が動作している状態
============
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が起動していないことを確認します。

```bash:apacheが起動していないことを確認
[root@VM-1]# ps aux | grep httpd | grep -v grep
```
apacheのリソースを起動します。

```bash:apacheのリソース起動
[root@VM-1]# crm resource start VM-1-apache
```
```bash:リソースが起動したか確認
[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: 
```
```bash:httpdプロセスが動いているか確認(VM-1)
[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
```
```bash:VM-1とVM-2からcurlでHTTP接続できるか確認
[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*側で、常にリソースの状態を確認しておきます。

```bash:
[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を停止します。

```bash:VM-1のheartbeat停止
[root@VM-1]# service heartbeat stop
Stopping High-Availability services: Done.
```
```bash:VM-1-VIPの消失を再確認
[root@VM-1]# ip a | grep 144                                                                              
    inet 192.168.144.21/24 brd 192.168.144.255 scope global eth1
```
```bash:VM-2のモニタリング状況
(前略)
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で確認します。

```bash:VM-1から確認
[root@VM-1]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
```
- *VM-2*側で正常にApacheが起動しているようです。

*VM-1*のheartbeatを起動し、*VM-1*へリソースが戻るか確認します。

```bash:VM-1のheartbeat起動
[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を停止します。

```bash:heartbeatの停止
[root@VM-1]# service heartbeat stop                                                                       
Stopping High-Availability services: Done.

[root@VM-2]# service heartbeat stop                                                                       
Stopping High-Availability services: Done.
```

corosyncを起動します。

```bash: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で状況を確認します。

```bash:状況の確認
[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*がオフラインになっているようです。

確認します。

```bash:
[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で使用していたと思われるノードを削除します。

```bash:ノードの削除
# ノードの確認
[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
```

どうなったか確認します。

```bash:
[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 ]
```
- どうやら認識しているノードを削除してしまったようです。

もう一度削除してみます。

```bash:
[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
```
- 削除できないようです。

手動で削除します。

```diff:VM-1とVM-2をクラスタ構成から削除する
[root@VM-1]# crm configure edit

- node VM-1
- node VM-2
(後略)
```

状況を確認します。

```bash:ノードが0の状態での確認
[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*側でリソースの状態を確認しておきます。

```bash:
[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を停止します。

```bash:
[root@VM-1]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]
Waiting for corosync services to unload:....             [  OK  ]
```
```bash:crm_monの状態
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で異なっていました。


```bash:
heartbeat稼働時
Stack: Heartbeat

corosync稼働時
Stack: openais
```
- Stackの部分が、corosyncではなくopenaisになっています。前身のOpenAISプロジェクトの名残でしょうか。

#冗長構成へ組み込む#2
CentOS7でcorosyncを動作させます。
この段階で、CentOS7にcorosync、pacemaker、Apache、Apacheの起動スクリプトがインストールされているはずです。

pacemakerの状態を確認し、起動します。

```bash: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
```
```diff:crmへリソース管理を追加
[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を使用します。
- コメントが残るようです。
- ダブルコーテーションは自動的に削除されます。

状態の確認

```bash:
[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となっています。

###稼働の確認
リソースを有効にします。

```bash:リソースの有効化
[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で起動するようにします。

```bash:VM-1のpacemakerを停止しリソースが移ったか確認する
[root@VM-1]# systemctl stop pacemaker
[root@VM-1]# curl VM1-HTTPD
<html><body><h1>It works!</h1></body></html>
```
```bash:VM-2側でリソースを確認する
[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されているか確認します。

```bash:cib.lastの値を見る
[root@VM-1]# cat /var/lib/pacemaker/cib/cib.last
```
- heartbeat3のときと比べると、保存先が異なるだけでやっている内容は同じのようです。

corosync1+pacemaker1.0ではどうでしょうか。
上記で作成したCentOS6で確認してみます。

```bash:cib.lastの値を見る(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を確認します

```bash:/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を使用しているので当然といえば当然です。

以上で、作業は終わりです。


```bash:学習できたcrmコマンド
crm configure [リソースの定義]     # リソースの追加
crm configure delete [リソース名]  # リソースの削除
crm resource start                # リソースの開始
crm resource stop                 # リソースの停止
crm resource cleanup [リソース名] [ノード名]
                                  # 故障履歴の削除
crm node list                     # ノードの一覧
crm node delete [ノード名]         # ノードの削除
```


タイトルにある**違いを感じる**は、実施しているうちに感じ取れましたので、結論にまとめています。