2011年8月6日土曜日

CentOS の bonding の arp_validate オプション

CentOS 5 および CentOS 6 の bonding で ARP 監視を行う場合、arp_validate というオプションを利用できます。
以下、その処理内容についてのメモです。

 Bladeサーバ            Blade収納ユニット
┌──────────┐──────────────┐
│              active│          ┌───┐Blade   │   Blade外部switch
│    ┌──┐  ┌──┤          │      │内部switch  ┌───┐
│    │    ├─┤eth0├─────┤ SW1  ├─────┤      │        
│    │    │  └──┤→…………………………………………┐    │  ┌───┐
│    bond0 │        │ARP要求   └───┘        │  │SW3 │  arp_ip_target
│    │192.168.50.111│broadcast ┌───┐        │  │    ├─┤192.168.50.222
│    │    │  ┌──┤←…………………………………………┴………→│      │
│    │    ├─┤eth1├─────┤ SW2  ├──────┤      │  └───┘
│    └──┘  └──┤          │      │        │  └───┘
│              backup│          └───┘        │
└──────────┘──────────────┘

Bladeサーバの場合、上図のように、収納ユニット内部にスイッチ (SW1 および SW2) が実装される構造になっていることがあります。この場合、部分の障害を検出できるように ARP 監視を用いることができます。
注記:内部スイッチが、部分のリンク障害時に、eth0---SW1 間のリンクを無効化するという機能(UFD: Uplink Failure Detection)を備えている場合があります。機能があるなら、併用するのがいいのではと思います。スイッチの障害対応機能が完璧に動くかどうか?という側面もあるため、スイッチ機能+MII 監視ではなく、スイッチ機能+ARP 監視が良いものと思います。
ただし、ARP 監視のデフォルト動作 (arp_validate=0) では、受信カウンタのチェックのみ行われるため、隣のBladeサーバが同様に ARP 監視 (ARP要求のbroadcast送信) を行ってしまうと、正しく障害検知出来なくなります。

arp_validate=3 を設定すると、受信した ARP パケットの正当性を確認する処理が動くようになります。active (上図eth0) では、arp_ip_target からの ARP 応答を受信したかどうかの確認が行われるようになります。一方、わかりにくいところですが、backup (上図eth1) では、active (上図eth0) から送信された ARP 要求 (broadcast) を受信したかどうかの確認が行われるようになります。ドライバソース上、この ARP 確認処理の核心部分は、drivers/net/bonding/bond_main.c の次の箇所です。
   2741 static int bond_arp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
   2742 {
...
   2789         /*
   2790          * Backup slaves won't see the ARP reply, but do come through
   2791          * here for each ARP probe (so we swap the sip/tip to validate
   2792          * the probe).  In a "redundant switch, common router" type of
   2793          * configuration, the ARP probe will (hopefully) travel from
   2794          * the active, through one switch, the router, then the other
   2795          * switch before reaching the backup.
   2796          */
   2797         if (slave->state == BOND_STATE_ACTIVE)
   2798                 bond_validate_arp(bond, slave, sip, tip);
   2799         else
   2800                 bond_validate_arp(bond, slave, tip, sip);
   2801
...
"drivers/net/bonding/bond_main.c"
2798行目が、active 側の確認 (arp_ip_target からの ARP 応答であるか?) です。
2800行目が、backup 側の確認 (arp_ip_target に対する ARP 要求であるか?) です。
掲載したソースは、2.6.18-164.el5 (CentOS 5.5 のカーネル) のものですが、2.6.32-71.el6 (CentOS 6.0 のカーネル) でも、全く同じです。

最後に、この記事の図に対応する設定例サンプル (/etc/sysconfig/network-scripts/ifcfg-bond0, ifcfg-eth0, ifcfg-eth1) を載せます。
#
# network-scripts/ifcfg-bond0
#
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.50.111
NETMASK=255.255.255.0
GATEWAY=192.168.50.254
BONDING_OPTS="mode=1 arp_interval=1200 arp_ip_target=192.168.50.222 arp_validate=3"
USERCTL=no
NM_CONTROLLED=no
arp_interval=1200 ミリ秒を勧めます。sysctl の net.ipv4.neigh.default.locktime (単位10ミリ秒) よりも長い値。
#
# network-scripts/ifcfg-eth0
#
DEVICE=eth0
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
HWADDR=00:0C:29:xx:xx:xx
USERCTL=no
NM_CONTROLLED=no
#
# network-scripts/ifcfg-eth1
#
DEVICE=eth1
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
HWADDR=00:0C:29:yy:yy:yy
USERCTL=no
NM_CONTROLLED=no

2011-08-08追記
どうやら Internet Explorer だと、テキストで書いた図が歪むようですので、PNG を貼ります。Chrome と Firefox ではきれいに見えます。IE の方は試してみては。

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