2 高可用性のためのネットワーク・サーバーの最適化

ネットワーク内のクライアントにネットワーク・サービスを提供するシステムの場合、サービスが継続し、中断されないように、ネットワークの可用性が優先されます。仮想ローカル・エリア・ネットワーク(VLAN)では、同様の機能があるシステムをそれら固有の仮想ネットワークに属しているかのようにグループ化して、ネットワークを編成することもできます。この機能により、ネットワークの管理が改善されます。

システムでこれらの高度な機能を使用できるようにするには、それに複数のNICが必要です。NICが多いほど、サーバーで提供できるネットワーク可用性の確実性が高まります。

ネットワーク結合の使用

ネットワーク・スイッチに接続されている、システムの複数の物理ネットワーク・インタフェースを単一の論理インタフェースにまとめると、スループットや可用性を高めることができます。物理ネットワーク・インタフェースのこのグループ化(集約)は、ネットワーク結合と呼ばれます。

結合ネットワーク・インタフェースでは、ロード・バランシングによってデータ・スループットを高めることができ、あるコンポーネント・デバイスから別のコンポーネント・デバイスへのフェイルオーバーをアクティブ化することで冗長性を提供できます。デフォルトでは、結合インタフェースはカーネルから通常のネットワーク・デバイスのように認識されますが、このインタフェースは、ラウンドロビン・スケジューラを使用して、使用可能なセカンダリ・デバイスを介してネットワーク・パケットを送信します。結合インタフェースの構成ファイル内の結合モジュール・パラメータを構成して、ロード・バランシングとデバイス・フェイルオーバーの動作を変更できます。

カーネル内のネットワーク結合ドライバを使用すると、要件および使用可能なネットワーク・インフラストラクチャに応じて異なる結合機能を利用するために、様々なモードでネットワーク結合を構成できます。たとえば、balance-rrモードを使用すると、一連の物理ネットワーク・インタフェースにわたり、基本的なラウンドロビン・ロードバランシングおよびフォルト・トレランスを提供できます。一方、active-backupモードでは、高可用性構成のための基本的なフォルト・トレランスが提供されます。802.3adや動的リンク・アグリゲーションなどの一部の結合モードでは、物理インタフェースが接続するスイッチに特定のハードウェア機能と構成が必要です。基本ロード・バランシング・モード(balance-rrおよびbalance-xor)では、EtherChannelまたはトランキングをサポートするスイッチが使用されます。拡張ロード・バランシング・モード(balance-tlbおよびbalance-alb)では、切替えハードウェアに要件は課されませんが、各コンポーネント・インタフェースのデバイス・ドライバで特定の機能(ethtoolのサポートや、デバイスがアクティブである間にハードウェア・アドレスを変更する機能など)を実装する必要があります。

カーネル結合ドライバの詳細は、https://www.kernel.org/doc/Documentation/networking/bonding.txtでアップストリームのドキュメントを参照するか、/usr/share/doc/iputils-*/README.bondingを参照してください。

ノート:

高可用性のために複数のシステムを直接接続してひとまとめにするネットワーク構成の場合は、自動フェイルオーバーなどの特定のネットワーク・インタフェース結合機能をサポートするにはスイッチが必要です。そうしないと、メカニズムが機能しない可能性があります。

ネットワーク結合の構成

ネットワーク結合は、コマンド行またはネットワーク接続エディタを使用して構成できます。

コマンドラインの使用

