DRBDで複数パーテション(Device,Disk)の同期を行う

DRBDはすでに色々使われている技術ですが、複数パーテション(Device,Disk)で行っている記述がネット上に少なかったので記事として残します。
ちょうど、Postfix(Maildir形式)+FMLの環境で運用されているメールサーバにDRBDを組み込もうとしてたので、その検証環境でマニュアル化。

すでに以下のようなパーテションが切られていることを想定。
※なお、DRBDはパーテション毎に同期を取るので、FMLで利用している/var/spool/mlについては余っているDisk領域を利用する。

■DRBD前のパーテション構成

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda2             4031680    280672   3546208   8% /
tmpfs                   957248         0    957248   0% /dev/shm
/dev/xvda1               99150     28575     65455  31% /boot
/dev/xvda5            24190092    224864  22736428   1% /home
/dev/xvda7             8063408   1218704   6435104  16% /usr
/dev/xvda6            16126920    263420  15044300   2% /var

■環境

CentOS 6.4(64bit)
primary:172.16.11.33
secondary:172.16.11.34
※XenServer上の仮想OS

DRBD検証環境

 

▼DRBDで利用するパーテション

/home
/var/spool/ml

▼/var/spool/mlの領域をfdiskにて作成

※Primary,Secondary共に行う

# fdisk /dev/xvda

今回はディスクの残り容量を全て/var/spool/mlの領域とした

/dev/xvda8            6898       15666    70425568+  83  Linux

作成したパーテションを反映させると以下の様に再起動を求められる。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

再起動しないと以下の様にデバイスとして認識されない

# ls -la /dev/xvda*
brw-rw---- 1 root disk 202, 0 Aug 29 10:57 /dev/xvda
brw-rw---- 1 root disk 202, 1 Aug 29 10:24 /dev/xvda1
brw-rw---- 1 root disk 202, 2 Aug 29 10:24 /dev/xvda2
brw-rw---- 1 root disk 202, 3 Aug 29 10:24 /dev/xvda3
brw-rw---- 1 root disk 202, 4 Aug 29 10:24 /dev/xvda4
brw-rw---- 1 root disk 202, 5 Aug 29 10:24 /dev/xvda5
brw-rw---- 1 root disk 202, 6 Aug 29 10:24 /dev/xvda6
brw-rw---- 1 root disk 202, 7 Aug 29 10:24 /dev/xvda7

再起動実施

# shutdown -r now

再起動後に反映されていることを確認

# ls -la /dev/xvda*
brw-rw---- 1 root disk 202, 0 Aug 29 11:00 /dev/xvda
brw-rw---- 1 root disk 202, 1 Aug 29 11:00 /dev/xvda1
brw-rw---- 1 root disk 202, 2 Aug 29 11:00 /dev/xvda2
brw-rw---- 1 root disk 202, 3 Aug 29 11:00 /dev/xvda3
brw-rw---- 1 root disk 202, 4 Aug 29 11:00 /dev/xvda4
brw-rw---- 1 root disk 202, 5 Aug 29 11:00 /dev/xvda5
brw-rw---- 1 root disk 202, 6 Aug 29 11:00 /dev/xvda6
brw-rw---- 1 root disk 202, 7 Aug 29 11:00 /dev/xvda7
brw-rw---- 1 root disk 202, 8 Aug 29 11:00 /dev/xvda8

▼ディレクトリ作成

※Primary,Secondary共に行う

/var/spool/mlのディレクトリを作成する

# mkdir /var/spool/ml

 

■DRBD構築準備

▼リポジトリの登録

※Primary,Secondary共に行う

# rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

なお、上記URLが利用できない場合は以下を利用する。

# rpm -Uvh http://elrepo.reloumirrors.net/elrepo/el6/x86_64/RPMS/elrepo-release-6-4.el6.elrepo.noarch.rpm

 

▼DRBDのインストール

※Primary,Secondary共に行う
yum search drbdの検索結果から以下をインストールする。
drbd84-utils.x86_64
kmod-drbd84.x86_64

# yum install drbd84-utils.x86_64 kmod-drbd84.x86_64

▼DRBDで利用するパーテションの自動マウント停止

※Primary,Secondary共に行う

/etc/fstabにてすでにマウントされている/homeをコメントアウトし、起動時にマウントされないようにする

 

 ■DRBD設定

 ▼/etc/drbd.confの設定

※Primary,Secondary共に行う

# cd /etc/
# cp -p drbd.conf drbd.conf.org
# vi drbd.conf

以下の様に記述。

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global.conf";
include "drbd.d/*.res";

 

# cd /etc/drbd.d/
# vi global.conf

以下の様に記述。

