CARPによるサーバ冗長化

調べているうちに、IANAからプロトコルナンバーをもらえていないようで、
若干心が萎えてしまったのですが、、、
CARP(Common Address Redundancy Protocol)とは、VRRPの様なルータ冗長化プロトコルです。

実際には、VRRPがCiscoSystemsのHSRPとのパテント抵触問題が発生していたため、
OpenBSDの開発者によって、VRRPの代わりとなるプロトコルとして実装されたそうです。

さて、このCARP。OpenBSDで開発されただけあり、OpenBSDをはじめ、NetBSDFreeBSD
カーネルバイスとして実装されています。

気になる機能は?

CARPインタフェースに仮想IPアドレスを設定し、同一ネットワーク上の複数のホストで
このIPアドレスを共有して使用します。
設定により、ホットスタンバイ構成と負荷分散構成が構築可能です。

ホットスタンバイ構成の場合、マスターとなるマシンによて仮想IPのパケットが処理されます。
マスターとなるマシンは、「アナウンスパケット」と呼ばれるActive通知パケットをブロード
キャストに送信し、仮想IPの所有をスタンバイ機に通達します。
いざ、障害(ホストダウンやネットワーク障害)が発生し、アナウンスパケットが
送信されなくなるとスタンバイ機がこの状態をキャッチし「Gratuitous ARP」を投げ、
IP重複の確認とARPテーブルのクリアを実施します。
なお、マスターが復帰(あるいはこのマシンに障害発生)するまで、このスタンバイ機が仮想IPの
パケットを処理します。

NetBSDによるCARPの設定メモ

NetBSDでは、標準でCARPが使えるようになっていないため、カーネルを再構築し、
CARP Deviceを有効にします。(FreeBSDも同様)
OpenBSDは標準でこのデバイスが使えるようになっています。

なお、今回は2台のNetBSDマシーンで設定してみます。

  1号機 2号機
HOST名 archytas01 archytas02
IPアドレス 192.168.24.10 192.168.24.19
共有IP 192.168.24.15 192.168.24.15

1. カーネルソースの入手
標準のインストーラでは、カーネルソースが含まれていなかったため、NebBSDのFTPサイトより
ソースを入手し、/usr/srcに展開します。
入手URL:ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-4.0.1/source/sets/syssrc.tgz

2. カーネルコンフィグレーションの作成とコンパイル
今回はGenericカーネルを使用していたので、「GENERIC」のコピーから編集しました。

# cd /usr/src/sys/arch/i386/conf
# cp GENERIC ARCHYTAS
# vi ARCHYTAS
下記の1行を追加(コメントアウトを外す)
pseudo-device carp

# config ARCHYTAS
# cd ../compile/ARCHYTAS
# make depend && make
# mv /netbsd /netbsd.old && mv /usr/src/arch/i386/compile/ARCHYTAS/netbsd /
# reboot
※私はマルチユーザモードで作業したため、shutdown -r nowにて再起動しています
※ARCHYTASは私のカーネルコンフィグの名前です。

3. カーネルの設定
まずは、コンパイルしたカーネルで起動しているかを確認します。
# uname -a
NetBSD archytas 4.0.1 NetBSD 4.0.1 (ARCHYTAS) #0: Sat Oct 3 22:11:56 JST 2009
root@archytas:/usr/src/sys/arch/i386/compile/ARCHYTAS i386

続いて、CARPが使用できるようになっているかカーネルパラメータを確認します。
# sysctl -a | grep carp
net.inet.carp.preempt = 0
net.inet.carp.arpbalance = 0
net.inet.carp.allow = 1
net.inet.carp.log = 0

CARPが使用できるようにカーネルパラメータを設定します。
# sysctl -w net.inet.carp.preempt=1

※恒久的に設定を有効にする場合、
# vi /etc/sysctl.conf
下記1行を追加
net.inet.carp.preempt=1

4. CARPデバイスの設定
ここでは、とりあえずの設定です

1号機設定(マスタ)
# ifconfig carp0 create
# ifconfig carp0 vhid 1 carpdev pcn0 pass lanpass 192.168.24.15 netmask 255.255.255.0
2号機設定(スタンバイ)
# ifconfig carp0 create
# ifconfig carp0 vhid 1 carpdev pcn0 pass lanpass advskew 128 192.168.24.15 netmask 255.255.255.0

以上で、CARPによる冗長化が行える