Scientific Linux 6
Sponsored Link

DRBD - 分散ストレージシステム2011/06/02

 
DRBD(Distributed Replicated Block Device) をインストールして分散ストレージシステムを構築します。 ネットワーク越しにブロックデバイス単位でミラーリングをすることが可能となります。例として、ここでは以下のような環境で構築してみます。
        (1)  www01.srv.world   [10.0.0.50]
        (2)  www02.srv.world   [10.0.0.51]
前提として、サーバーにDRBDデバイスに割り当てる十分なディスク容量が残っている必要があります。 十分な容量がなければ新規にハードディスクを追加搭載してください。
[1] まずはそれぞれのホストにDRBDをインストールします。インストール時、依存関係でカーネルも同時にインストールされますが、 DRBDパッケージはサードパーティ提供のため、最新のカーネル番号に追従していません。 2011年06月2日時点で、メインリポジトリ提供の最新カーネルの番号は「2.6.32-71.29.1.el6」ですが、2011年06月2日時点でのATrpms提供のDRBDは 「kernel-2.6.32-71.7.1.el6.x86_64」に依存します。したがって、すでに最新のカーネルにアップデートしていた場合は 「kernel-2.6.32-71.7.1.el6.x86_64」に戻す必要があります。(戻す方法はここでは割愛します)
[root@www01 ~]#
yum --enablerepo=atrpms -y install drbd
 
# ATrpmsからインストール
# DRBD対応カーネルで起動させるため一旦再起動

[root@www01 ~]#
[2] サーバーの空き領域にLVMパーティションを作成してください。 その後は以下のようにして適当にDRBDデバイス用の論理ボリュームを作成しておきます。それぞれのホストで同じように設定してください。
[root@www01 ~]#
pvcreate /dev/sdb1

Physical volume "/dev/sdb1" successfully created
[root@www01 ~]#
vgcreate vg_r0 /dev/sdb1

Volume group "vg_r0" successfully created
[root@www01 ~]#
lvcreate -L 80G -n lv_r0 vg_r0

Logical volume "lv_r0" created
[3] DRBDの設定です。それぞれのホストで同じように設定してください。
[root@www01 ~]#
vi /etc/drbd.d/global_common.conf
disk {
# 27行目:追記 ( IOエラー時はディスクを切り離す )

   on-io-error detach;
syncer {
# 38行目:追記 ( 同期の帯域幅 )

   rate 300M;
[root@www01 ~]#
vi /etc/drbd.d/r0.res
# 新規作成

resource r0 {
  
# DRBDデバイス

   device /dev/drbd0;
  
# 物理デバイス

   disk /dev/vg_r0/lv_r0;
   meta-disk internal;
   on www01.srv.world {
     
# IPアドレス:ポート

      address 10.0.0.50:7788;
   }
   on www02.srv.world {
      address 10.0.0.51:7788;
   }
}
[root@www01 ~]#
modprobe drbd
# モジュールロード

[root@www01 ~]#
lsmod | grep drbd

drbd   286064 0
[root@www01 ~]#
drbdadm create-md r0
# DRBDリソース作成
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 7635th user to install this version
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
[root@www01 ~]#
/etc/rc.d/init.d/drbd start

Starting DRBD resources: [
r0
Found valid meta data in the expected location, 85899341824 bytes into /dev/vg_r0/lv_r0.
d(r0) s(r0) n(r0) ]..........
***************************************************************
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' [ 18]:
yes
[root@www01 ~]#
chkconfig drbd on

[root@www01 ~]#
echo "/sbin/modprobe drbd" >> /etc/rc.local

[4] それぞれのホストで[3]の設定まで終わった状態では、双方のホストはいずれもセカンダリのままになっています。 そのためまずどちらかをプライマリにしてやる必要があります。いずれかをプライマリにした時点で同期がはじまります。
[root@www01 ~]#
cat /proc/drbd

version: 8.3.8.1 (api:88/proto:86-94)
GIT-hash: 0d8589fcc32c874df57c930ca1691399b55ec893 build by gardner@, 2011-01-21 17:26:47
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:83883484
[root@www01 ~]#
drbdsetup /dev/drbd0 primary -o
# プライマリにする

[root@www01 ~]#
cat /proc/drbd

version: 8.3.8.1 (api:88/proto:86-94)
GIT-hash: 0d8589fcc32c874df57c930ca1691399b55ec893 build by gardner@, 2011-01-21 17:26:47
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:1985536 nr:0 dw:0 dr:1993240 al:0 bm:121 lo:1 pe:29 ua:221 ap:0 ep:1 wo:b oos:81898844
        [>....................] sync'ed:  2.4% (79976/81916)M
        finish: 0:06:11 speed: 220,512 (220,512) K/sec

# しばらく時間が経つと同期が完了し以下のようなステータスになる

[root@www01 ~]#
cat /proc/drbd

version: 8.3.8.1 (api:88/proto:86-94)
GIT-hash: 0d8589fcc32c874df57c930ca1691399b55ec893 build by gardner@, 2011-01-21 17:26:47
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:83883484 nr:0 dw:0 dr:83884148 al:0 bm:5120 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[5] 以上で設定完了です。後はDRBDデバイスにファイルシステムを作成して、プライマリ側でマウントしてやればOKです。
[root@www01 ~]#
mkfs -t ext4 /dev/drbd0

[root@www01 ~]#
mkdir /mnt/drbd0

[root@www01 ~]#
mount /dev/drbd0 /mnt/drbd0

[root@www01 ~]#
touch /mnt/drbd0/test.txt
# テストファイル作成

[root@www01 ~]#
ll /mnt/drbd0

total 16
drwx------. 2 root root 16384 Jun  4 04:10 lost+found
-rw-r--r--. 1 root root         0 Jun  4 04:12 test.txt
[6] セカンダリ側でDRBDデバイスをマウントするには、現在プライマリになっているホストでアンマウントしてセカンダリに降格させ、 セカンダリ側をプライマリに昇格させてマウントという流れになります。
########### プライマリ側 ###########

[root@www01 ~]#
umount /mnt/drbd0

[root@www01 ~]#
drbdadm secondary r0
# セカンダリにする
########### セカンダリ側 ###########

[root@www02 ~]#
drbdadm primary r0
# プライマリにする

[root@www02 ~]#
mount /dev/drbd0 /mnt/drbd0

[root@www02 ~]#
ll /mnt/drbd0

total 16
drwx------. 2 root root 16384 Jun  4 04:10 lost+found
-rw-r--r--. 1 root root         0 Jun  4 04:12 test.txt
[7] プライマリ、セカンダリの双方でDRBDを起動しても、Secondary/Unknownと表示されて同期しなくなることがあります。 ログに「Split-Brain detected but unresolved, dropping connection!」が表示されていればスプリット・ブレインが原因です。 そのような場合は以下のようにして復旧させます。
########### セカンダリ側 ###########

[root@www01 ~]#
drbdadm -- --discard-my-data connect r0
########### プライマリ側 ###########

[root@www02 ~]#
drbdadm connect r0

関連コンテンツ