ネットワーク結合の構成に関するハンズオン・ラボ環境を含むチュートリアルは、Network Manager CLIを使用したネットワーク結合の作成を参照してください。

  1. nmcli connection addコマンドを使用して、結合インタフェースを追加します。

    sudo nmcli connection add type bond con-name "Bond Connection 1" ifname bond0 bond.options "mode=active-backup"

    結合接続名と結合インタフェース名、さらに、重要なこととして、結合モード・オプションを設定することに注意してください。この例では、モードはactive-backupに設定されています。結合接続名を設定しなかった場合は、結合インタフェース名が接続名としても使用されます。

  2. オプションで、nmcli connection modifyコマンドを使用して、結合インタフェースのIPアドレスを構成します。デフォルトでは、インタフェースはDHCPを使用するように構成されていますが、静的IPアドレス指定が必要な場合は、アドレスを手動で構成する必要があります。たとえば、結合のIPv4設定を構成するには、次のように入力します。

    sudo nmcli connection modify "Bond Connection 1" ipv4.addresses '192.0.2.2/24'
    sudo nmcli connection modify "Bond Connection 1" ipv4.gateway '192.0.2.1'
    sudo nmcli connection modify "Bond Connection 1" ipv4.dns '192.0.2.254'
    sudo nmcli connection modify "Bond Connection 1" ipv4.method manual
  3. nmcli connection addコマンドを使用して、物理ネットワーク・インタフェースをセカンダリタイプのインタフェースとして結合に追加します。次に例を示します。

    sudo nmcli connection add type ethernet slave-type bond con-name bond0-if1 ifname enp1s0 master bond0
    sudo nmcli connection add type ethernet slave-type bond con-name bond0-if2 ifname enp2s0 master bond0

    各セカンダリに接続名を指定し、追加する各インタフェースのインタフェース名を選択します。使用可能なインタフェースのリストを取得するには、nmcli deviceコマンドを実行します。セカンダリ・ネットワーク・インタフェースをアタッチする結合のインタフェース名を指定します。

  4. 結合インタフェースを起動します。

    sudo nmcli connection up "Bond Connection 1"
  5. ネットワーク・インタフェースが結合に正しく追加されたことを確認します。これを確認するには、デバイス・リストを再度調べます。

    sudo nmcli device
    ...
    enp1s0   ethernet  connected  bond0-if1
    enp2s0   ethernet  connected  bond0-if2
ネットワーク接続エディタの使用
  1. このエディタを起動します。

    sudo nm-connection-editor

    ネットワーク接続ウィンドウが開きます。

  2. 接続を追加するには、ウィンドウの下部にあるプラス(+)ボタンを使用します。

    このステップでは、作成する接続タイプの入力を求める別のウィンドウが開きます。

  3. ウィンドウのドロップダウン・リストで、仮想セクションから結合を選択し、作成をクリックします。

    ネットワーク結合エディタ・ウィンドウが開きます。

    ネットワーク結合エディタ


    この図は、ネットワーク接続インタフェース・エディタが開き、新しい結合ネットワーク・インタフェースを構成できる状態を示しています。
  4. オプションで、結合の接続名を構成します。

  5. 追加ボタンをクリックして、ネットワーク結合に物理ネットワーク・インタフェースを追加します。

    1. ネットワーク結合に追加する物理インタフェースのタイプを選択できる新しいウィンドウ。たとえば、イーサネット・タイプを選択して、ネットワーク結合にイーサネット・インタフェースを追加できます。作成ボタンをクリックして、セカンダリ・インタフェースを構成します。

    2. オプションで、セカンダリ・インタフェースの名前を構成します。

    3. デバイスフィールドで、結合にセカンダリとして追加する物理ネットワーク・インタフェースを選択します。デバイスがネットワーク用にすでに構成されている場合は結合内で構成できるものとしてそれがリストされないことに注意してください。

    4. 保存をクリックして、セカンダリ・デバイスをネットワーク結合に追加します。

    この結合インタフェースを構成するすべての物理ネットワーク・インタフェースについて、これらの手順を繰り返します。

  6. ネットワーク結合に使用する結合モードを構成します。

    モードドロップダウン・リストから結合モードを選択します。なお、一部のモードでは、ネットワーク・スイッチに関してさらに構成が必要になる場合があります。

  7. デフォルト設定を使用しない場合は、必要に応じてその他の結合パラメータ(リンク・モニタリングなど)を構成します。

    ネットワーク結合IP構成にDHCPを使用しない予定の場合は、IPv4タブとIPv6タブをクリックすることでIPアドレス指定を設定します。

  8. 保存ボタンをクリックして構成を保存し、ネットワーク結合を作成します。

ネットワーク結合ステータスの確認

  1. 次のコマンドを実行して、デバイス名がbond0のネットワーク結合に関する情報を取得します。

    cat /proc/net/bonding/bond0

    出力では、アクティブな結合セカンダリなど、結合構成およびステータスが示されます。出力では、各セカンダリ・インタフェースのステータスに関する情報も示されます。

  2. セカンダリ・インタフェースの1つに接続されている物理ケーブルを一時的に取り外します。この他に、リンク障害をテストするために使用可能な信頼できる方法はありません。

  3. この手順の最初のステップに示されているように、結合リンクのステータスを確認します。セカンダリ・インタフェースのステータスでは、そのインタフェースが停止しており、リンク障害が発生していることが示されます。

