SSブログ

離れた場所にある2つのストレージの同期 その1~drbdのインストールとセットアップ~ [Linux(LVM/RAID/Storage)]

 離れた場所にある(隣り合っててもいいんだけど…)2つのサーバがあるとして、そのストレージ領域の内容を同期したいんだけどどうすればいいか…ということを考えるとき、まずもっともアンチョクな方法としては

 定期的にrsyncすればよくね?

 ってのがありますな。
 1日に1回とか、数時間に1回とかにrsyncを実行すればよろしいかと。
 ところが、この方法では注意しておかないと「どっちかが原本」で、「どっちかがコピー」というような運用になってしまう。しかし場合によっては「どちら側からでも原本としてアクセスできないものか」という需要もあろう。例えば会社だったら本社と支社との間をVPNでつなげておいて両方から単一の共有ディスクにアクセスさせたいが、VPNごしにアクセスすると死ぬほど遅いなんてこともあり得るので、両方の拠点にストレージサーバを置いて、そのストレージサーバ間で常時同期を取ったりできないか?   みたいなケース。
 これ、結構需要あるんだよねー。例えば「同じExcelのデータを両方で見たり書いたりしたい」とかさー。

 そんな訳で、物は試しに、「drbdデュアルプライマリーモード」を使って、それっぽい環境を作れないか試してみた。

 まずは、何はなくともdrbdをインストールしてセットアップするところから。

 まず、用意した環境は(本当に遠隔地の環境を用意するのはとっても面倒くさいので)VirtualPCにCentOSなサーバを2個用意。

サーバA:rein
サーバB:fine

 ということにでもしておこうか。
 まずは、両方のサーバでdrbdをインストール。
yum install drbd83 kmod-drbd83


 はい。インストール終了。ラクチンポンである。(笑)
 ちなみに、drbdが使用する領域は独立したボリュームかパーティションである必要があるそうなので、fdiskでパーティションを作るなりしてこれを用意する。
 今回はVirtualPCを使っているので、一本目のディスク/dev/hdaはOSが入っている。二本目のディスク/dev/hdbをdrbd用に用意。fdiskで/dev/hdb1を作成している。
 ↓こんな感じ。
[root@fine ~]# fdisk -l

Disk /dev/hda: 17.1 GB, 17179803648 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        2088    16667437+  8e  Linux LVM

Disk /dev/hdb: 17.1 GB, 17179803648 bytes
16 heads, 63 sectors/track, 33288 cylinders
Units = シリンダ数 of 1008 * 512 = 516096 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hdb1               1       33288    16777120+  83  Linux


 次に、drbdの設定を行う。drbd公式サイトの情報を見て、ひとまず/etc/drbd.confに以下の通り記述した。
include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";

resource        r0      {
        on rein {
                device          /dev/drbd0;
                disk            /dev/hdb1;
                address         ***.***.***.241:7789;
                meta-disk       internal;
        }
        on fine {
                device          /dev/drbd0;
                disk            /dev/hdb1;
                address         ***.***.***.242:7789;
                meta-disk       internal;
        }
}

 「include」はグローバル設定項目とかを読み込んでくる呪文。ひとまず詳しいことは割愛する。
 「resource」で始まるブロックが、今回準備するdrbdで使用するディスクリソースの内容。「r0」と記述してあるのがリソース名。
 「on」で始まるブロックが、個々のサーバで使用するリソースの設定。「rein」と「fine」がサーバ名。/etc/hostsやDNSにしっかり指定しておくこと。後の項目は空気が読める人なら説明不要かと思うが(察して!)、addressについてはIPアドレスで記述している。ここは/etc/hostsやDNSでの設定ときれいに一致させておくように。

 さて、これでdrbdについては必要最低限の設定が完了したので、

①両ホストのdrbdデバイスにメタデータ領域を作成する
②両方ストのdrbdデバイス(リソース)をそれぞれアタッチする
③両ホストのdrbdデバイス(リソース)に対して同期を指示する(まだ同期しない)
④両ホストのdrbdどうしを接続させる
⑤ディスクの同期を開始する

 という手順を踏む。

①両ホストのdrbdデバイスにメタデータ領域を作成する
 これはコマンド一発でおわる。
drbdadm create-md r0


②両方ストのdrbdデバイス(リソース)をそれぞれアタッチする
 これもコマンド一発。
drbdadm attach r0

 正常終了時なら何も表示されないので心配しないように。

③両ホストのdrbdデバイス(リソース)に対して同期を指示する(まだ同期しない)
 これもコマンド一発。しかも無言。(笑)
drbdadm syncer r0


④両ホストのdrbdどうしを接続させる
 これも以下略
drbdadm connect r0


⑤ディスクの同期を開始する

 さて、ここまで①~④については両方のホストで同じコマンドを実行するのだが、この項目についてはどちらか一方(原本になる方)だけで実行するので注意すること。ぶっちゃけ、まだディスクの中身は空っぽなので、どちらでやっても構わないのだが。
