IP Network Multipathing を使う

Solaris8 の 10/00 より前では、ネットワークインターフェースを二重化するには、自分たちで ping などを使ってシェルを作って監視したり、ベンダから出ている製品を利用するしか方法はありませんでした。

しかし、Solaris8 10/00 から IP Network Multipathing という機能が加わり、自分がつながっている最初の装置までの間の障害発生を検知して、ネットワークを自動的に切り替えたりするシステムが提供されました。通常使用のネットワークインターフェースに障害が発生した場合、自動的に同じところに接続している代替ネットワークインターフェースが全ての接続を自動的に切り替え、中断のないネットワーク利用が可能になるシステムです。また、この場合、複数のネットワークインターフェースが同じところにつながることで、複数ネットワークインターフェースでトラフィックを分散することも可能になります。ということは、トラフィックのスループットの増加ができるということになります。

今回は、HUB に対して2枚のネットワークインターフェースをつなぎ、通常時は両方を使ってマルチパスによるトラフィック分散を行い、どちらかが障害を起こした場合、障害を起こしたネットワークインターフェースのIPアドレスなどの設定情報が、正常稼動しているネットワークインターフェース側に引き継がれるようにします。また、障害回復時には、自動的に元の状態に戻る形とします。

以下は、具体的な設定と実際の動作です。

1.マルチパス構成ファイル(mpathd) を編集する。

/etc/default/mpathd ファイルが、IP Network Multipathing の動作を設定するファイルなので、これを編集します。が、特に編集しなくてもデフォルトでもとりあえずは動作します。下記はデフォルトの設定ファイルです。
#
#ident  "@(#)mpathd.dfl 1.1     00/01/03 SMI"
#
# Time taken by mpathd to detect a NIC failure in ms. The minimum time
# that can be specified is 100 ms. 
# 

FAILURE_DETECTION_TIME=10000
#
# Failback is enabled by default. To disable failback turn off this option
# 

FAILBACK=yes
#
# By default only interfaces configured as part of multipathing groups 
# are tracked. Turn off this option to track all network interfaces 
# on the system
# 

TRACK_INTERFACES_ONLY_WITH_GROUPS=yes
  • FAILURE_DETECTION_TIME:

    障害検出時間を設定する。 1ms (0.01 秒) 単位で、最小は 100ms (0.1 秒)

  • FAILBACK

    障害の発生したネットワークインターフェースがつながっている経路が復旧した際、復帰のさせるかどうかの設定。yes = 復帰する / no = 復帰させない

  • TRACK_INTERFACES_ONLY_WITH_GROUPS

    障害検知は、マルチパスグループとして構成されているネットワークインターフェースのみ検査を行うかを指定。 yes = マルチパスグループとして構成されているネットワークインターフェースのみ / no = 全てのインタフェース

2.IP Network Multipathing を取るインターフェースを設定

IP Network Multipathing を取るインターフェースの、hostname.xxxx を編集する。

/etc/hostname.elxl0 の設定 (私の場合、3com のカードなので、elxl0 になります)

192.168.1.51 group local-path up \
addif 192.168.1.151 -failover deprecated up
この設定の場合、elxl0 のネットワークインターフェースは、192.168.1.51の IP アドレスを持ち、障害検知に論理アドレスの 192.168.1.151 を使い、障害時には 代替ネットワークインターフェースに failover し、情報を deprecated した後に インターフェースを up するという意味になります。各項目は以下のように指定します。
  • 192.168.1.51・・・・・・・・・・・・ IP アドレスか、インターフェース名を指定します。
  • group xxxxx ・・・・・・・・・・・・ 任意のグループ名を xxxxx のところに記述します。
  • addif 192.168.1.151 ・・・・・・ インターフェースの障害検知用の論理アドレスです。

他の部分は例のように記述すればかまいません。また、同じように2枚目のネットワークインターフェースの /etc/hostname.elxl1 も編集します。

192.168.1.52 group local-path up \
addif 192.168.1.152 -failover deprecated up
設定はこれだけで済みます。

3.動作確認

あとはマシンを再起動して、実際に切り替わるかを検証します。
# sync
# sync
# sync
# init 6
再起動したら、ifconfig を使って確認します。下記のように、各ネットワークインターフェースに対し、物理アドレスと仮想アドレスの2つのインターフェースができていると思います。
# ifconfig -a 
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1 
        inet 127.0.0.1 netmask ff000000 