ネットワーク・インタフェース・チーミングの使用

ネットワーク・インタフェース・チーミングは、ネットワーク・インタフェース結合に似ており、結合と比べると比較的メンテナンスが必要なく再構成、拡張およびデバッグが容易な、リンク・アグリゲーションの実装方法を提供します。

軽量カーネル・ドライバはチーミングを実装し、teamdデーモンはランナーという名のロード・バランシングおよびフェイルオーバー・スキーマを実装します。

定義されているのは、次の標準のランナーです。

activebackup

変更がないかリンクを監視し、パケットの送信に使用するアクティブなポートを選択します。

broadcast

すべてのメンバー・ポートにパケットを送信します。

lacp

メンバー・ポート上にリンク・アグリゲーション制御プロトコル802.3adを実装することにより、ロード・バランシングを実現します。

loadbalance

パッシブ・モードで、Berkeley Packet Filter (BPF)ハッシュ関数を使用して、パケットの送信に使用するポートを選択します。

アクティブ・モードでバランシング・アルゴリズムを使用し、使用可能なポートで送信パケットを配信します。

random

ポートをランダムに選択し、各送信パケットを送信します。

roundrobin

ラウンドロビン方式で、使用可能なポートを介してパケットを送信します。

特殊化したアプリケーションについては、teamdが解釈できるカスタマイズされたランナーを作成できます。teamdctlコマンドを使用してteamdの操作を制御します。

詳細は、teamd.conf(5)マニュアル・ページを参照してください。

ネットワーク・インタフェース・チーミングの構成

チームのプロパティとそのコンポーネント・インタフェースを指定するJSON形式の定義を作成して、チーミングされたインタフェースを構成できます。次に、teamdデーモンがこれらの定義を解釈します。JSON形式の定義を使用すると、teamdデーモンを手動で開始すること、/etc/sysconfig/network-scriptsにあるインタフェース定義ファイルを編集すること、nmcliコマンドを使用すること、またはネットワーク構成エディタ(nm-connection-editor)を使用することで、チーム・インタフェースを作成できます。次のタスクでは、これらのメソッドの最初のものについて説明します。

  1. チームとそのコンポーネント・ポートに対してJSON形式の定義ファイルを作成します。構成例は、/usr/share/doc/teamd/example_configs/内のファイルを参照してください。

    次のactivebackup_ethtool_1.confの例では、アクティブ・バックアップ構成を定義しており、ここではeth1がプライマリ・ポート、eth2がバックアップ・ポートとして構成され、これらのポートがethtoolによって監視されます。

    {
            "device":       "team0",
            "runner":       {"name": "activebackup"},
            "link_watch":   {"name": "ethtool"},
            "ports":        {
                    "eth1": {
                            "prio": -10,
                            "sticky": true
                    },
                    "eth2": {
                            "prio": 100
                    }
            }
    }
  2. コンポーネントのポートを停止します。

    sudo ip link set eth1 down
    sudo ip link set eth2 down

    ノート:

    アクティブなインタフェースはチームに追加できません。

  3. teamdデーモンのインスタンスを開始し、構成ファイルを読み取ってチーミングされたインタフェースを作成します。

    次の例では、/root/team_config/team0.confが使用されています。

    sudo teamd -g -f /root/team_config/team0.conf -d
    Using team device "team0".
    Using PID file "/var/run/teamd/team0.pid"
    Using config file "/root/team_config/team0.conf"

    ここで、-gオプションでは、デバッグ・メッセージが表示されますが、これは省略できます。

  4. チーミングされたインタフェースのIPアドレスとネットワーク・マスク接頭辞の長さを設定します。

    sudo ip addr add 10.0.0.5/24 dev team0

詳細は、teamd(8)マニュアル・ページを参照してください。

チームへのポートの追加およびポートの削除

チームにポートを追加するには、teamdctlコマンドを使用します。

sudo teamdctl team0 port add eth3 

チームからポートを削除するには:

sudo teamdctl team0 port remove eth3 

詳細は、teamdctl(8)マニュアル・ページを参照してください。

チームのポート構成の変更

