技術コラム

製品技術
NVIDIA

ボンディングによる冗長化

ボンディングによる冗長化

Ethernetは、1980年に10Mbpsの転送速度で出現しましたが、その後100Mbps➡1Gbps➡10Gbpsと10倍ごとに転送速度を向上させてきましたが、量産出荷までの1段階のスピードの向上には、大体7-8年かかっていました。やはり、転送速度のマイグレーションスピードは市場のニーズに合わなくなり、複数の転送路を上手く利用する技術が必要とされました。
その後、転送速度の向上は10Gbps➡40Gbps➡100Gbpsと、より短期間で行われるようになりました。

複数のEthernetポートを並列に結ぶことで転送性能を向上されることができそうですが、いかんせんEthernetは経路設定をする際に、ループを形成するとスイッチとの組み合わせで輻輳が発生させるため、1つの経路のみを有効とし、ループを形成しないようにその他の経路は無効化するという、STP (Spanning Tree Protocol)で経路を選択する技法が使われます。

それでは、複数の接続を使えるようにしたものがボンディング(Bonding)技術が開発されました。これは複数のネットワーク・インタフェース・カード(NIC)を使用して、それらのNICを束ねることにより、一つの論理的なNIC動作をさせることで、データ転送性能の向上や、一つの転送路が切断したとしても転送を継続してくれる冗長化を兼ね備えた技術です。また、同様にDOS/Windows系はTeamingとして、スイッチはLink Aggregationと呼ばれており同様な手法で、複数の転送路を1つの太いパイプとして使用します。なお、RedHat Linuxでは、Teamingの持つ機能についてサポートされています。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_network_teaming

その一方で、2000年当初からスタートしたInfiniBandは、転送速度を10Gbps (x4 SDR) ➡ 20Gbps(x4 DDR) ➡ 40Gbps(x4 QDR) ➡ 56Gbps(x4 FDR) ➡ 100Gbps(x4 EDR)と3年ごとに転送性能が倍に向上しており、応答性能も良いことから、超並列コンピュータに使用され、ちなみに2019年6月、53回目を数えたTop 500のランキングを見ると、米国エネルギー省、オークリッジ国立研究所に設置されたIBM社のSummitとSierraがそれぞれ1位と2位を獲得しました。このシステムには、Mellanox 社が供給するInfiniBand EDR 製品が使われています。
InfiniBandは3年ごとに性能向上が図られており、またSubnet Managerによる経路設定等の自動化や、予めRDMA(Remote Direct Memory Access)転送をベースにデザインされているため、Bondingを使った並列化による転送性能の向上は特に必要とはされず、ノード-スイッチ接続の冗長化として使用されているようです。

このボンディング機能は,Linuxカーネルのドライバとして、ボンディングドライバが標準的に実装されており、標準のネットワークデバイス名を用いて使用することができます。よって、EthernetではNIC/HCA を複数枚搭載し、簡単な設定をすることでボンディングを利用することができます。

ボンディングは、複数のネットワーク・インターフェースをスレーブとして、1つのマスターに集約して使用されます。またLinuxの接続形態(モード)は下記の通りです。

・balance-rr

全スレーブのネットワーク・インターフェースを順番に使用しパケットを送信することにより、送信のみの負荷分散として使用します。 別名ラウンドロビン方式とも呼ばれます。

・active-backup

1つのスレーブのみを アクティブ・インターフェースとして使用します。アクティブ側に転送障害が起きた場合、バックアップ側をアクティブに切り替えることにより、途切れない通信が可能となります。冗長性は確保できますが、負荷分散はされません。

・balance-xor

MACアドレスを元に送信するインターフェースを決定しパケットを送信します。balance-rrと同様に、送信のみ負荷分散されます。

・802.3ad
IEEE 802.3ad(LACP)に準拠したリンクアグリゲーションが行われます。

・balance-tlb
各インターフェースの負荷に応じて送信インターフェースを決定しパケットを送信します。送信のみ負荷分散されます

・balance-alb
balance-tlbの機能に加えて、受信側も負荷分散されます。

上記のような動作モードがありますが、active-standby以外はスイッチ等相手側にどのような動作モードがサポートされているか確認が必要です。

実際にLinux7でのボンディング設定をしてみましょう。 今回はネットワーク環境として、

ホストOS: CentOS 7.2
NIC: Mellanox ConnectX-4 Dual Port 100Gbps
Switch: Mellanox SN2410 25/100Gbps Switch

を使用し、NIC-Switch間は、100Gbps Ethernet接続になります。
CentOS 7.2ですとnmcli(Network Manager)を使ったBondingの設定が可能ですが、今回は、Network Scriptを作るときのみの使用となり、Network Managerは無効として、Bondingの設定をします。

・ボンディングするNICのインターフェース名を確認します。

ifconfig screen

