以前CentOS7でGlusterFSのレプリケーション - Qiitaを試したが、DRBDも試してみた。
- 8.4は8.3と設定ファイルの書式が変わったが、下位互換あり。
- 8.3と比べてパフォーマンスの向上
- 8.3は開発終了
参考サイト
GlusterFSと比較した利点
- GlusterFSはpeer間の通信ができない場合、1分間利用ができなくなる。
パッケージについて
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://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
パッケージインストール
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
+ 192.168.100.199 drbd01
+ 192.168.100.200 drbd02
resourceの設定
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の初期化
# 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埋めする。
# 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
# 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側で実施
# 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
動作確認
[root@drbd01 ~]# mount /dev/drbd0 /mnt
[root@drbd01 ~]# find /etc > /mnt/etc.txt
[root@drbd01 ~]# more /mnt/etc.txt
...
[root@drbd01 ~]# umount /dev/drbd0
[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切り替え
[root@drbd01 drbd.d]# drbdadm secondary mysqldata
[root@drbd02 drbd.d]# drbdadm primary mysqldata
[root@drbd01 drbd.d]# drbdadm secondary mysqldata
両方ともPrimaryに設定
[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
net {
+ allow-two-primaries;
}
service drbd restart
[root@drbd01 ~]# drbdadm role mysqldata
Primary/Secondary
[root@drbd02 ~]# drbdadm role mysqldata
Secondary/Primary
[root@drbd02 ~]# drbdadm primary mysqldata
Primary/Primary
両方ともPrimaryに設定した場合の注意点
必ず両方ともumountしている状態を一度作らないといけない。
[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
uname -n
で出力されるものと*.resのonで指定したホスト名とが一致する必要がある。
- HOSTNAME=localhost.localdomain
+ HOSTNAME=drbd01
reboot
同期が始まらない
# 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
# 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ポートが塞がれているのが原因。
iptables -F
service iptables save
service iptables restart
# 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
[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