teamdctlコマンドを使用して、次のようにチームの構成要素であるポート構成を更新します。

sudo teamdctl team0 port config update eth1 '{"prio": -10, "sticky": false}'

JSON形式の定義を一重引用符で囲み、それを複数行に分割しないようにします。

詳細は、teamdctl(8)マニュアル・ページを参照してください。

チームの削除

次のコマンドを使用してteamdデーモンを停止します。

sudo teamd -t team0 -k

詳細は、teamd(8)マニュアル・ページを参照してください。

チームに関する情報の表示

次のように、チーミングされたインタフェースのネットワーク状態を表示します。

sudo ip addr show dev team0
7: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 08:00:27:15:7a:f1 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 scope global team0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe15:7af1/64 scope link 
       valid_lft forever preferred_lft forever

teamnlコマンドを使用して、チームのコンポーネント・ポートに関する情報を表示します。

sudo teamnl team0 ports
 5: eth2: up 1000Mbit FD 
 4: eth1: up 1000Mbit FD 

チームの現在の状態を表示するには、teamdctlコマンドを使用します。

sudo teamdctl team0 state
setup:
  runner: activebackup
ports:
  eth1
    link watches:
      link summary: down
      instance[link_watch_0]:
        name: ethtool
        link: down
  eth2
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
runner:
  active port: em4

また、teamdctlコマンドを使用して、チームのJSON構成、およびそれぞれの構成要素であるポートを表示することもできます。

sudo teamdctl team0 config dump
{
    "device": "team0",
    "link_watch": {
        "name": "ethtool"
    },
    "mcast_rejoin": {
        "count": 1
    },
    "notify_peers": {
        "count": 1
    },
    "ports": {
        "eth1": {
            "prio": -10,
            "sticky": true
        },
        "eth2": {
            "prio": 100
        }
    },
    "runner": {
        "name": "activebackup"
    }
}

詳細は、teamdctl(8)およびteamnl(8)の各マニュアル・ページを参照してください。

タグ付けされていないデータ・フレームを使用したVLANの構成

VLANは、同じ物理ネットワークに接続されているかのように通信できるマシンのグループです。VLANを使用すると、LAN上のその実際の物理的な場所に関係なくシステムをグループ化できます。タグ付けされていないデータ・フレームを使用するVLANでは、ネットワーク・スイッチのポートを同じ永続的なVLAN IDまたはPVID (デフォルトのVLANである1以外)に割り当てることによって、ブロードキャスト・ドメインを作成します。このPVIDに割り当てたすべてのポートは、1つのブロードキャスト・ドメインに存在します。同じVLANにあるデバイス間のブロードキャストは、別のVLANでの他のポートには認識されません(それらが同じスイッチ上に存在する場合でも同様)。

「ネットワーク設定」エディタまたはnmcliコマンドを使用してEthernetインタフェース用のVLANデバイスを作成します。

コマンド行からVLANデバイスを作成するには:

sudo nmcli con add type vlan con-name bond0-pvid10 ifname bond0-pvid10 dev bond0 id 10

前のコマンドを実行すると、VLANデバイスbond0-pvid10が結合インタフェースbond0に10のPVIDを使用して設定されます。物理LANを使用する標準インタフェースであるbond0に加えて、仮想LANにアクセスするタグ付けされていないフレームを使用できる、bond0-pvid10などのVLANデバイスが設定されました。

ノート:

結合インタフェースのコンポーネント・インタフェースに対して仮想インタフェースを作成する必要はありません。ただし、それらの接続先の各スイッチ・ポートにPVIDを設定する必要があります。

また、次のコマンドを使用して、結合されていないインタフェースについてVLANデバイスを設定できます。次に例を示します。

sudo nmcli con add type vlan con-name en1-pvid5 ifname en1-pvid5 dev en1 id 5

構成されているVLANインタフェースについて情報を取得するには、/proc/net/VLANディレクトリ内のファイルを表示します。

ipコマンドを使用してVLANデバイスを作成することもできます。ただし、このようなデバイスは、システムを再起動すると存在しなくなります。

たとえば、次のように5のPVIDを使用して、en1のVLANインタフェースen1.5を作成します。

sudo ip link add link eth1 name eth1.5 type vlan id 5

詳細は、ip(8)マニュアル・ページを参照してください。