ubuntu 16.04 server でNICチーミングした際のメモです
NICチーミングとは?
- NIC複数枚で冗長化、負荷分散をするOSの持つ機能です。bondingとも言います。
- 具体的には次の2つになります
- 1枚が壊れてももう1枚で処理を継続できる(冗長化)
- 1つのIPでNIC2枚分の帯域を使用できる(負荷分散)
- 具体的には次の2つになります
NICチーミングのモード
- Linuxのチーミングには幾つかモードがあり、どれか1つを選びます。抜粋すると次になります
- active-backupモード
- 1枚をactive NICとし、平常時はその1枚を使う。他の使用しないNICはbackup NICとよびます。
- active NIC障害時はbackup NICから新しいactive NICを選択してそのNICを使います
- スイッチに設定は不要なので楽です
- 冗長化のみで、負荷分散しません
- 802.3adモード
- LACPを使ったLink Aggregationを実現(LACPについては割愛)
- サーバーだけでなくスイッチに設定が必要です
- 冗長化・負荷分散の両方ができます
- 負荷分散は送信先・送信元のMACアドレスやIPアドレスを元にハッシュ値を計算してどのNICを使うか決めます
- 通信相手の台数が少ないとうまく負荷分散しない可能性があります
- ハッシュ値が十分に分散しないことがありえるためです
- ラウンドロビンモード
- 使用可能な全てのNICを順番に使用
- サーバーだけでなくスイッチに設定が必要
- 冗長化・負荷分散の両方ができる
- active-backupモード
NICチーミングの障害検知方法
- NICチーミングでは障害を検知して使用するNICの切り替えを行います
- 障害検知の方法にも種類があります
-
MII監視
- NICから取れるリンクアップ情報を元に障害を判断します
- NICがリンクアップしていてもパケットを送れないような障害は検知できません
- 例えばこういう障害: NIC---Switch1---×---Switch2
-
ARP監視
- NICからARPを投げた返答を元に障害を判断します
- MII監視では検出できない障害も対応できます
- 定期的にARPを投げることになり、帯域を消費してしまいます
-
Ubuntu Server 16.04で組んでみる
手順
必要なパッケージのインストール
sudo apt-get install ifenslave
ネットワーク停止と必要なモジュールのロード
sudo stop networking
sudo modprobe bonding
設定ファイル編集
sudo vi /etc/network/interfaces
/etc/network/interfacesの中身
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eno1
iface eno1 inet manual
bond-master bond0
auto eno2
iface eno2 inet manual
pre-up sleep 5
bond-master bond0
auto bond0
iface bond0 inet dhcp
bond-slaves eno1 eno2
bond-primary eno1 eno2
bond-mode active-backup
bond-miimon 100
- 細かい説明は割愛します。雰囲気で大体わかると思います
- DHCP環境でのポイントはeno2の
pre-up sleep 5
です- 先にupしたnicのmacアドレスを使用してIP取得するため、eno1を先にupさせます
- eno1故障時もeno2がeno1のmacアドレスを使用します
- トラブルの種になるので、eno2はDHCP登録しない方がいいです
- 先にupしたnicのmacアドレスを使用してIP取得するため、eno1を先にupさせます
-
bond-miimon
はMII監視の間隔msです。- 記事によっては
miimon
だったりもしますが、私の手元のubuntu 16.04 serverではこれが正しいです。- Linuxの公式マニュアル通りです
- 記事によっては
有効化
sudo start networking
稼働状況確認
cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
802.3ad info
LACP rate: fast
Aggregator selection policy (ad_select): stable
bond bond0 has no active aggregator
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f5:b7:11
Aggregator ID: N/A
Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f5:b7:1b
Aggregator ID: N/A
- MII Status、MII Polling Interval (ms)が設定されているか確認します
テスト
- pingを打ちながらケーブルを抜き差しして、pingが途切れないのを確認してください
- ケーブルを抜き差しの代わりにifdown & ifupするのでは、mii監視が機能していなくてもフェイルオーバーするのでテストになりません