2013年2月18日月曜日

keepalived で負荷分散 - 2. keepalivedの設定

keepalived で負荷分散 - 1. IPVSとkeepalivedのインストールの続きです。
以下は、keepalivedのサンプルconfファイルを参考に、2台のHTTP Webサーバにトラフィックを分散させる例です。
keepalived自体を冗長化する設定は、keepalivedで負荷分散 -3.keepalivedの冗長化に書きました。

1. 想定するネットワーク図

keepalivedを運用するサーバには、eth0に192.168.1.99の仮想IPを割り当てます。(この割り当ては後述のkeepalived.confで設定)eth1は、10.1.1.1を設定します。(この設定は手動で。)
192.168.1.99のHTTP 80ポートへのアクセスを、リアルサーバの10.1.1.10のHTTP 80ポート、10.1.1.11のHTTP 80ポートに振り分けます。

2. リアルサーバ1,2のdefault gatewayの設定

リアルサーバ1,2のdefault gatewayをkeepalivedサーバにするための設定。
$ sudo /sbin/route add default gw 10.1.1.1
netstat -arを実行し、 10.1.1.1のみがdefault gatewayに設定されていること確認する。
$ netstat -ar

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
***.**.**.***   *               255.255.255.192 U         0 0          0 eth0
10.1.1.0        *               255.255.255.0   U         0 0          0 eth1
169.254.0.0     *               255.255.0.0     U         0 0          0 eth1
default         10.1.1.1        0.0.0.0         UG        0 0          0 eth1
OS起動時にこの設定が有効になるよう、/etc/rc.local に記述する。
$ sudo vi /etc/rc.local
/etc/rc.local
/sbin/route add default gw 10.1.1.1

2. keepalived.confの作成

/usr/local/keepalived/etc/keepalived/samples/ 以下に用意されているサンプルファイルのなかから、keepalived.conf.sampleをコピーします。
# cp -dpR /usr/local/keepalived/etc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf

■ keepalived.confの編集

vrrp_instance VI_1 {
    interface eth0
    virtual_router_id 50
    nopreempt
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.1.99
    }
}

virtual_server 192.168.1.99 80 {
    delay_loop 6
    lb_algo lc
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.1.98 80

    real_server 10.1.1.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.htmld
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 10.1.1.11 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

3. keepalivedの起動

サービスの起動
# /etc/init.d/keepalived start

■ 振り分け状況の確認

# /sbin/ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.99:80 lc persistent 50
  -> 10.1.1.10:80                 Masq    1      0          0
  -> 10.1.1.11:80                 Masq    1      0          0

4. keepalivedの設定

keepalived.confに設定するパラメータ名と意味
delay_loop設定された間隔[秒]で、real_server{}に設定された内容にしたがってリアルサーバを監視する。
lb_algoスケジューリングアルゴリズム。コネクション数やweight(重み付け)を考慮した分散が行われる。
スケジューリングアルゴリズムで指定できる値は以下のとおり。
rr(round-robin)リアルサーバを設定順に順番に選択していく。すべてのサーバに均等に処理が分散される。
wrr(weight round-robin)rrの設定に重みを加味しながら分散比率を変える。重みが大きなサーバほど頻繁に選択される。処理能力が高いサーバほど重みを大きくする。
lc(least-connection)コネクション数が一番少ないサーバを選択する。
wlc(weighted least-connection)lcと同じだが、重みを加味する。具体的には「(コネクション数 + 1) / 重み」が最小となるサーバを選択する。処理能力が高いサーバほど重みを大きくする。
sed(shortest expected delay)もっとも応答速度が速いサーバを選択する。ただし、サーバにパケットを飛ばして応答時間を計測していいるわけではない。ステートがESTABLISHEDなコネクション数が一番少ないサーバを選択する。wlcとほとんど同じ動作になるが、wlcではESTABLISHED以外のステート(TIME_WAITやFIN_WAITなど)のコネクション数を加算している点が異なる。
nq(never queue)sedと同じアルゴリズムだが、ステートがESTABLISHEDなコネクション数が0のサーバを最優先で選択する。
sh(source hashing)送信元IPアドレスがからハッシュ値を計算して分散先のリアルサーバを選択する。
dh(destination hashing宛先IPアドレスがからハッシュ値を計算して分散先のリアルサーバを選択する。
lblc(locality-based least-connection)コネクション数が重みで指定した値を超えるまでは、同じサーバを選択する。コネクション数が重みで指定した値を超えた場合は別なサーバを選択する。すべてのサーバのコネクション数が重みで指定した値を超えている場合は、最後に選択したサーバが選択され続ける。
lblcr(locality-based least-connection with replication)lblcとほとんど同じだが、すべてのサーバのコネクション数が重みで指定した値を超えている場合は、コネクション数が一番少ないサーバが選択される。
ヘルスチェックに指定できる値は以下のとおり。
HTTP_GETHTTPでGETリクエストを発行して応答を確認する。
SSL_GETHTTPSでGETリクエストを発行して応答を確認する。
TCP_CHECKTCPで接続できるかどうかを確認する。
SMTP_CHECKSMTPでHELOコマンドを発行して応答を確認する。
MISC_CHECK外部コマンドを実行して終了コードを確認する。

5. 必要であれば

リアルサーバ1,2からの通信をkeepalivedサーバ経由でインターネット側に通す必要がある場合。以下の設定を行う。
リアルサーバと接続されたネットワークインターフェイスがeth1であり、そのIPアドレスが10.1.1.1とする。
$ sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo /etc/init.d/iptables save
OS起動時にこの設定が有効になるよう、/etc/rc.local に記述する。
$ sudo vi /etc/rc.local
/etc/rc.local
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/etc/init.d/iptables save
もしくは、すでにiptablesの設定を行っていればそこに追記する。