OpenIndianaでVRRPをいじった

OpenIndianaをやっといじり始めた今日この頃なわけですが、早速VRRPを試してみました。VRRPはOpenSolais b134でも使えたのでその時もさわりで試したことはあるんですが改めていじってみました。OpenSolais 2009.06には実装されていません。

VRRPとは

一応VRRPについて。VRRPVirtual Router Redundancy Protocolで仮想ルータ冗長プロトコルです。そのまま。

wikipedia:VRRP

簡単な言い方をすれば、物理NICが持っているIPアドレスとは別のIPアドレスを設定し、それを異なるルータ間で優先順位(Priority)に基づいて仮想NIC(仮想MACアドレス)でバインドするイメージ。お互いを監視しあいマスターとなっているルータが落ちたらバックアップルータがそのIPアドレスを掴むことでネットワーク上にIPアドレスが存在し続けます。(あってるよね?)
その名の通り元はルータの冗長化のためのもの?ですが、別にルータ用途でなくても使えます。LinuxにあるkeepalivedやheartbeatもVRRPの実装でサーバの冗長性を保つアプリケーションです。LVSでのロードバランサやDRBDなどで使われてます。うちの会社でも使ってます。

OpenIndianaでのVRRP

最初にちょろっと触れたように、OpenIndiana(OpenSolais)にはVRRPがパッケージとして存在します。これをインストールすることで簡単にIPアドレスの冗長環境ができます。

インストール

インストールは簡単でパッケージでインストールできます。

# pkg install vrrp

OpenSolaris b134とはパッケージ名が変更になっています。b134だと

# pkg install SUNWvrrp

です。

環境と設定値

今回の環境はPowerEdge1950です。BroadcomNICです(bnx)。ドライバも対応しているので問題なくOpenIndianaはインストールできます。
設定内容は以下で行ないます。

  routerA routerB
物理NIC bnx1 bnx1
仮想NIC vnic1 vnic1
物理NICIPアドレス 10.1.255.101/24 10.1.255.102/24
Priority 255 100

設定してみる

以下のリンクを参考にしました。

以下はrootで設定を行っています。物理NICはplumbされてない状態です。

ルータAの設定(MASTER)

サーバAのbnx1に仮想NICを作成。

root@routerA:~# dladm create-vnic -m vrrp -V 100 -A inet -l bnx1 vnic1
  • -V
    • VRIDの指定
  • -A
  • -l
    • 仮想NICをバインドさせる物理NIC
  • 最後は仮想NIC名。ここではvnic1。

確認

root@routerA:~# dladm show-vnic
LINK         OVER         SPEED  MACADDRESS        MACADDRTYPE         VID
vnic1        bnx1         1000   0:0:5e:0:1:64     vrrp, 100/inet      0


次にルータの作成。

root@routerA:~# vrrpadm create-router -V 100 -A inet -p 255 -l bnx1 vrrp1
  • -V
    • VRID。仮想NICのものと同じにする。
  • -A
  • -p
    • Priority(優先度)。1〜255まで。デフォルト255。後述。
  • -l
    • 仮想NICのものと同じにする。
  • 最後はVRRPルータ名。ここではvrrp1。

確認

root@routerA:~# vrrpadm show-router vrrp1
NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 255  1000     eopa- INIT  vnic1


VNICにIPアドレスの設定

root@routerA:~# ifconfig vnic1 plumb 10.1.255.100/24

再起動しても有効になるように

root@routerA:~# echo 10.1.255.100 netmask 255.255.255.0 > /etc/hostname.vnic1

物理NICIPアドレス設定

root@routerA:~# ifconfig bnx1 plumb 10.1.255.101/24 up

再起動しても有効になるように

root@routerA:~# echo 10.1.255.101 netmask 255.255.255.0 > /etc/hostname.bnx1

確認

root@routerA:~# vrrpadm show-router vrrp1
NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 200  1000     eopa- MASTER vnic1

StateがMASTERになって起動してるのがわかります。

-xで追加の情報が確認できます。

root@routerA:~# vrrpadm show-router -x
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   MASTER BACKUP     6m 9s  vnic1   10.1.255.101        10.1.255.100
ルータBの設定

bnx1に仮想NIC作成と確認。

root@routerB:~# dladm create-vnic -m vrrp -V 100 -A inet -l bnx1 vnic1
root@routerB:~# dladm show-vnic
LINK         OVER         SPEED  MACADDRESS        MACADDRTYPE         VID
vnic1        bnx1         1000   0:0:5e:0:1:64     vrrp, 100/inet      0

VRRPの設定と確認。

