目次

DRBD

drbdはOSSなディスクミラーリングソフト

覚書

DRBD関連の覚書

セカンダリからプライマリへの切替をプロモーション(promotion)、プライマリからセカンダリへの切替をデモーション(demotion)と呼ぶ。
pacemakerのcrmコマンドのresourceディレクティブでも出てくる。テストに出ます。(笑

状態確認

drbd-overview 設定されているDRBDリソース全てが一覧表示される

drbd-overview
  0:home                 Connected Primary/Secondary   UpToDate/UpToDate C r--- /home        xfs  200G 158G 43G  79%
  1:data                 Connected Primary/Secondary   UpToDate/UpToDate C r--- /mnt/ha1     ext3 9.9G 618M 8.8G 7%
  2:nfs-root             Connected Primary/Secondary   UpToDate/UpToDate C r--- /mnt/netboot ext3 79G  57G  19G  76%

/proc/drbdの確認

cat /proc/drbd

ディスク状態の確認

drbdadm dstate

リソースのロール確認

drbdadm role resource name

リソースの接続状態確認

drbdadm cstate resource name

スプリットブレインからの回復

Split-Brain detected, dropping connection! がーん。
シスログにこれが出たらスプリットブレインです。回復処理しましょ。

1つのノードはStandAloneになる。他方はStandAlone(同時にスプリットブレインを検出した場合)かWFConnection(スプリットブレイン検出前に対抗ノードが切断した場合)になる。

内容を破棄する側のノード上で
drbdadm secondary resource 
drbdadm -- --discard-my-data connect resource
 
残す方で
drbdadm connect resource
 
破棄側ノード(犠牲ノードと呼ぶ)の接続状態がSyncTargetになって同期される

インストール

CentOS 5.2でのインストール
簡単にyumでやってしまった

# yum install -y drbd82 kmod-drbd82

drbd用のディスクを用意する
ここではsdbを追加した

/etc/drbd.confを設定する

resource r0 {
        protocol A;
        on test03 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.1.3:7789;
                meta-disk       internal;
        }
        on test04 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.1.4:7789;
                meta-disk       internal;
        }
}

  1. on <ホスト名>箇所はuname -nで表示されるホスト名に合わせる必要あり
  2. protocolは条件により修正する

drbdadmでmeta-disk情報を書き込み

# drbdadm create-md r0

drbdサービス起動

# /etc/init.d/drbd start
Primary側を起動するとSecondary側のレスポンスを待つのでyesで答えて終了しておく

Primary側のdrbdディスクをPrimaryとして設定
起動直後はSecondaryとして設定されるため

# drbdadm -- -o primary r0

ファイルシステムの作成とかマウントとか

# mke2fs -j /dev/drbd0
# mkdir /mnt/drbd0
# mount /dev/drbd0 /mnt/drbd0

テスト

drbdadm primary <リソース名>リソース名をプライマリに変更
drbdadm secondary <リソース名>リソース名をセカンダリに変更

切り替わりのテストをする

だいたいnfsとかで利用していると思うのでnfs利用シーンを想定
mountしていると具合が悪くなるのでunmountする
そしてPrimaryをSecondaryに降格させ、Secondary側をPrimaryにする
Secondary側でmountしてデータ更新してから元に戻す

HA

DRBD8.0以降+OCFS2インストール
DRBDは既にインストール済みとする

# rpm -ihv ocfs2-tools-1.4.1-1.el5.i386.rpm
# rpm -ihv ocfs2-2.6.18-92.1.18.el5-1.4.1-1.el5.i686.rpm
# rpm -ihv ocfs2console-1.4.1-1.el5.i386.rpm
ocfs2consoleにはvteパッケージが必要!
GUIを利用しないのであれば、ocfs2consoleは不要だな…

disk追加、今回は/dev/sdcとする
今回はLVM2で作成するとする

