keepalived で負荷分散 - 1. IPVSとkeepalivedのインストールの続きです。
以下は、keepalivedのサンプルconfファイルを参考に、2台のHTTP Webサーバにトラフィックを分散させる例です。
keepalived自体を冗長化する設定は、keepalivedで負荷分散 -3.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_GET | HTTPでGETリクエストを発行して応答を確認する。 |
SSL_GET | HTTPSでGETリクエストを発行して応答を確認する。 |
TCP_CHECK | TCPで接続できるかどうかを確認する。 |
SMTP_CHECK | SMTPでHELOコマンドを発行して応答を確認する。 |
MISC_CHECK | 外部コマンドを実行して終了コードを確認する。 |
5. 必要であれば
リアルサーバ1,2からの通信をkeepalivedサーバ経由でインターネット側に通す必要がある場合。以下の設定を行う。
リアルサーバと接続されたネットワークインターフェイスがeth1であり、そのIPアドレスが10.1.1.1とする。
リアルサーバと接続されたネットワークインターフェイスが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の設定を行っていればそこに追記する。