離れた場所にある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をインストール。
はい。インストール終了。ラクチンポンである。(笑)
ちなみに、drbdが使用する領域は独立したボリュームかパーティションである必要があるそうなので、fdiskでパーティションを作るなりしてこれを用意する。
今回はVirtualPCを使っているので、一本目のディスク/dev/hdaはOSが入っている。二本目のディスク/dev/hdbをdrbd用に用意。fdiskで/dev/hdb1を作成している。
↓こんな感じ。
次に、drbdの設定を行う。drbd公式サイトの情報を見て、ひとまず/etc/drbd.confに以下の通り記述した。
「include」はグローバル設定項目とかを読み込んでくる呪文。ひとまず詳しいことは割愛する。
「resource」で始まるブロックが、今回準備するdrbdで使用するディスクリソースの内容。「r0」と記述してあるのがリソース名。
「on」で始まるブロックが、個々のサーバで使用するリソースの設定。「rein」と「fine」がサーバ名。/etc/hostsやDNSにしっかり指定しておくこと。後の項目は空気が読める人なら説明不要かと思うが(察して!)、addressについてはIPアドレスで記述している。ここは/etc/hostsやDNSでの設定ときれいに一致させておくように。
さて、これでdrbdについては必要最低限の設定が完了したので、
①両ホストのdrbdデバイスにメタデータ領域を作成する
②両方ストのdrbdデバイス(リソース)をそれぞれアタッチする
③両ホストのdrbdデバイス(リソース)に対して同期を指示する(まだ同期しない)
④両ホストのdrbdどうしを接続させる
⑤ディスクの同期を開始する
という手順を踏む。
①両ホストのdrbdデバイスにメタデータ領域を作成する
これはコマンド一発でおわる。
②両方ストのdrbdデバイス(リソース)をそれぞれアタッチする
これもコマンド一発。
正常終了時なら何も表示されないので心配しないように。
③両ホストのdrbdデバイス(リソース)に対して同期を指示する(まだ同期しない)
これもコマンド一発。しかも無言。(笑)
④両ホストのdrbdどうしを接続させる
これも以下略
⑤ディスクの同期を開始する
さて、ここまで①~④については両方のホストで同じコマンドを実行するのだが、この項目についてはどちらか一方(原本になる方)だけで実行するので注意すること。ぶっちゃけ、まだディスクの中身は空っぽなので、どちらでやっても構わないのだが。
これを実行すると、両サーバ間でディスクの内容が同期される。イメージとしてはRAID0のミラーを最初に同期しにいくような感じだろうか。
同期の状態は/proc/drbdの中を見れば確認できる。
…。結構かかるなあ。(笑)
なお、drbdの同期が実行中であっても、mdadmと同様に直ちにこのボリュームを使用することも可能だ。
ためしに、このボリュームをフォーマットしてマウントしてみよう。
…さすがに、VirtualPCで2個サーバを起動してdrbdの同期中にこんなこと実行すると超重い。(笑)
まずはrein側で、ディスクをマウントしてみた。ちゃんと領域が見えていることが判る。
ここに何かファイルを置いてみよう。
こんな感じでファイルを置いてみた。(重い!:笑)
では、これを対向側のfineで見てみよう。
そうそう。今はext3でファイルシステムを作成しているので、対向側でマウントする前に、アンマウントしておかないといけない。同時にこのファイルシステムは使えないのだ。(対策は後ほど)
また、今回reinが「Primary」で、fineが「Secondary」になっているので、これもひっくり返さなければならない。(今はまだ「シングルプライマリモード」で動作しているため。
rein側でアンマウントと、Secondaryにするためのコマンドを投入する。
と、した後で、さっそく対向側のfineをPrimaryにしてからマウントしてみよう。
マウントできた。fine側ではファイルシステムを作成していないのにマウントできている。ということは、rein側の変更内容が確かに伝わっているということが判る。
ディスクの中身も確認してみよう。
内容も確認できている。
reinとfineは/dev/drbd0デバイスによって同じ内容が確認できる状態になった。
しかし、今はまだ同時に読み書き出来る状態にはないので、次のアーティクルでは両方から同時にアクセスが通るようにしたい。(多分その「前編」になるかな…)
それにしても…PC重いぜ…(笑)
定期的に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重いぜ…(笑)
2011-11-14 16:25
nice!(0)
コメント(0)
トラックバック(0)
コメント 0