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/functionsPATH=$PATH:/usr/local/keepalived/sbin; export PATH #この設定を追加
RETVAL=0
・・・(略)
あとは /etc/keepalived 以下に keepalived.conf を作成し、設定を記述します。
今回は、以下の図のようなシステム構成で、各サーバのbond0インタフェースに仮想IPを2つ割り当てるようにします。
#DNSの設定で、1つのIPに対して複数のホスト名を登録できる環境なら2つの仮想IPを振り分ける必要はないですが、今回はいろいろと事情があり、2つの仮想IPを割り当てています。
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を組み合わせたいと思います。