OpenIndianaでVRRPをいじった
OpenIndianaをやっといじり始めた今日この頃なわけですが、早速VRRPを試してみました。VRRPはOpenSolais b134でも使えたのでその時もさわりで試したことはあるんですが改めていじってみました。OpenSolais 2009.06には実装されていません。
VRRPとは
一応VRRPについて。VRRPはVirtual Router Redundancy Protocolで仮想ルータ冗長プロトコルです。そのまま。
簡単な言い方をすれば、物理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
です。
設定してみる
以下のリンクを参考にしました。
- SUNWvrrp Memo
- [twitter:@ipv6labs]さんのメモ。わかりやすいです。オプションの解説もあるので一度はみるべし。
- VRRP Configuration Example - OpenSolaris Information Resources - wikis.sun.com
- OpenSolaisのwiki。設定例ページ。
- vrrpadm(1M) – VRRP administration tool
- vrrpadmのコマンド
以下はrootで設定を行っています。物理NICはplumbされてない状態です。
ルータAの設定(MASTER)
サーバAのbnx1に仮想NICを作成。
root@routerA:~# dladm create-vnic -m vrrp -V 100 -A inet -l bnx1 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
- IPv4なのでinet
- -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
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
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の停止。Linuxのwatchコマンドに該当するもがよくわからないから代用。
# 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のダウンを検知して切り替わるみたいなことはできないっぽいんで、このあたりは問題あるかなーとは思いますが。
もうちょい色々いじってうまく動きそうならエントリにしてみようというところです。