ubuntu server で NICチーミング

ubuntu 16.04 server でNICチーミングした際のメモです

# NICチーミングとは？
* NIC複数枚で冗長化、負荷分散をするOSの持つ機能です。bondingとも言います。
  * 具体的には次の２つになります
      * 1枚が壊れてももう1枚で処理を継続できる(冗長化)
      * 1つのIPでNIC2枚分の帯域を使用できる(負荷分散)


# 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を順番に使用
      * サーバーだけでなくスイッチに設定が必要  
      * 冗長化・負荷分散の両方ができる

# NICチーミングの障害検知方法
* NICチーミングでは障害を検知して使用するNICの切り替えを行います
* 障害検知の方法にも種類があります
  * MII監視
      * NICから取れるリンクアップ情報を元に障害を判断します
      * NICがリンクアップしていてもパケットを送れないような障害は検知できません
          * 例えばこういう障害:　　NIC---Switch1---×---Switch2

  * ARP監視
      * NICからARPを投げた返答を元に障害を判断します
      * MII監視では検出できない障害も対応できます
      * 定期的にARPを投げることになり、帯域を消費してしまいます

            
# Ubuntu Server 16.04で組んでみる
* active-stanby + MII監視 + DHCPで組んでみます
* Linux公式マニュアルは[こちら](https://www.kernel.org/doc/Documentation/networking/bonding.txt)
* Ubuntu公式マニュアルは[こちら](https://help.ubuntu.com/community/UbuntuBonding)

## 手順

```bash:必要なパッケージのインストール
sudo apt-get install ifenslave
```

```bash:ネットワーク停止と必要なモジュールのロード
sudo stop networking
sudo modprobe bonding
```

```bash:設定ファイル編集
sudo vi /etc/network/interfaces
```

```text:/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登録しない方がいいです  
* `bond-miimon`はMII監視の間隔msです。
  * 記事によっては`miimon`だったりもしますが、私の手元のubuntu 16.04 serverではこれが正しいです。
      * Linuxの公式マニュアル通りです

```bash:有効化
sudo start networking
```

```bash:稼働状況確認
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監視が機能していなくてもフェイルオーバーするのでテストになりません