# pvcreate /dev/sdc
# vgcreate <VG名> /dev/sdc
# vgdisplayで作成されている事を確認、PE数を確認
# lvcreate -l 割当PE数 -n <LV名> <VG名>
# lvdisplayで作成されている事を確認
# ls /dev/<VG名>でデバイスファイルが作成されている事を確認する

今回はデバイスファイルを/dev/VG/OCFS2とし、resource名をr1とした

drbd.confに以下を追加!

resource r1 {
        protocol C; ←これ味噌!allow-two-primariesでは必須!
        net {
                allow-two-primaries; ←これが味噌!
        }
        on test-vm03.hyperdc.net {
                device  /dev/drbd1;
                disk    /dev/VG/OCFS2;
                address 122.213.181.233:7790; ←既に7789でresorceを定義しているので変えちゃった!
                meta-disk       internal;
        }
        on test-vm04.hyperdc.net {
                device  /dev/drbd1;
                disk    /dev/VG/OCFS2;
                address 122.213.181.234:7790; ←既に7789でresorceを定義しているので変えちゃった!
                meta-disk       internal;
        }
}

メタデータを作成

# drbdadm create-md r1
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.

                --== Creating metadata ==--
As with nodes, we count the total number of devices mirrored by DRBD at
at http://usage.drbd.org.

The counter works anonymously. It creates a random number to identify
the device and sends that random number, along with
DRBD's version number, to usage.drbd.org.

http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=13290440062039590897&ru=6760633064383941882&rs=2143289344

* If you wish to opt out entirely, simply enter 'no'.
* To continue, just press [RETURN]

success

  1. drbdを再起動
  2. procのdrbdを表示させて状態を確認する
  3. primaryにして同期完了を待つ

# service drbd restart
# cat /proc/drbd
# drbdadm adjust r1
# drbdadm primary r1 -o

同期が完了したら他方でも
# drbdadm primary r0
を実行する、両Primaryが完成

drbdadm primaryを実行すると
/dev/drbd0: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
Command 'drbdsetup /dev/drbd0 primary' terminated with exit code 17
って怒られる件

強制的にprimaryにするおまじない!
# drbdadm -- --overwrite-data-of-peer primary all
これで同期が始まる
# cat /proc/drbd
# drbdadm cstate r0
# drbdadm state r0
とかね

# mkdir /etc/ocfs2
# cd /etc/ocfs2
# vi cluster.conf

# service o2cb load
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading filesystem "ocfs2_dlmfs": OK
Creating directory '/dlm': OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK

# service o2cb online ocfs2
Starting O2CB cluster ocfs2: OK

cluster.conf

node:
各ノードの情報を設定します。
‐ip_port: 通信するポート
‐ip_address: ノードのIPアドレス
‐number: 0からの通番。ノード毎に加算。
‐name: ノードのホスト名
‐cluster: クラスタ名

cluster:
クラスタで共通の情報を設定します。
‐node_count : ノード数
‐name: クラスタ名。node: で指定しているclusterと同一です。


node:
 ip_port = 7777
 ip_address = 192.168.222.3
 number = 0
 name = o2host1
 cluster = ocfs2

node:
 ip_port = 7777
 ip_address = 192.168.222.4
 number = 1
 name = o2host2
 cluster = ocfs2

cluster:
 node_count = 2
 name = ocfs2

もう片方も同じように実施

drbd1デバイスをOCFS2でフォーマットする
フォーマットはDRBDで同期されているので片側のみでOK
マウント時はファイルタイプをocfs2とする
マウントは両サーバーで実施

# mkfs.ocfs2 /dev/drbd1
mkfs.ocfs2 1.4.1
Cluster stack: classic o2cb
Filesystem label=
Block size=4096 (bits=12)
Cluster size=4096 (bits=12)
Volume size=2143186944 (523239 clusters) (523239 blocks)
17 cluster groups (tail covers 7143 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 1 block(s)
Formatting Journals: done
Formatting slot map: done
Writing lost+found: done
mkfs.ocfs2 successful
 
# mount -t ocfs2 /dev/drbd1 <マウントポイント>