root@routerB:~# vrrpadm create-router -V 100 -A inet -p 100 -l bnx1 vrrp1
root@routerB:~# vrrpadm show-router vrrp1
NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- INIT  vnic1

VNICにIPアドレスの設定

root@routerB:~# ifconfig vnic1 plumb 10.1.255.100/24

再起動しても有効になるように

root@routerB:~# echo 10.1.255.100 netmask 255.255.255.0 > /etc/hostname.vnic1

物理NICIPアドレス設定

root@routerB:~# ifconfig bnx1 plumb 10.1.255.102/24 up

再起動しても有効になるように

root@routerB:~# echo 10.1.255.102 netmask 255.255.255.0 > /etc/hostname.bnx1

確認

root@routerB:~# vrrpadm show-router vrrp1
NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- BACKUP vnic1
root@routerB:~# vrrpadm show-router vrrp1 -x
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   BACKUP INIT       2m 2s  vnic1   10.1.255.102        10.1.255.100

STATEがBACKUPになってます。

いろいろ遊んでみる

MASTERの停止

こいつで1秒ごとにBACKUP側で設定を確認しながらMASTERの停止。Linuxwatchコマンドに該当するもがよくわからないから代用。

# while true;do vrrpadm show-router vrrp1;vrrpadm show-router -x vrrp1;echo;sleep 1; done

出力

NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- BACKUP vnic1
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   BACKUP INIT      13m 5s  vnic1   10.1.255.102        10.1.255.100

NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- BACKUP vnic1
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   BACKUP INIT      13m 6s  vnic1   10.1.255.102        10.1.255.100

NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- MASTER vnic1
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   MASTER BACKUP     0.288s vnic1   10.1.255.102        10.1.255.100       ←ここでSTATEがMASTERに切り替わる

NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 100  1000     e-pa- MASTER vnic1
NAME    STATE PRV_STAT STAT_LAST VNIC    PRIMARY_IP          VIRTUAL_IPS
vrrp1   MASTER BACKUP     1.296s vnic1   10.1.255.102        10.1.255.100

pingを打ちながら確認すると落ちた瞬間一瞬応答がつまりますが、すぐに切り替わります。このダウンとみなす時間はvrrpadm modify-routerコマンドで設定できます。詳しいオプションの設定などはmanみるか先述のリンク先を参照してください。

デフォルトの設定ではpreemptモードが有効になっているので、元MASTERが復帰した場合再度MASTERになります。再起動すると切り替わりがわかります。

preemptモードと優先度の調整

preemptモードを無効にすると元MASTERが復帰してもそのままBACKUP側に待機するようにできます。以下を両方のルータで実行します。

# vrrpadm modify-router -o un_preempt vrrp1

確認するとMODEのところからpが消えてます。その他の詳細はmanで参照してください。

# vrrpadm show-router vrrp1
NAME    VRID LINK    AF   PRIO ADV_INTV MODE  STATE VNIC
vrrp1   100  bnx1    IPv4 255  1000     eo-a- MASTER vnic1

しかしこのままではやはり再起動すると元MASTERがMASTERを奪取します。これはPriorityが関係しています。255のPriorityはVRRPの仕様では特別、これがセットされたルータがいる場合はpreemptが常に有効になるようです。元MASTERをBACKUPで待機させたままにするにはこの値を255以外にする必要があります。
以下のコマンドを255の設定されたルータで実行します。

root@routerA:~# vrrpadm modify-router -p 200 vrrp1

これで稼働中のサーバがMASTERの状態をキープします。

まとめとか

とりあえずこんな感じでいじってみました。で、そもそもなんでVRRPに興味をもったかというところですが、ストレージの冗長化で使えないかなと思ったからです。COMSTARでiSCSIストレージを使っていますが、ここに集約されるとこのストレージが死んだときにすべて死んでしまいます。なのでそこの冗長化をどうすればいいかと考えていたときにVRRPにいきあたりました。

Linuxだとkeepalivedやheartbeatが使えるんですが、試したところうまくインストールできなくて困っていたわけです。iSCSIの経路自体はマルチパスやリンクアグリゲーションで可能なんですが、ストレージ本体はどうするか。クラスタソフト使えよとかハードウェアレベルで解決しろとか色々あるかと思いますが、COMSTARと組み合わせてなんとかできないかなーという思いつきです。ただkeepalivedとかみたいに設定されてないNICのダウンを検知して切り替わるみたいなことはできないっぽいんで、このあたりは問題あるかなーとは思いますが。

もうちょい色々いじってうまく動きそうならエントリにしてみようというところです。