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%
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; } }
drbdadmでmeta-disk情報を書き込み
# drbdadm create-md r0
drbdサービス起動
# /etc/init.d/drbd startPrimary側を起動すると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してデータ更新してから元に戻す
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.rpmocfs2consoleにはvteパッケージが必要!
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
# 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 <マウントポイント>