CentOS6.6のLinux-HAでDRBDを構築する手順めも

# 前置き

以下の記事のおまけです。
[CentOS6.6のLinux-HAでDRBD上にOracleデータベースを構築する](http://qiita.com/takusamar/items/134fbb8fbb736fd8a8a6)

Oracleをインストールする前までのLinux-HA構築手順をメモしておきます。

# CentOSのインストール

ホスト名、IPアドレス設定

* ノードA　ホスト名:OraSv1　eth0:192.168.10.101　eth1:192.168.1.101
* ノードB　ホスト名:OraSv2　eth0:192.168.10.102　eth1:192.168.1.102

インストール時、DRBDで２重化するパーティション（/ora ext4）を追加する。
/etc/fstabがこうなるように。

```sh:/etc/fstab
/dev/mapper/vg-lv_root  /             ext4    defaults        1 1
/dev/mapper/vg-lv_home  /home         ext4    defaults        1 2
/dev/mapper/vg-lv_ora   /ora          ext4    defaults        1 2
```

# 初期設定
			
DRBDで管理するパーティションをマウントしないよう、/oraをコメントアウトする。

```sh:/etc/fstab`
/dev/mapper/vg-lv_root  /             ext4    defaults        1 1
/dev/mapper/vg-lv_home  /home         ext4    defaults        1 2
# /dev/mapper/vg-lv_ora   /ora          ext4    defaults        1 2
```

/oraをアンマウントする。
`umount /ora`

パーティションの中身を空にする			
`dd if=/dev/zero bs=1M count=1 of=/dev/mapper/vg-lv_ora;sync`

ホスト名設定

```sh:/etc/hosts
192.168.10.101  OraSv1
192.168.10.102  OraSv2
```			

HA用のユーザ・グループ作成

```sh:
groupadd -g 1310 haclient
useradd -u 1310 -g haclient -d /home/haclient -s /bin/bash -m haclient
passwd haclient
```

iptables設定

```sh:
iptables -L -n --line-number

iptables -I INPUT 1 -m tcp  -p tcp --dport 7788 -j ACCEPT
iptables -I INPUT 2 -m tcp  -p tcp --sport 7788 -j ACCEPT
iptables -I OUTPUT 1 -m tcp  -p tcp --dport 7788 -j ACCEPT
iptables -I OUTPUT 2 -m tcp  -p tcp --sport 7788 -j ACCEPT

iptables -I INPUT 3 -m udp -p udp --dport 5405 -j ACCEPT
iptables -I INPUT 4 -m udp -p udp --sport 5405 -j ACCEPT
iptables -I OUTPUT 3 -m udp -p udp --dport 5405 -j ACCEPT
iptables -I OUTPUT 4 -m udp -p udp --sport 5405 -j ACCEPT

iptables -L -n --line-number
service iptables save
service iptables restart
```

最新にアップデートしておく
`yum update`

# DRBDのインストール

DRBD関連パッケージをインストール

```sh:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum install -y drbd84-utils kmod-drbd84
```

DRBDの設定

```sh:/etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

#include "drbd.d/global_common.conf";	←コメントアウトする
#include "drbd.d/*.res";		←コメントアウトする

global {
       usage-count no;
}

common {
       syncer { rate 50M; }
}

resource r0 {
       protocol C;
       startup {
               wfc-timeout 120;
               degr-wfc-timeout 120;
       }
       net {
               cram-hmac-alg "sha1";
               shared-secret "password";
               after-sb-0pri disconnect;
               after-sb-1pri disconnect;
               after-sb-2pri disconnect;
       }
       disk {
               on-io-error pass_on;
       }
	# ノードAのホスト名、IPアドレス、DRBDで２重化するパーティションを定義
       on OraSv1 {                  # uname -n　で表示されるホスト名
               device /dev/drbd0;
               disk /dev/mapper/vg-lv_ora;
               address 192.168.10.101:7788;
               meta-disk internal;
       }
	# ノードBのホスト名、IPアドレス、DRBDで２重化するパーティションを定義
       on OraSv2 {                  # uname -n　で表示されるホスト名
               device /dev/drbd0;
               disk /dev/mapper/vg-lv_ora;
               address 192.168.10.102:7788;
               meta-disk internal;
       }
}
```

自動起動OFFにする

```sh:
chkconfig --list drbd
chkconfig drbd off
chkconfig --list drbd
```

DRBDのメタデータを初期化
`drbdadm create-md r0`

おまじない

```sh:
drbdadm -- 6::::1 set-gi r0
drbdadm dump-md r0 > /tmp/md
sed -i -r -e 's/0xF{16}/0x0000000000000000/g' /tmp/md
drbdmeta /dev/drbd0 v08 /dev/mapper/vg-lv_ora internal restore-md /tmp/md ; rm -f /tmp/md
```

# DRBD起動（初回のみ）

DRBD起動（Primary, Secondary両方で実行）

```sh:
service drbd start
service drbd status
drbd driver loaded OK; device status:
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by
mockbuild@Build64R6, 2014-08-17 19:26:04
m:res  cs         ro                   ds                         p mounted  fstype
0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C	
```

両方のノードでこの状態
（Connected  Secondary/Secondary Inconsistent/Inconsistent）
になることを確認する。

以下、ノードAをPrimary、ノードBをSecondaryとして設定を進める。

Secondary側（ノードB）で実行

```sh:
drbdadm invalidate r0

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by
mockbuild@Build64R6, 2014-08-17 19:26:04
 0: cs:SyncSource ro:Secondary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:2473212 nr:0 dw:0 dr:2473212 al:0 bm:0 lo:0 pe:4 ua:0 ap:0 ep:1
wo:f oos:23742668
        [>...................] sync'ed:  9.5% (23184/25596)M
        finish: 0:18:25 speed: 21,444 (21,484) K/sec
```

同期が終わるまで（sync'ed が100％になるまで）待つ。

同期完了するとこうなる。

* ノードA

```sh:
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by
phil@Build64R6, 2014-10-28 10:32:53
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C
```

* ノードB

```sh:
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by
phil@Build64R6, 2014-10-28 10:32:53
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C
```

ノードAで実行		

```sh:
drbdadm primary r0
mkfs.ext4 /dev/drbd0
mount /dev/drbd0 /ora
df
/dev/drbd0            25671160   44992  24315492   1% /ora
```

/dev/drbd0が/oraとして読み書き可能であること。
適当なファイルをノードAで作成してみる。

ノードAで実行

```sh:
echo "DRBD TEST from Node A" > /ora/test.txt
ls /ora
cat /ora/test.txt
DRBD TEST from Node A
```

Primary/Secondaryを切り替えてみる。

```sh:
umount /ora
drbdadm secondary r0
```

ノードBで実行

```sh:
drbdadm primary r0
mount /dev/drbd0 /ora
df
/dev/drbd0            25671160   44992  24315492   1% /ora
cat /ora/test.txt
DRBD TEST from Node A

echo "DRBD TEST from Node B" >> /ora/test.txt
```

Primary/Secondaryを切り替えてみる。

```sh:
umount /ora
drbdadm secondary r0
```

ノードAで実行

```sh:
drbdadm primary r0
mount /dev/drbd0 /ora
cat /ora/test.txt
DRBD TEST from Node A
DRBD TEST from Node B
```

# Pacemakerのインストール

Pacemakerリポジトリを取得、インストール

```sh:
cd /tmp
wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Flinux-ha%2F62369%2Fpacemaker-repo-1.1.12-1.1.el6.x86_64.rpm"
mv redir.php?m=jaist&f=%2Flinux-ha%2F62369%2Fpacemaker-repo-1.1.12-1.1.el6.x86_64.rpm pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm

rpm -ivh pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm
yum install pacemaker-all
```

Corosyncの設定

```sh:/etc/corosync/corosync.conf
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: 7000
       join: 60
       interface {
               member {
                       memberaddr: 192.168.1.101	#ノードA
               }
               member {
                       memberaddr: 192.168.1.102	#ノードB
               }
               ringnumber: 0
               bindnetaddr: 192.168.1.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
       logger_subsys {
               subsys: AMF
               debug: off
       }
}

quorum {
       provider: corosync_votequorum
       expected_votes: 2
       two_node: 1
}
```

自動起動ONにする

```sh:
chkconfig pacemaker on
chkconfig --list pacemaker
chkconfig corosync on
chkconfig --list corosync
```

Pacemaker, Corosync起動（初回のみ）

両方のノードで起動する

```sh:
service corosync start
service pacemaker start
```

> 手動で停止するときはこの順番で停止すること
> service pacemaker stop
> service corosync stop

起動状態の確認（片方のノードで実行すればよい）
`crm_mon -Aro`

```sh:
Last updated: Thu Dec 25 19:27:45 2014	
Last change: Thu Dec 25 19:24:22 2014	
Stack: corosync	
Current DC: OraSv1 (740103615) - partition with quorum	
Version: 1.1.12-561c4cf	
2 Nodes configured	
0 Resources configured	
	
	
Online: [ OraSv1 OraSv2 ]	
	
Full list of resources:	


Node Attributes:	
* Node OraSv1:
* Node OraSv2:
	
Operations:
* Node OraSv1:
* Node OraSv2:
```

両方がOnlineになってればOK（Ctrl+Cで表示終了）

# CRM設定
		
片方のノードで実行すればよい
`crm configure`

```sh:
property no-quorum-policy=ignore stonith-enabled=false
rsc_defaults resource-stickiness=INFINITY migration-threshold=1
commit
exit
```

## DRBDを死活監視対象に設定

念のため、/dev/drbd0 をアンマウントしておく。		
`umount /ora`

`crm configure`

```sh:
primitive drbd_ora ocf:linbit:drbd params drbdconf=/etc/drbd.conf \
drbd_resource=r0 \
op start interval=0s timeout=240s \
op monitor interval=10 role=Slave \
op monitor interval=11 role=Master \
op stop interval=0 timeout=100s on-fail=block
	
ms ms-drbd_ora drbd_ora meta notify=true

primitive fs_ora ocf:heartbeat:Filesystem params run_fsck=no \
device=/dev/drbd0 directory=/ora fstype=ext4 \
op start interval=0s timeout=60s \
op monitor interval=15 timeout=40s \
op stop interval=0 timeout=60s on-fail=ignore

colocation coloc-drbd_fs inf: fs_ora ms-drbd_ora:Master
order order-drbd_fs inf: ms-drbd_ora:promote fs_ora:start

commit
exit
```

状況確認
`crm_mon`

```sh:
 Master/Slave Set: ms-drbd_ora [drbd_ora]
     Masters: [ OraSv1 ]
     Slaves: [ OraSv2 ]
fs_ora      (ocf::heartbeat:Filesystem):    Started OraSv1
```

Mastersになっているノード（OraSv1）で/oraがマウントされていることを確認。

```sh:
df
cat /ora/test.txt
```

Master側をリブート
`shutdown -r now`
		
Slave側がMasterに昇格すること
`crm_mon`

```
 Master/Slave Set: ms-drbd_ora [drbd_ora]
     Masters: [ OraSv2 ]
     Slaves: [ OraSv1 ]
fs_ora      (ocf::heartbeat:Filesystem):    Started OraSv2
```
			
/oraがマウントされていること
`df`

再起動した方がSlavesになっていること

# 仮想IPアドレス作成
			
仮想IPアドレス　192.168.10.100を作る。
Filesystem（fs_ora）とグループ化し、同一ノードで実行するよう設定する。
		
`crm configure`

```sh:
primitive VIP1 ocf:heartbeat:IPaddr2 \
params ip=192.168.10.100 nic=eth0 cidr_netmask=24 \
op start interval=0s timeout=20s \
op stop interval=0s timeout=20s \
op monitor interval=30s

group grpora fs_ora VIP1

commit
exit
```

状況確認
`crm_mon`

```sh:
VIP1    (ocf::heartbeat:IPaddr2):       Started OraSv2
 Master/Slave Set: ms-drbd_ora [drbd_ora]		
     Masters: [ OraSv2 ]		
     Slaves: [ OraSv1 ]		
fs_ora      (ocf::heartbeat:Filesystem):    Started OraSv2		
```

fs_oraとVIP1が同一ノードで起動すること。

別マシンから仮想IPに接続し、仮想IPが起動しているノード（上記の例だとOraSv2）に接続すること。

* * *

設定は以上です。

ここまで出来たら、元記事に戻ってOracleをインストールします。
[CentOS6.6のLinux-HAでDRBD上にOracleデータベースを構築する](http://qiita.com/takusamar/items/134fbb8fbb736fd8a8a6)