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で利用するパーテション
/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
ディスカッション
コメント一覧
まだ、コメントがありません