以下、その処理内容についてのメモです。
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=noarp_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 件のコメント:
コメントを投稿