Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

以前CentOS7でGlusterFSのレプリケーション - Qiitaを試したが、DRBDも試してみた。

  • 8.4は8.3と設定ファイルの書式が変わったが、下位互換あり。
  • 8.3と比べてパフォーマンスの向上
  • 8.3は開発終了

参考サイト

drbd.conf解説
和訳
DRBD接続障害

GlusterFSと比較した利点

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

パッケージについて

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

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

ELRepo

ELRepo で配布されているので、そこから取得しましょう。

設定

環境

  • 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

/etc/hosts
+ 192.168.100.199 drbd01
+ 192.168.100.200 drbd02

resourceの設定

/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の初期化

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埋めする。

# 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
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側で実施
# 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

動作確認

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
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切り替え

primary->secondary切り替え
[root@drbd01 drbd.d]# drbdadm secondary mysqldata
secondary->primary切り替え
[root@drbd02 drbd.d]# drbdadm primary mysqldata
primary->secondary切り替え
[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
/etc/drbd.d/global_common.conf
   net {
+         allow-two-primaries;
   }
両系でrestart
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で指定したホスト名とが一致する必要がある。

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

reboot

同期が始まらない

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
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ポートが塞がれているのが原因。
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
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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away