|
 |
DRBD + Heartbeat |
|
サーバを運用する際の問題の一つとして故障時の対応があります。高価なシステムを構築すればストレージはSANで構築し、サービスのフェイルオーバーも高価な商用ソフトを導入することで実現することは可能です。しかしながら、「そこまでコストをかけて構築しなくても、、、」といった場合もあるかと思います。そのような場合の解決策の一つとして、本編ではDRBD
+
Heartbeatというオープンソース・ソフトウェアを用いて、HA
Clusterを構築する方法を解説します。以下、<host_m>と<host_s>という2台のサーバを用いた構成手順を紹介します。
|
|
|
|
|
1. DRBDの導入 |
|
|
|
DRBDとは、Distributed
Replicated Block
Deviceの略で、本家WEBサイトは
http://www.drbd.org/
になります。具体的にDRBDは何をするものか?というと、パーティションをネットワークを介してミラーリングを行ってくれます。ここで注意が必要なのですが、ミラーを行う場所をブロックデバイスにて指定する為、「ある特定のディレクトリ以下を全て」といったようなミラーリングは行えないということです。また、同じ理由からミラーリングを行うにはOSの再インストールが必要になることもあります。
DRBDのミラーリングは、指定したブロックデバイスに変更があったときに自動的に行われます。また、その実行はkernelモードで行われます。これまでrsync等を用いて手動で行っていた方も多いと思いますが、これらに対して速度、簡易性といった点で有利です。
また、同じくオープンソースDBのMySQLがDRBDをサポートしており、これにより冗長構成が行えるようです。
|
|
|
|
DRBDのインストール |
|
現在のDRBDの最新版として、8.0.5がリリースされています。しかし、後述のHeartbeatと組み合わせて使用する場合、HeartbeatがサポートするDRBDは1世代前の0.7系となりますので、0.7系の最新版0.7.24を導入しましょう。(8.0系でサポートされるLinuxは2.6系のみですが、0.7系では2.4系と2.6系の両方がサポートされます。また、8.0系では機能追加等が行われており、この為導入までの設定は0.7系の方が容易と思われます。)
インストール自体は、本家サイトからdrbd-0.7.24.tar.gzをダウンロードし、ビルド、インストールを行うのですが、含まれているdrbd.spec.inを用いてrpmを作成してからインストールする方が簡単でしょう。注意点として、kernel
moduleが作成され、これがビルドを行った環境のLinux
Kernelのバージョンに依存してしまいます。これにより、kernelアップデートを行った場合等は再度これらを作成する等の作業が必要になってきます。
|
|
|
|
DRBDの設定 |
|
host_m、host_sの両方で、設定ファイル/etc/drbd.confを下記のように同じ記述を行います。
|
resource drbd0 {
protocol C;
syncer {
rate 200M;
}
disk {
on-io-error pass_on;
}
on host_m {
device /dev/drbd0;
disk /dev/hda2;
address 192.168.0.1:7789;
meta-disk internal;
}
on host_s {
device /dev/drbd0;
disk /dev/hda2;
address 192.168.0.2:7789;
meta-disk internal;
}
} |
|
|
|
設定ファイル詳細は、<
$ man
drbd.conf
>とすれば、英文ドキュメントによる説明を確認することが出来ます。上記を簡単に説明すると、protocolはsyncを「どの時点で完了するか?」を決定するもので、A,
B,
Cが指定できます。これらの意味は下記の通りとなります。
|
A: |
write IO is reported as
completed, if it has
reached local disk and
local TCP send buffer.
(データを自分のディスクとTCP送信バッファに送った時点で完了。) |
|
B: |
write IO is reported as
completed, if it has
reached local disk and
remote buffer cache.
(データを自分のディスクと相手ノードのバッファキャッシュに送った時点で完
了。) |
|
C: |
write IO is reported as
completed, if it has
reached both local and
remote disk.
(データを自分と相手のディスクに送った時点で完了。) |
|
|
|
|
|
となっており、C > B >
Aのように安全性が高くなっています。 |
|
|
on host_m {
device /dev/drbd0;
disk /dev/hda2;
address 192.168.0.1:7789;
この部分は、「ディスクパーティション /dev/hda2
を、/dev/drbd0
に割り当てて、host_mのIP
192.168.0.1の7789番ポートを用いてsyncを行う」といった意味になっています。
また、Heartbeatと連携させる場合、host_m、host_sの双方において、/dev/drbd0部は共通である必要があります。
|
|
次にhost_m、host_sの双方において、以下のように実行します。
|
|
# /sbin/modprobe
drbd <- drbd
moduleを読み込む
# /sbin/lsmod
| grep drbd <-
モジュールがロードされているか確認する
# drbdsetup /dev/drbd0 disk
/dev/hda2 internal -1
#
drbdsetup /dev/drbd0 net
192.168.0.1 192.168.0.2 C
<-
host_mで実行 IPの部分は <host_m> <host_s>の順になる
#
drbdsetup /dev/drbd0 net
192.168.0.2 192.168.0.1 C
<-
host_sで実行 IPの部分は上と逆なので注意
|
|
この時点でステータスを確認すると、
|
|
[root@host_m crm]# cat
/proc/drbd
version: 0.7.24
(api:79/proto:74)
SVN Revision: 2875 build by
foo@host_m, 2007-07-18
09:59:41
0: cs:WFConnection
st:Secondary/Unknown
ld:Consistent
ns:0 nr:0 dw:0 dr:0 al:0
bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Unconfigured
|
|
のように見えます。Unknownとなっているのは、host_sで実行していない為です。
|
|
更に、host_mで、<
#
drbdsetup /dev/drbd0 primary
>として、drbdサービスのPrimaryに格上げします。/proc/drbdを確認すると、
|
|
version: 0.7.24
(api:79/proto:74)
SVN Revision: 2875 build by
foo@host_m, 2007-07-18
09:59:41
0: cs:Connected st:Primary/Secondary
ld:Consistent
ns:0 nr:0 dw:0 dr:0 al:0
bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Unconfigured
|
|
のように、Primaryに変化しているのが確認出来ます。更に、<
#
drbdadm -- --do-what-I-say
primary all
>として、syncを開始します。
|
|
|
|
動作確認 |
|
それでは、動作確認をしてみましょう。host_m、host_sの双方で、<
#
/etc/init.d/drbd stop
>としてサービスを終了します。次に、host_mで<
#
/etc/init.d/drbd start
>としてサービスを起動します。そうすると、
|
|
[root@host_m crm]# /etc/init.d/drbd
start
Starting DRBD resources: [
d0 s0 n0 ].
........
|
|
のように表示されますので、この間にhost_s側でサービスを起動させます。この間に起動させない場合、継続するか、無視するか?の決断を迫られます。
|
|
問題なくサービスが起動したら、host_mで、
|
|
#
drbdsetup /dev/drbd0 primary
<- host_mをPrimaryにする
# /sbin/mkfs.ext3
/dev/drbd0
<-
/dev/drbd0をext3ファイルシステムでフォーマット
#
mount -t ext3 /dev/drbd0 /drbd
<- /dev/drbd0を/drbdにマウント
|
|
として、ファイルシステムをマウントします。その後、
|
|
# touch /drbd/testfile1
# dd if=/dev/zero of=/drbd/testfile2
bs=1M count=100
|
|
のようにファイルを作成します。そして、
|
|
# umount /drbd
# drbdsetup /dev/drbd0
secondary
|
|
として、ファイルシステムのアンマウント、secondaryへと格下げを行います。念の為、<
#
/proc/drbd
>として確認を行います。
host_sにおいて、
|
|
#
drbdsetup /dev/drbd0 primary
<- host_mをPrimaryにする
#
mount -t ext3 /dev/drbd0 /drbd <- /dev/drbd0を/drbdにマウント
|
|
として、ファイルシステムをマウント後に、< # ls
-al /drbd >として先ほどhosts_mで作成したファイルが存在していることを確認します。ファイルが存在していた場合、無事動作が確認できたことになります。
|
|
|
|
次へ
 |