global {
    usage-count no;
}

common {
  syncer { rate 500M; } <--- 環境によって、同期速度の調整をする。
}

 

▼リソース設定ファイルを作成

※Primary,Secondary共に行う

drbd.confにて*.resファイルを読み込む様にしているので、それに合わせたファイル名にすること。
今回は複数パーテションを利用するので、/homeで利用するリソース名を「r0」、/var/spool/mlでは「r1」とした。

# vi disk.res
========================
resource r0 { // リソース名をr1とする
  protocol C;  // 同期プロトコル(ローカルディスクとリモートディスクの両方にデータを書き込んだらディスクへの書き込みが完了したと判断する。)
  device /dev/drbd0; // DRBDで利用するデバイス。複数利用する場合は、resource毎に/dev/drbd1,/dev/drbd2などにする
  disk   /dev/xvda5; // ディスクパーテション。ここでは/homeを指定するので/dev/xvda5となる。
  on pri { // uname -n で表示される名前を指定
    address    172.16.11.33:7788; // PrimaryサーバのIPアドレス。ポートは空きポートであれば可。複数パーテションを利用する場合はポート番号の競合はさせない。
    meta-disk  internal; // 下位デバイスの最後の部分にメタデータが作られる。
  }
  on sec {
    address    172.16.11.34:7788;
    meta-disk  internal;
  }
}

resource r1 { // リソース名をr1とする
  protocol C;
  device /dev/drbd1; // リソース名「r0」と競合させない
  disk   /dev/xvda8; // ディスクパーテション。ここでは/var/spool/mlで利用する/dev/xvda8を指定。
  on pri {
    address    172.16.11.33:7789; // リソース名「r0」と競合させないポート番号とする
    meta-disk  internal;
  }
  on sec {
    address    172.16.11.34:7789;
    meta-disk  internal;
  }
}
========================

記述の詳しい説明は以下を参照

http://www.drbd.jp/users-guide/re-drbdconf.html

 

▼/homeのマウント解除

※Primary,Secondary共に行う

すでにマウントされている/homeのマウントを解除する。
OSインストール時にパーテションを切っているので、これを忘れがちになる。

# umount /home

▼メタデータ領域の確保と初期化

※Primary,Secondary共に行う

# drbdadm create-md r0(リソース名)

以下の様なメッセージが表示される場合がある。原因はすでにファイルシステムを作成しているから。

md_offset 25165819904
al_offset 25165787136
bm_offset 25165017088

Found ext3 filesystem
    24576000 kB data area apparently used
    24575212 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/xvda5 internal create-md' terminated with exit code 40

上記エラーが発生した場合は、該当パーテションのデータを別パーテションに退避させてから以下を実行。

# dd if=/dev/zero bs=1M count=1 of=/dev/xvda5; sync

※「/dev/xvda5」の場所は必ず確認すること。DRBDで利用しないパーテションにて行ってしまうと壊れます。
「dd」コマンドを実行したら、再度以下を実行する。

# drbdadm create-md r0(リソース名)

正常であれば、以下が表示される

initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.

※DRBDを複数パーテションで利用する場合は、リソース名を変えて実行する
面倒な場合は、「drbdadm create-md all」でも良いが、確認のため個別でやったほうが安心。

 

 ▼DRBDの起動

※Primary,Secondary共に行う

自動起動設定を行う

# chkconfig drbd on

起動実施

# /etc/init.d/drbd start

※もう1台のDRBDが起動していないと以下のエラーが表示されるが、「yes」と答える

Starting DRBD resources: [
     create res: r0 r1
   prepare disk: r0 r1
    adjust disk: r0 r1
     adjust net: r0 r1
]
..........
***************************************************************
 DRBD's startup script waits for the peer node(s) to appear.
 - In case this node was already a degraded cluster before the
   reboot the timeout is 0 seconds. [degr-wfc-timeout]
 - If the peer was available before the reboot the timeout will
   expire after 0 seconds. [wfc-timeout]
   (These values are for resource 'r0'; 0 sec -> wait forever)
 To abort waiting enter 'yes' [  10]:

▼初期同期のコピー元を指定する

※プライマリへ昇格させるので、Primaryのみで行う

# drbdadm -- --overwrite-data-of-peer primary r0
# drbdadm -- --overwrite-data-of-peer primary r1

▼同期状態の確認

 # watch 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:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:880128 nr:0 dw:0 dr:880792 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:23695084
        [>....................] sync'ed:  3.6% (23136/23996)M
        finish: 0:31:10 speed: 12,664 (12,396) K/sec
 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:1101824 nr:0 dw:0 dr:1102488 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:69321556
        [>....................] sync'ed:  1.6% (67696/68772)M
        finish: 1:37:02 speed: 11,884 (16,444) K/sec
