Chapter 10. 複数のインターフェースを用いた負荷分散

Table of Contents
10.1. 注意
10.2. 他の可能性

これを実現する方法はいくつか存在します。 簡単で直截的なのは、'TEQL' - "True" (または "trivial") link equalizer です。 キューイングに絡むものはたいていそうですが、負荷分散も両方向に動作します。 完全な効果を得るには、接続の両端の関与が必要です。

このような状況を考えてください。

                 +-------+   eth1   +-------+
                 |       |==========|       |
 'network 1' ----|   A   |          |   B   |---- 'network 2'
                 |       |==========|       |
                 +-------+   eth2   +-------+

A と B はルータで、いまは両方で Linux が動作しているとしましょう。 トラフィックが network 1 から network 2 に向かうと、 ルータ A は B に向かう 2 つの接続に、パケットを分散させる必要があります。 ルータ B では、これを受信できるような設定が必要です。 逆方向についても同じで、パケットが network 2 から network 1 に向かうとき、 ルータ B はそれらのパケットを eth1 と eth2 の両方を使って送る必要があります。

この分散させる部分が、'TEQL' デバイスによってなされます。 次のようになります (いちばん簡単な設定):

# tc qdisc add dev eth1 root teql0
# tc qdisc add dev eth2 root teql0
# ip link set dev teql0 up

最後の 'ip link set up' コマンドを忘れないこと!

これは両方のホストで実行する必要があります。 このデバイス teql0 は、送信するパケットを、 基本的にラウンドロビンで eth1 と eth2 に分散させます。 データが teql デバイスから入ってくることは決してありません。 データは '生 (raw)' の eth1 と eth2 に到着します。

まだデバイスができただけですから、これらに適切なルーティング設定が必要です。 これを行う方法のひとつは、/31 のネットワークを両接続に割り当て、 teql デバイスにも同じように /31 のネットワークを割り当てるやり方です:

ルータ A にて:
# ip addr add dev eth1 10.0.0.0/31
# ip addr add dev eth2 10.0.0.2/31
# ip addr add dev teql0 10.0.0.4/31

ルータ B にて:
# ip addr add dev eth1 10.0.0.1/31
# ip addr add dev eth2 10.0.0.3/31
# ip addr add dev teql0 10.0.0.5/31

これでルータ A は 10.0.0.1, 10.0.0.3, 10.0.0.5 に対し、 2 つの実際の接続と、1 つの TEQL デバイス経由で ping できるようになったはずです。ルータ B も、 10.0.0.0, 10.0.0.2, 10.0.0.4 にこれらの接続経由で ping できるはずです。

ここまでが動作したら、ルータ A では 10.0.0.5 を network 2 に向かう経路にし、 ルータ B では 10.0.0.4 を network 1 に向かう経路にします。 特殊な場合として、network 1 が自宅のネットワーク、 network 2 がインターネットとしますと、 ルータ A では 10.0.0.5 を自分のデフォルトゲートウェイになるようにします。