CentOS6.5でDRBD 8.4を試してみた

以前[CentOS7でGlusterFSのレプリケーション - Qiita](http://qiita.com/tukiyo3/items/bb5709159e7bc55b9ba6)を試したが、DRBDも試してみた。

* 8.4は8.3と設定ファイルの書式が変わったが、下位互換あり。
* 8.3と比べてパフォーマンスの向上
* [8.3は開発終了](http://www.slideshare.net/MotoharuKubo/140228-osc)


# 参考サイト

[drbd.conf解説](http://unixservermemo.web.fc2.com/sv/drbd-conf.htm)
[和訳](http://www.drbd.jp/users-guide/users-guide.html)
[DRBD接続障害](http://d.hatena.ne.jp/tech_memo/20101007#1286426102)

# GlusterFSと比較した利点

* GlusterFSはpeer間の通信ができない場合、１分間利用ができなくなる。

# パッケージについて

CentOS5はCentOSのextraリポジトリにdrbdが用意されています。

* http://mirror.centos.org/centos/5/extras/x86_64/RPMS/
* drbd-8.0.16-5.el5.centos.x86_64.rpm
* drbd82-8.2.6-1.el5.centos.x86_64.rpm
* drbd83-8.3.15-2.el5.centos.x86_64.rpm

しかしバージョンが古いことと、CentOS6,7用はありません。

## ELRepo

[ELRepo](http://elrepo.org/) で配布されているので、そこから取得しましょう。

* http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el5/x86_64/RPMS/
* http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/
* http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el7/x86_64/RPMS/

* kmod-drbd84-8.4.4
* drbd84-utils-8.4.4-2.el5.elrepo.x86_64.rpm

# 設定

## 環境

* CentOS6.5
* 192.168.100.199 drbd01
* 192.168.100.200 drbd02

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

```bash:パッケージインストール
yum install -y wget perl
wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm
wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
rpm -ivh *drbd*.rpm
```

## hosts

```diff:/etc/hosts
+ 192.168.100.199 drbd01
+ 192.168.100.200 drbd02
```

## resourceの設定

```bash:/etc/drbd.d/mysqldata.res
resource mysqldata {
    volume 0 {
        device /dev/drbd0;
        disk /dev/vdb1;
        meta-disk internal;
    }
    on drbd01 {
        address 192.168.100.199:7788;
    }
    on drbd02 {
        address 192.168.100.200:7788;
    }
}
```

## resourceの初期化

```bash:create-md失敗例
# drbdadm create-md mysqldata
Writing meta data...
md_offset 8589864960
al_offset 8589832192
bm_offset 8589570048

Found ext3 filesystem
     8388544 kB data area apparently used
     8388252 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.

Command 'drbdmeta 0 v08 /dev/vdb1 internal create-md' terminated with exit code 40
```

> zero out the device (destroy the filesystem)

とあるので ddでzero埋めする。

```bash:
# dd if=/dev/zero of=/dev/vdb1 bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00463576 s, 226 MB/s
```

```bash:create-md成功例
# drbdadm create-md mysqldata
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
```

## resourceのフォーマット

* Primary側でのみ/dev/drbd0にアクセスができるので、Primary側で実施

```bash:
# mkfs.xfs /dev/drbd0
meta-data=/dev/drbd0             isize=256    agcount=4, agsize=524266 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=2097063, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

## 動作確認

```bash:Primary側から利用できることを確認
[root@drbd01 ~]# mount /dev/drbd0 /mnt
[root@drbd01 ~]# find /etc > /mnt/etc.txt
[root@drbd01 ~]# more /mnt/etc.txt
...
[root@drbd01 ~]# umount /dev/drbd0
```

```bash:Secondary側から利用できないことを確認
[root@drbd02 drbd.d]# mount -t xfs /dev/drbd0 /mnt/
mount: ブロックデバイス /dev/drbd0 は書き込み禁止です、読込み専用でマウントします
mount: 不正なメディア形式です
[root@drbd02 drbd.d]# ls /mnt/
[root@drbd02 drbd.d]# umount /mnt
umount: /mnt: マウントされていません
```

## Primary/Secondary切り替え

```bash:primary->secondary切り替え
[root@drbd01 drbd.d]# drbdadm secondary mysqldata
```

```bash:secondary->primary切り替え
[root@drbd02 drbd.d]# drbdadm primary mysqldata
```

```bash:primary->secondary切り替え
[root@drbd01 drbd.d]# drbdadm secondary mysqldata
```

## 両方ともPrimaryに設定

```bash:
[root@drbd02 ~]# drbdadm primary mysqldata
0: State change failed: (-1) Multiple primaries not allowed by config
Command 'drbdsetup primary 0' terminated with exit code 11
```

```diff:/etc/drbd.d/global_common.conf
   net {
+         allow-two-primaries;
   }
```

```bash:両系でrestart
service drbd restart
```

```bash:状態確認
[root@drbd01 ~]# drbdadm role mysqldata
Primary/Secondary
[root@drbd02 ~]# drbdadm role mysqldata
Secondary/Primary
[root@drbd02 ~]# drbdadm primary mysqldata
Primary/Primary
```

## 両方ともPrimaryに設定した場合の注意点

必ず両方ともumountしている状態を一度作らないといけない。

```bash:動作確認
[root@drbd01 ~]# mount /dev/drbd0 /mnt
[root@drbd01 ~]# hostname > /mnt/drbd01.txt

[root@drbd02 ~]# mount /dev/drbd0 /mnt
[root@drbd02 ~]# ls /mnt

[root@drbd01 ~]# umount /mnt

[root@drbd02 ~]# ls /mnt
[root@drbd02 ~]# umount /mnt
[root@drbd02 ~]# mount /mnt
[root@drbd02 ~]# ls /mnt
drbd01.txt
```


# トラブルシューティング

## ホスト名の設定漏れ

> Starting DRBD resources: WARN: no normal resources defined for this host (localhost.localdomain)!?
> Misspelled name of the local machine with the 'on' keyword ?

参考: [man drbd.conf](http://www.drbd.org/users-guide/re-drbdconf.html)

`uname -n`で出力されるものと*.resのonで指定したホスト名とが一致する必要がある。

```diff:/etc/sysconfig/network
- HOSTNAME=localhost.localdomain
+ HOSTNAME=drbd01
```

`reboot`


## 同期が始まらない

```bash:drbd01
# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s
    ns:0 nr:0 dw:0 dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8388252
```

```bash:drbd02
# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
 0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----s
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8388252
```

* 7788ポートが塞がれているのが原因。

```bash:7788ポートを開けるか、全消し
iptables -F
service iptables save
service iptables restart
```

```bash:同期が始まった
# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:4675584 nr:0 dw:0 dr:4676248 al:0 bm:285 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:3712668
	[==========>.........] sync'ed: 55.8% (3624/8188)M
	finish: 0:01:26 speed: 42,928 (30,164) K/sec
```

```bash:primary側から/dev/drbd0にアクセスができる
[root@drbd01 drbd.d]# fdisk -l /dev/drbd0

ディスク /dev/drbd0: 8589 MB, 8589570048 バイト
ヘッド 255, セクタ 63, シリンダ 1044
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000 
```