よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

bondingとkeepalivedを組み合わせる

昨日のエントリー「NIC冗長化〜Miimon編〜」で書いたbondingでNICの冗長化は実現できました。

今回はさらにkeepalivedを利用することで、仮想IP アドレスを2台のサーバ間で共有し、1台に障害が発生しても、待機系サーバでIPアドレスを引き継ぎサービスを継続できるようにします。

keepalivedこちらからダウンロードします。
インストール手順は以下の通り。

[server1]$ tar xvzf keepalived-1.1.15.tar.gz
[server1]$ cd keepalived-1.1.15
[server1]$ ./configure --prefix=/usr/local/keepalived
[server1]$ make
[server1]$ sudo make install
[server1]$ sudo cp ~/install/keepalived-1.1.15/keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived #RedHatの設定ファイルをコピーします

続いて起動ファイルを編集し、パスを通します。

[server1]$ vi /etc/init.d/keepalived
・・・(略)
# source function library
. /etc/init.d/functions

PATH=$PATH:/usr/local/keepalived/sbin; export PATH #この設定を追加

RETVAL=0
・・・(略)

あとは /etc/keepalived 以下に keepalived.conf を作成し、設定を記述します。

今回は、以下の図のようなシステム構成で、各サーバのbond0インタフェースに仮想IPを2つ割り当てるようにします。
DNSの設定で、1つのIPに対して複数のホスト名を登録できる環境なら2つの仮想IPを振り分ける必要はないですが、今回はいろいろと事情があり、2つの仮想IPを割り当てています。

f:id:interu:20080825004442p:image

server1、server2のkeepalivedの設定は以下のようになっています。

[server1]$ cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
hoge@example.com
}
notification_email_from hoge@example.com
smtp_server localhost
smtp_connect_timeout 30
}

vrrp_instance VI_1 {
state BACKUP #フェイルバック無効
interface bond0
garp_master_delay 5
virtual_router_id 1
priority 100
nopreempt
advert_int 3
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
192.168.2.1/27
192.168.2.2/27
}

notify_master "/var/scripts/drbd.sh active"
notify_backup "/var/scripts/drbd.sh backup"
notify_fault "/var/scripts/drbd.sh backup"
}

どちらのサーバでもstateをBACKUPにしておくことで、keepalivedの起動が早かった方のサーバに仮想IPアドレスが割り振られるようになります。
さらにACTIVE - BACKUP を定義しないことでフェイルバックを無効にしています。
#一般的な利用法としては、server1のstatusをACTIVE、server2をBACKUPに設定し、
#さらにserver1のpriorityをserver2よりも高くすることで、フェイルバックを有効にします。

では、keepalivedを起動し、どちらのサーバに仮想IP(192.168.2.1と192.168.2.2)が割り振られているのかを確認してみます。
今回はserver2のkeepalivedを先に起動しました。

[server1]$ sudo /sbin/ip address show
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: bond0: mtu 1500 qdisc noqueue
link/ether 00:xx:xx:xx:xx:d0 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.11/27 brd 192.168.2.31 scope global bond0

[server2]$ sudo /sbin/ip address show
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: bond0: mtu 1500 qdisc noqueue
link/ether 00:xx:xx:xx:xx:da brd ff:ff:ff:ff:ff:ff
inet 192.168.2.12/27 brd 192.168.2.31 scope global bond0
inet 192.168.2.1/27 scope global secondary bond0
inet 192.168.2.2/27 scope global secondary bond0

このようにserver2に2つの仮想IPアドレスが割り振られていることが確認できます。
動作確認のためにWindowsクライアントから2つの仮想IPに対してPingを送信し、さらにSSHで仮想IPアドレスが割り振られたserver2にログインしておき以下のテストを実施します。

  • server2のeth0へ繋がっているLANケーブルを抜く
  • server2のeth0へ繋がっていたLANケーブルを繋げる
  • server2のeth0およびeth2へ繋がっているLANケーブルを抜く
  • server2のeth0およびeth2へ繋がっていたLANケーブルを抜いたままにし、さらにserver1のeth0へ繋がっているLANケーブルを抜く
  • server2のeth0およびeth2へ繋がっていたLANケーブルを抜いたままにし、server1のeth0へ繋がっているLANケーブルを繋げる
  • server2のeth0およびeth2へ繋がっていたLANケーブルを繋げる

テスト結果

  • server2のeth0へ繋がっているLANケーブルを抜く

server2のeth2がPingに応答し、SSHのコネクションは失わなかった。

  • server2のeth0へ繋がっていたLANケーブルを繋げる

server2のeth0がPingに応答し、SSHのコネクションは失わなかった。

  • server2のeth0およびeth2へ繋がっているLANケーブルを抜く

server1のeth0がPingに応答し、SSHのコネクションは失われた。

  • server2のeth0およびeth2へ繋がっていたLANケーブルを抜いたままにし、さらにserver1のeth0へ繋がっているLANケーブルを抜く

server1のeth2がPingに応答した。仮想IPアドレスがserver2に移ってからWindowsクライアントから接続したSSHのコネクションは失われなかった。

  • server2のeth0およびeth2へ繋がっていたLANケーブルを抜いたままにし、server1のeth0へ繋がっているLANケーブルを繋げる

server1のeth0がPingに応答し、仮想IPアドレスがserver2に移ってからWindowsクライアントから接続したSSHのコネクションは失われなかった。

  • server2のeth0およびeth2へ繋がっていたLANケーブルを繋げる

server1のeth0がPingに応答し、仮想IPアドレスがserver2に移ってからWindowsクライアントから接続したSSHのコネクションは失われなかった。

以上の結果から、keepalivedはフェイルバック無効の設定になっており、bonding と keepalived の構成でも正常に動作することが確認できました。
続いてはこれにDRBDを組み合わせたいと思います。