Carpe Diem

備忘録。https://github.com/jun06t

DRBD でストレージ冗長化

DRBD を用いてネットワークディスクミラーリングを構築します。 NIC が1つでも構築できますが、冗長化目的なので通常サービス用の NIC とは別で NIC を用意して同期させます。 今回用いる環境は ○PC1 - CentOS6.4 hostname: drbd01 eth0: 192.168.1.1 // サービス用 eth1: 192.168.11.1 // ミラーリング用 /dev/sda // システム /dev/sdb // 同期するストレージ ○PC2 - CentOS6.4 hostname: drbd02 eth0: 192.168.1.2 // サービス用 eth1: 192.168.11.2 // ミラーリング用 /dev/sda // システム /dev/sdb // 同期するストレージ です。IPの固定化は「CentOS6 の設定 その2(ネットワーク)」を参考にして下さい。 基本的に drbd01 の方を設定していきます。drbd02 も同様に設定して下さい。 ◆事前準備 SELinux は disabled、iptables, NetworkManager は stopさせておいて下さい。
# service NetworkManager stop
# chkconfig NetworkManager off
# service iptables stop
# chkconfig iptables off
◆ホスト名の修正 ホスト名が localhost のままだと drbd でエラーが出るので変更しておきます。
# vi /etc/sysconfig/network
HOSTNAME=drbd01
設定反映のために再起動しておきます。
# reboot
変更が完了したら /etc/hosts に以下を追記します。DNSサーバがあれば不要です。
# vi /etc/hosts
192.168.11.1   drbd01
192.168.11.2   drbd02
◆同期用ディスクの設定 追加したディスクでパーティション切っておきます。
[root@drbd01 ~]# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n // n で新しいパーティションを作成
Command action
   e   extended
   p   primary partition (1-4)
p // p でprimary diskに
Partition number (1-4): 1 // sd*1を作成
First cylinder (1-391, default 1): // デフォルト値で良いのでEnter
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-391, default 391): // デフォルト値で良いのでEnter
Using default value 391

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

Calling ioctl() to re-read partition table.
Syncing disks.
drbd02 も同様に。 ◆drbd インストール yum でインストールしますが、elリポジトリが必要です。
# rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
ではインストール
# yum -y install drbd84-utils kmod-drbd84
◆drbd 設定 リソースファイル名を r0.res として新規作成し、DRBDデバイス名を /dev/drbd0 とします。
# vi /etc/drbd.d/r0.res
# リソース名を r0 に
resource r0 {
   # DRBDデバイス
   device /dev/drbd0;
   # 物理デバイス
   disk /dev/sdb1;
   meta-disk internal;
   # ホスト名
   on drbd01 {
      # IP:ポート
      address 192.168.11.1:7788;
   }
   on drbd02 {
      address 192.168.11.2:7788;
   }
} 
モジュールロードします
# modprobe drbd
メタデータを作成します。この手順は、最初にデバイスを作成するときにのみ必要です。 これにより、DRBDのメタデータを初期化します。リソース名を指定して実行します。
# drbdadm create-md r0
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 6744th user to install this version
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
◆起動、同期確認 サービス起動します。まずdrbd01の方から。
# service drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0Operation canceled.
:failed(apply-al:20)
     adjust net: 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' [  11]: yes // 一旦yesでコンソールに戻します。
状態を確認してみます。
# 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:Diskless/DUnknown 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:0
次に同様の設定をしたdrbd02を。
# service drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0Operation canceled.
:failed(apply-al:20)
     adjust net: r0
]
.
先ほどと違って相手ノード(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: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:f oos:3140544
Secondary/Secondary で起動できていることが確認できます。 ◆drbd01をプライマリに昇格させて同期させる 最初の同期では以下のオプションをつけて起動して下さい。
[root@drbd01 ~]# drbdadm -- --overwrite-data-of-peer primary r0
ステータスをチェックすると同期が始まります。
# 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:4012 nr:0 dw:0 dr:4684 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:3136532
        [>....................] sync'ed:  0.3% (3136532/3140544)K
        finish: 0:23:45 speed: 2,004 (2,004) K/sec
完了すると以下のようになります。
# 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:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:3140544 nr:0 dw:0 dr:3141216 al:0 bm:192 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
◆/dev/drbd01をフォーマット プライマリ側でデバイスをフォーマットしてマウントします。
[root@drbd01 ~]# mkfs -t ext4 /dev/drbd0 
[root@drbd01 ~]# mkdir /share
[root@drbd01 ~]# mount -t ext4 /dev/drbd0 /share
ストファイルを作成します。
[root@drbd01 ~]# touch /share/hoge
[root@drbd01 ~]# ls /share
hoge  lost+found
◆drbd01を降格、drbd02を昇格する drbd01側で
[root@drbd01 ~]# umount /share
[root@drbd01 ~]# drbdadm secondary r0
drbd02側で
[root@drbd02 ~]# drbdadm primary r0
[root@drbd02 ~]# mkdir /share
[root@drbd02 ~]# mount /dev/drbd01 /share
[root@drbd02 ~]# ls /share
hoge  lost+found
きちんと同期されていることが確認できます。 お疲れ様でした。 ソース: Install DRBD (Distributed Replicated Block Device) on Centos 6.3 CentOS6.0にDRBDをインストール DRBD - 分散ストレージシステム DRBD8からオプションが変わってた