CentOS7 3台でクラスタ構築、仮想IPを体験

## 参考

* @takehironet さんの[CentOS 6でPacemaker 1.1をつかう - Qiita](http://qiita.com/takehironet/items/ee6a50f7f9b349abd085)
* siosテクノロジー社の[SIOS "OSSよろず" ブログ出張所: pacemaker + corosync で HA クラスタ構築](http://sios-oss.blogspot.jp/2013/05/pacemaker-corosync-ha.html)
* @fetaro さんの[Pacemaker+DRBD+heartbeatでMySQLのクラスタ - Qiita](http://qiita.com/fetaro/items/9a836ed0922c82f53a25)

### リソース設定例

* [03.Pacemaker+Heartbeat - DAZZ](https://sites.google.com/site/flyingsawnet/notes/linux-ha/03-pacemaker-heartbeat)
構成:
* [Heartbeat v3 + Pacemaker 再び - とあるサーバ管理者 & PG & SEのメモ帳](http://d.hatena.ne.jp/civicivi/20110218/1298025235)
* [インフラ構築手順書 PaceMaker+DRBD構築1 【PaceMakerのインストール】](http://infra.blog.shinobi.jp/Entry/40/)

## ノード説明

* n1: 192.168.100.110
* n2: 192.168.100.111
* n3: 192.168.100.112
* 仮想IP: 192.168.100.100を割り振りたい

## パッケージインストール

```bash:インストール
yum install -y corosync pacemaker pcs
```

* corosync : クラスタ構築
* pacemaker : リソース制御を行う。仮想IP付与とか。
* pcs : pacemakerをcliで操作するコマンド

# クラスタ構築

## corosync設定

```bash:ひな形コピー
cd /etc/corosync/
cp -a corosync.conf{.example.udpu,}
```

```diff:/etc/corosync/corosync.conf
# Please read the corosync.conf.5 manual page
totem {
        version: 2

        crypto_cipher: none
        crypto_hash: none

        interface {
                ringnumber: 0
-               bindnetaddr: 10.16.35.0
+               bindnetaddr: 192.168.100.0
                mcastport: 5405
                ttl: 1
        }
        transport: udpu
}

logging {
        fileline: off
        to_logfile: yes
-       to_syslog: yes
+       to_syslog: no
        logfile: /var/log/cluster/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
                subsys: QUORUM
                debug: off
        }
}

nodelist {
        node {
-               ring0_addr: 10.16.35.101
+               ring0_addr: 192.168.100.110
                nodeid: 1
        }

        node {
-               ring0_addr: 10.16.35.102
+               ring0_addr: 192.168.100.111
                nodeid: 2
        }

        node {
-               ring0_addr: 10.16.35.103
+               ring0_addr: 192.168.100.112
+               nodeid: 3
        }

-       node {
-               ring0_addr: 10.16.35.104
-       }

-       node {
-               ring0_addr: 10.16.35.105
-       }
}

quorum {
        # Enable and configure quorum subsystem (default: off)
        # see also corosync.conf.5 and votequorum.5
-       #provider: corosync_votequorum
+       provider: corosync_votequorum
+       expected_votes: 3
}
```

* 3台とも上記設定にする。

## pacemaker設定

設定できる項目は以下だが、よくわからないので今回は変更しない。

```bash:/etc/sysconfig/pacemaker
# PCMK_STACK=cman
# PCMK_debug=yes|no|crmd|pengine|cib|stonith-ng|attrd|pacemakerd
# PCMK_logfile=/var/log/pacemaker.log
# PCMK_logfacility=none|daemon|user|local0|local1|local2|local3|local4|local5|local6|local7
# PCMK_logpriority=emerg|alert|crit|error|warning|notice|info|debug
# PCMK_trace_functions=function1,function2,function3
# PCMK_trace_files=file.c,other.h
# PCMK_trace_formats="Sent delete %d"
# PCMK_trace_tags=tag1,tag2
# PCMK_trace_blackbox=fn:line,fn2:line2,...
# PCMK_blackbox=yes|no|crmd|pengine|cib|stonith-ng|attrd|pacemakerd
# PCMK_uname_is_uuid=no
# PCMK_schema_directory=/some/path
# PCMK_authkey_location=/etc/pacemaker/authkey
# PCMK_remote_port=3121
# PCMK_ipc_type=shared-mem|socket|posix|sysv
# PCMK_ipc_buffer=20480
# PCMK_valgrind_enabled=yes
# PCMK_valgrind_enabled=cib,crmd
# PCMK_callgrind_enabled=yes
# PCMK_callgrind_enabled=cib,crmd
```

## サービス起動

```bash:
systemctl start pacemaker
```

* pacemakerがcorosyncを起動する

### ログ

* /var/log/pacemaker.log
* /var/log/cluster/corosync.log

```bash:状態確認
# crm_mon -A
Last updated: Sun Dec 14 08:56:08 2014
Last change: Sun Dec 14 08:56:08 2014 via crmd on n3
Stack: corosync
Current DC: n3 (1) - partition with quorum
Version: 1.1.10-32.el7_0.1-368c726
3 Nodes configured
0 Resources configured


Online: [ n1 n2 n3 ]


Node Attributes:
* Node n1:
* Node n2:
* Node n3:
```

# pcsコマンドで仮想IPの設定


```bash:
# STONITHを無効
pcs property set stonith-enabled=false

# スプリットブレインが発生してもクォーラムが特別な動作を行わないように設定
pcs property set no-quorum-policy=ignore

# 仮想IP
pcs resource create dbvip ocf:heartbeat:IPaddr2 \
  ip=192.168.100.100 cidr_netmask=24 \
  nic="eth1" \
  op monitor interval=30s
```

ocfとは`/usr/lib/ocf/resource.d/heartbeat/`以下にあるスクリプト

```diff:crm_mon&nbsp;-A
 Last updated: Sun Dec 14 09:07:34 2014
 Last change: Sun Dec 14 09:06:31 2014 via cibadmin on n1
 Stack: corosync
 Current DC: n1 (1) - partition with quorum
 Version: 1.1.10-32.el7_0.1-368c726
 3 Nodes configured
 1 Resources configured
 
 
 Online: [ n2 n3 n1 ]
 
+dbvip   (ocf::heartbeat:IPaddr2):	Started n3
 
 Node Attributes:
 * Node n2:
 * Node n3:
 * Node n1:
```

* n3にて192.168.100.100が付与されていることが確認できる。
* OS再起動しても仮想IPがpacemakerによって自動で付与されることを確認。

リソースの削除は`pcs resource delete dbvip`


## pcsコマンドでコンフィグ確認

```bash:
# pcs config
Cluster Name:
Corosync Nodes:
 192.168.100.110 192.168.100.111 192.168.100.112
Pacemaker Nodes:
 n2 n3 n1

Resources:
 Resource: dbvip (class=ocf provider=heartbeat type=IPaddr2)
  Attributes: ip=192.168.100.100 cidr_netmask=24 nic=eth1
  Operations: start interval=0s timeout=20s (dbvip-start-timeout-20s)
              stop interval=0s timeout=20s (dbvip-stop-timeout-20s)
              monitor interval=30s (dbvip-monitor-interval-30s)

Stonith Devices:
Fencing Levels:

Location Constraints:
Ordering Constraints:
Colocation Constraints:

Cluster Properties:
 cluster-infrastructure: corosync
 dc-version: 1.1.10-32.el7_0.1-368c726
 no-quorum-policy: ignore
 stonith-enabled: false
```

## 設定ファイルを書き出し、読み込み

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/tukiyo3">@tukiyo3</a> pcs cluster cib hoge.cib などとすると手元に設定ファイルがダンプされます。pcs -f hoge.cib COMMAND などとして設定ファイルに操作を行い、pcs cluster cib-push hoge.cibで適用、がお勧めです</p>&mdash; たけひろ (@takehironet) <a href="https://twitter.com/takehironet/status/543933404245286912">2014, 12月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

```bash:設定の書き出し
pcs cluster cib output.cib
```

```bash:変更
pcs -f output.cib <command>
```

```bash:設定の読み込み
pcs cluster cib-push output.cib
```