========================

▼/proc/drbdの解説

・cs:ネットワーク接続状態
SyncSourceは同期中であることを表してます。同期が終了するとConnectedになります。
相手ノードのDRBDが停止している時は、WFConnectionまたはStandAloneになります。

・ro:DRBDリソースの役割
Primary/Secondaryは自機がプライマリ、他機がセカンダリであることを表します。スラッシュ(/)の
左が自機の役割、右が他機の役割です。

・ds:データ整合状況
ディスク上のデータの整合状況をUpToDate、Inconsistent、DUnknownなどの値で表示します。
スラッシュの左が自機、右が他機の状態です。同期中はUpToDate/Inconsistent(あるいはその逆)になり、
ディスクI/Oとネットワークの両方が正常で、同期が終わったときはUpToDate/UpToDateになります。

 

以下のコマンドでも同期状態を確認できます。

# /etc/init.d/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
...    sync'ed:    2.4%               (67128/68772)M
...    sync'ed:    6.0%               (22572/23996)M
0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
1:r1   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
========================

▼DRBDで利用するパーテションをマウントする

 ※Primaryのみで行う

ファイルシステムを作成します。

# mkfs.ext4 /dev/drbd0
# mkfs.ext4 /dev/drbd1

パーテションをマウントします

# mount /dev/drbd0 /home
# mount /dev/drbd1 /var/spool/ml
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda2             4031680    281928   3544952   8% /
tmpfs                   957248         0    957248   0% /dev/shm
/dev/xvda1               99150     28575     65455  31% /boot
/dev/xvda7             8063408   1222692   6431116  16% /usr
/dev/xvda6            16126920    268456  15039264   2% /var
/dev/drbd0            24189304    176064  22784480   1% /home
/dev/drbd1            69316940    184084  65611688   1% /var/spool/ml

■動作確認方法

Primary側の/homeと/var/spool/ml内にふそれぞれファイルを作成

[Primary側]

# cd /home
# touch home.txt
[root@pri home]# ls -al
total 24
drwxr-xr-x   3 root root  4096 Aug 29 14:26 .
dr-xr-xr-x. 27 root root  4096 Aug 29 11:29 ..
-rw-r--r--   1 root root     0 Aug 29 14:26 home.txt
drwx------   2 root root 16384 Aug 29 14:18 lost+found

# cd /var/spool/ml
# touch var_spool_ml.txt
# ls -al
total 24
drwxr-xr-x   3 root root  4096 Aug 29 14:27 .
drwxr-xr-x. 12 root root  4096 Aug 29 14:20 ..
drwx------   2 root root 16384 Aug 29 14:19 lost+found
-rw-r--r--   1 root root     0 Aug 29 14:27 var_spool_ml.txt

/homeと/var/spool/mlをアンマウント

# umount /home
# umount /var/spool/ml
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda2             4031680    281928   3544952   8% /
tmpfs                   957248         0    957248   0% /dev/shm
/dev/xvda1               99150     28575     65455  31% /boot
/dev/xvda7             8063408   1222692   6431116  16% /usr
/dev/xvda6            16126920    268464  15039256   2% /var

DRBD停止

# /etc/init.d/drbd stop
Stopping all DRBD resources: .

 

[Secondary側]

# drbdadm primary r0
# drbdadm primary r1

もしくは

# drbdadm primary all
# mount /dev/drbd0 /home
# mount /dev/drbd1 /var/spool/ml
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda2             4031680    292016   3534864   8% /
tmpfs                   957248         0    957248   0% /dev/shm
/dev/xvda1               99150     28581     65449  31% /boot
/dev/xvda7             8063408   1228092   6425716  17% /usr
/dev/xvda6            16126920    268436  15039284   2% /var
/dev/drbd0            24189304    176064  22784480   1% /home
/dev/drbd1            69316940    184084  65611688   1% /var/spool/ml

同期されたデータが確認できる

# ls -la /home
total 24
drwxr-xr-x   3 root root  4096 Aug 29 14:26 .
dr-xr-xr-x. 26 root root  4096 Aug 29 13:29 ..
-rw-r--r--   1 root root     0 Aug 29 14:26 home.txt
drwx------   2 root root 16384 Aug 29 14:18 lost+found

# ls -la /var/spool/ml
total 24
drwxr-xr-x   3 root root  4096 Aug 29 14:27 .
drwxr-xr-x. 12 root root  4096 Aug 29 14:19 ..
drwx------   2 root root 16384 Aug 29 14:19 lost+found
-rw-r--r--   1 root root     0 Aug 29 14:27 var_spool_ml.txt