drbdadm -- --overwrite-data-of-peer primary r0

 これを実行すると、両サーバ間でディスクの内容が同期される。イメージとしてはRAID0のミラーを最初に同期しにいくような感じだろうか。

 同期の状態は/proc/drbdの中を見れば確認できる。
[root@rein etc]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:1792 nr:0 dw:0 dr:1792 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:16774780
        [>....................] sync'ed:  0.1% (16380/16380)M delay_probe: 0
        finish: 11:38:56 speed: 356 (356) K/sec


 …。結構かかるなあ。(笑)
 なお、drbdの同期が実行中であっても、mdadmと同様に直ちにこのボリュームを使用することも可能だ。
 ためしに、このボリュームをフォーマットしてマウントしてみよう。
[root@rein etc]# mkfs -t ext3 -j /dev/drbd0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2097152 inodes, 4194143 blocks
209707 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
128 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@rein etc]# mkdir -p /mnt/work
[root@rein etc]# mount /dev/drbd0 /mnt/work
[root@rein etc]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       14G  1.2G   13G   9% /
/dev/hda1              99M   19M   76M  20% /boot
tmpfs                 379M     0  379M   0% /dev/shm
/dev/drbd0             16G  173M   15G   2% /mnt/work

 …さすがに、VirtualPCで2個サーバを起動してdrbdの同期中にこんなこと実行すると超重い。(笑)

 まずはrein側で、ディスクをマウントしてみた。ちゃんと領域が見えていることが判る。
 ここに何かファイルを置いてみよう。
[root@rein etc]# mkdir /mnt/work/etc
[root@rein etc]# cp -r /etc/* /mnt/work/etc/
[root@rein etc]# find /mnt/work/etc -print | head
/mnt/work/etc
/mnt/work/etc/fonts
/mnt/work/etc/fonts/fonts.dtd
/mnt/work/etc/fonts/conf.d
/mnt/work/etc/fonts/conf.d/60-latin.conf
/mnt/work/etc/fonts/conf.d/80-delicious.conf
/mnt/work/etc/fonts/conf.d/20-fix-globaladvance.conf
/mnt/work/etc/fonts/conf.d/69-unifont.conf
/mnt/work/etc/fonts/conf.d/90-synthetic.conf
/mnt/work/etc/fonts/conf.d/64-nonlatin-fedora.conf

 こんな感じでファイルを置いてみた。(重い!:笑)

 では、これを対向側のfineで見てみよう。
 そうそう。今はext3でファイルシステムを作成しているので、対向側でマウントする前に、アンマウントしておかないといけない。同時にこのファイルシステムは使えないのだ。(対策は後ほど)
 また、今回reinが「Primary」で、fineが「Secondary」になっているので、これもひっくり返さなければならない。(今はまだ「シングルプライマリモード」で動作しているため。

 rein側でアンマウントと、Secondaryにするためのコマンドを投入する。
[root@rein etc]# umount /mnt/work
[root@rein etc]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       14G  1.2G   13G   9% /
/dev/hda1              99M   19M   76M  20% /boot
tmpfs                 379M     0  379M   0% /dev/shm
[root@rein etc]# drbdadm secondary r0

 と、した後で、さっそく対向側のfineをPrimaryにしてからマウントしてみよう。
[root@fine ~]# drbdadm primary r0
[root@fine ~]# mkdir -p /mnt/work
[root@fine ~]# mount /dev/drbd0 /mnt/work
[root@fine ~]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       14G  1.2G   13G   9% /
/dev/hda1              99M   19M   76M  20% /boot
tmpfs                 379M     0  379M   0% /dev/shm
/dev/drbd0             16G  222M   15G   2% /mnt/work

 マウントできた。fine側ではファイルシステムを作成していないのにマウントできている。ということは、rein側の変更内容が確かに伝わっているということが判る。
 ディスクの中身も確認してみよう。
[root@fine ~]# find /mnt/work/etc -print | head
/mnt/work/etc
/mnt/work/etc/fonts
/mnt/work/etc/fonts/fonts.dtd
/mnt/work/etc/fonts/conf.d
/mnt/work/etc/fonts/conf.d/60-latin.conf
/mnt/work/etc/fonts/conf.d/80-delicious.conf
/mnt/work/etc/fonts/conf.d/20-fix-globaladvance.conf
/mnt/work/etc/fonts/conf.d/69-unifont.conf
/mnt/work/etc/fonts/conf.d/90-synthetic.conf
/mnt/work/etc/fonts/conf.d/64-nonlatin-fedora.conf

 内容も確認できている。
 reinとfineは/dev/drbd0デバイスによって同じ内容が確認できる状態になった。
 しかし、今はまだ同時に読み書き出来る状態にはないので、次のアーティクルでは両方から同時にアクセスが通るようにしたい。(多分その「前編」になるかな…)





 それにしても…PC重いぜ…(笑)
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。