elxl0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2 
        inet 192.168.1.51 netmask ffffff00 broadcast 192.168.1.255
        groupname local-path 
        ether xx:xx:xx:xx:xx:xx 
elxl0:1: flags=9040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
> mtu 1500 index 2 
        inet 192.168.1.151 netmask ffffff00 broadcast 192.168.1.255 
elxl1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3 
        inet 192.168.1.52 netmask ffffff00 broadcast 192.168.1.255
        groupname local-path 
        ether xx:xx:xx:xx:xx:yy 
elxl1:1: flags=9040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
> mtu 1500 index 3 
        inet 192.168.1.152 netmask ffffff00 broadcast 192.168.1.255 
#
ここで、elxl0 側のケーブルを抜いてみます。物理的に障害が発生したイメージにするわけです。その後、ちゃんと切り替わったかを ifconfig で見てみます。経路に障害が出た場合、コンソールにもメッセージが出るので、コンソールも立ち上げておくと良いでしょう。
# ifconfig -a 
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1 
        inet 127.0.0.1 netmask ff000000 
elxl0: flags=19000842<BROADCAST,RUNNING,MULTICAST,IPv4,NOFAILOVER,FAILED> mtu 0
index 2 
        inet 0.0.0.0
        groupname local-path 
        ether xx:xx:xx:xx:xx:xx 
elxl0:1: flags=19040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
,FAILED> mtu 1500 index 2 
        inet 192.168.1.151 netmask ffffff00 broadcast 192.168.1.255 
elxl1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3 
        inet 192.168.1.52 netmask ffffff00 broadcast 192.168.1.255
        groupname local-path 
        ether xx:xx:xx:xx:xx:yy 
elxl1:1: flags=9040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
> mtu 1500 index 3 
        inet 192.168.1.152 netmask ffffff00 broadcast 192.168.1.255 
elxl1:2: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3 
        inet 192.168.1.51 netmask ffffff00 broadcast 192.168.1.255 
#
このように、2つめのインターフェースに論理インターフェースが1つ追加され、そこに1つ目のインターフェースの情報がちゃんと出ていれば、正常に動作しています。見比べるとそのほかに、elxl0 のインターフェースが up していないこともわかります。

次に復旧を見てみます。先ほど外したケーブルを HUB につなぎなおします。その後、ifconfig で復旧を確認します。

# ifconfig -a 
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1 
        inet 127.0.0.1 netmask ff000000 
elxl0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2 
        inet 192.168.1.51 netmask ffffff00 broadcast 192.168.1.255
        groupname local-path 
        ether xx:xx:xx:xx:xx:xx 
elxl0:1: flags=9040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
> mtu 1500 index 2 
        inet 192.168.1.151 netmask ffffff00 broadcast 192.168.1.255 
elxl1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3 
        inet 192.168.1.52 netmask ffffff00 broadcast 192.168.1.255
        groupname local-path 
        ether xx:xx:xx:xx:xx:yy 
elxl1:1: flags=9040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
> mtu 1500 index 3 
        inet 192.168.1.152 netmask ffffff00 broadcast 192.168.1.255 
#
元と同じものが表示されれば復旧完了です。あとは、もっと深く確認したければ、/var/adm/messages に障害発生=>切り替わり=>復旧のメッセージが出ているので、それを見るのも良いでしょう。サーバの監視ツールを使っている環境では、ここに出るメッセージを拾うと良いかもしれません。

なお、障害を起こしたインターフェースが動的再構成 (Dynamic Reconfiguration) によりシステムから取り除かれたり、正常なインターフェースに付け替えて復旧する前にリブートが行われた場合、システムはそのインタフェースの検出に失敗しその IP アドレスがその後インターフェースが復旧しても元に戻らなかったのですが、Solaris 8 7/01 以降では、IPMP リブートセーフ機能を使用することで、IP アドレスを失うことなく、自分の所属する他のグループ内のインターフェースに再度アドレスが転送されるようになりました。2枚以上の複数のインターフェースを同じネットにつないでおけば、より安心ということですね。


冗長構成メニューへ