・Linux上のボンディングサポート状況を確認します。

・bonding デバイス追加。ボンディングをbond01, Slave ens1f0および、ens1f1をスレーブとして、network scriptファイルを作ります。

“Connection ‘bond01’ (<uuid>) successfully added.のようなメッセージが出ればOK.“
・上記bonding デバイス追加で作られたファイルを編集します。

・/etc/sysconfig/network-scripts/ifcfg-bond0ファイルが出来上がりますので、これを編集します。

上記4点を編集、追加しました。

・slave 追加
・/etc/sysconfig/network-scripts/ifcfg-ens1f0および、ifcfg-ens1f1ファイルを編集します。

Vi /etc/sysconfig/network-scripts/ens1f0

上記2行を追加します。 Ifcfg-Ens1f1ファイルも同じく2行を追加します。

ここでホストをリセットすると新しいNetwork Scriptで動作するようになります。

実際に設定状況を見てみましょう。EthernetBondig Driverは、round-robinでのロードバランシングの機能を提供しています。

[root@centos72 デスクトップ]# cat /proc/net/bonding/bond01
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens1f0
MII Status: up
Speed: 100000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: e4:1d:2d:a3:ad:1c
Slave queue ID: 0
Slave Interface: ens1f1
MII Status: up
Speed: 100000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: e4:1d:2d:a3:ad:1d
Slave queue ID: 0
[root@centos72 デスクトップ]#

次に対向のスイッチの設定です。モードとしては、Load Balanceを用いたStatic接続にします。
この例では、Port 1/53およびPort 1/55がその接続先になります。

Switch > enable
Switch # configure terminal
Switch (config) # interface port-channel 1
Switch (config) # interface ethernet 1/53 channel-group 1 mode on
Switch (config) # interface ethernet 1/55 channel-group 1 mode on

上記コマンドにより、スイッチはStatic mode(mode on)になります。

実際、スイッチに接続された別なホストとの間でPingを飛ばしてみました。

[root@centos72 デスクトップ]# ping 192.168.20.10
PING 192.168.20.10 (192.168.20.10) 56(84) bytes of data.
64 bytes from 192.168.20.10: icmp_seq=1 ttl=64 time=0.330 ms
64 bytes from 192.168.20.10: icmp_seq=2 ttl=64 time=0.195 ms
64 bytes from 192.168.20.10: icmp_seq=3 ttl=64 time=0.223 ms
64 bytes from 192.168.20.10: icmp_seq=4 ttl=64 time=0.226 ms
64 bytes from 192.168.20.10: icmp_seq=5 ttl=64 time=0.203 ms
64 bytes from 192.168.20.10: icmp_seq=6 ttl=64 time=0.186 ms
64 bytes from 192.168.20.10: icmp_seq=7 ttl=64 time=0.198 ms
64 bytes from 192.168.20.10: icmp_seq=8 ttl=64 time=0.167 ms
64 bytes from 192.168.20.10: icmp_seq=9 ttl=64 time=0.160 ms

さて、スイッチのPort 1/53 及び Port 1/55に接続されているケーブルを交互に抜くと下記のようなログが残されますが、Pingは継続しておりました。

Sun May  5 17:28:55 2019: Interface Eth 1/55 changed state to DOWN
Sun May  5 17:29:18 2019: Interface Eth 1/55 changed state to UP
Sun May  5 17:29:26 2019: Interface Eth 1/53 changed state to DOWN
Sun May  5 17:30:00 2019: Interface Eth 1/53 changed state to UP

bondingがうまく働いております。

・ボンディングモード4(IEEE 802.3ad LACP)で動かしてみましょう。
ボンディングモードの変更は、/etc/sysconfig/network-scripts/ifcfg-bond01の最後のラインのoptionの行を変えただけです。

DEVICE=bond01
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=none
IPADDR=192.168.20.101
NETMASK=255.255.255.0
GATEWAY=192.168.20.1
DEFROUTE=yes
PEERDNS=ye
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=bond01
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS=”mode=4 miimon=1000 xmit_hash_policy=2″  <-この行を変更

動作モードを確認してみましょう。この場合は、マスターのみの変更で、スレーブ側の変更はありません。

[root@centos72 デスクトップ]# cat /proc/net/bonding/bond01

確かにBondingモードがIEEE802.adモードになっています。

次に対向のスイッチの設定です。モードとしては、Load Balanceを用いたStatic接続にします。
この例では、Port 1/53およびPort 1/55がその接続先になります。

Static mode接続との違いは、mode activeとなった点です。これによりこのポートはLACP Dynamic Link Aggregationモードとなります。

さて、スイッチのPort 1/53 及び Port 1/55に接続されているケーブルを交互に抜くと下記のようなスイッチログが残されますが、Pingは継続しておりました。

以上、Bondigに関しては、簡単な操作で構成が可能となっております。