CentOSでロードバランサーを実験してみた

Pocket

実験なのでCentOS 6.3最小構成で構築しました。全部仮想マシンです。
ルーティングが大変だった。もっと勉強しなければ。
ロードバランサー1つ、Webサーバー3つ(うち1つは過負荷時に表示されるページを用意)構成。
クライアントはUbuntu。(特に意味はない)
KLabさんにはお世話になりました。

仮想マシンそのまま複製するとネットに繋がらなくなるので注意が必要です。
仮想マシンCentOSを複製したらネットに繋がらなくなった(eth0が消えた)件について | ユニキャストラボ

導入

keepalivedはデフォルトリポジトリに存在しないので、epelリポジトリ有効にしておきましょう。
よーし、パパ CentOS 6.0 で EPEL リポジトリ使えるようにしちゃうぞー | ユニキャストラボ

インストール。

# yum -y install ipvsadm
# yum -y install keepalived

IPVSのバージョン確認。

# ipvsadm --version
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)

構成

  • クライアント:192.168.10.10
  • ロードバランサー:(VIP)192.168.100.100, (eth0)192.168.10.1, (eth1) 192.168.31.1
  • Webサーバー1,2,3:192.168.31.100, 192.168.31.101, 192.168.31.102(※102がリアルサーバーが落ちた時のサーバー)

Webサーバーのドキュメントルートには死活管理用のhealth.htmlという空ファイルを置いておきます。
また、わかりやすいようにドキュメントルートにサーバーの番号とかを書いたindex.htmlも置いておいたほうがわかりやすいとおもいます。

ロードバランサー側の設定

eth0からeth1に受け流す。

# echo "1" > /proc/sys/net/ipv4/ip_forward ←これ重要
# route add -net 192.168.31.0 gw 192.168.31.1 metric 1 netmask 255.255.255.0 eth1

クライアント側の設定

192.168.31.0/24へのルーティングを設定します。

# route add -net 192.168.31.0 gw 192.168.10.1 metric 1 netmask 255.255.255.0 eth1

これで192.168.31.0/24の各サーバにアクセスできるようになりました。
仮想IPアドレスで負荷分散するんだから必要ないのですが、単独でベンチマークかけた場合との違いを見てみたいと思います。

root@unicast-virtual-machine:~# ab -n 1000 -c 100 'http://192.168.31.100/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.31.100 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.2.15
Server Hostname:        192.168.31.100
Server Port:            80

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      100
Time taken for tests:   0.431 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      278000 bytes
HTML transferred:       12000 bytes
Requests per second:    2319.62 [#/sec] (mean)
Time per request:       43.111 [ms] (mean)
Time per request:       0.431 [ms] (mean, across all concurrent requests)
Transfer rate:          629.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   3.2      1      20
Processing:    11   37   6.7     37      60
Waiting:       11   36   6.6     37      60
Total:         28   39   5.5     39      62

Percentage of the requests served within a certain time (ms)
  50%     39
  66%     40
  75%     42
  80%     43
  90%     46
  95%     48
  98%     51
  99%     52
 100%     62 (longest request)

ロードバランサーを設定する

# service iptables stop
# iptables -t mangle -A PREROUTING -d 192.168.100.100 -j MARK --set-mark 1
# ip rule add prio 100 fwmark 1 table 100
# ip route add local 0/0 dev lo table 100
# service iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[  OK  ]中: 
# service iptables start
iptables: ファイアウォールルールを適用中:                  [  OK  ]

keepalivedの設定

バージョンによって書き方が変わってるみたいで苦労しました。
結果的に以下の設定で動きました。

# keepalived --version
Keepalived v1.2.2 (03/20,2012)

# /etc/keepalived/keepalived.conf
virtual_server 192.168.100.100 80 {
        192.168.100.100 80
}

virtual_server 192.168.100.100 80 {
        delay_loop 3
        lvs_sched rr
        lvs_method NAT
        protocol TCP
        virtualhost example.com
        sorry_server 192.168.31.102
        real_server 192.168.31.100 {
                weight 1
                inhibit_on_failure
                HTTP_GET {
                        url {
                                path /health.html
                                status_code 200
                        }
                        connect_timeout 3
                        connect_port 80
                }
        }
        real_server 192.168.31.101 {
                weight 1
                inhibit_on_failure
                HTTP_GET {
                        url {
                                path /health.html
                                status_code 200
                        }
                        connect_timeout 3
                        connect_port 80
                }
        }


}

keepalived起動

# service ipvsadm start
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
ipvsadm: Clearing the current IPVS table:                  [  OK  ]
ipvsadm: Applying IPVS configuration:                      [  OK  ]
# service keepalived start
keepalived を起動中:                                       [  OK  ]
# chkconfig keepalived on

設定がちゃんと反映されているか確認します。

# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.100:80 rr
  -> 192.168.31.100:0             Masq    1      0          0         
  -> 192.168.31.101:0             Masq    1      0          0         

クライアントから実際に確認してみる

仮想IPへのルーティングを設定する。

# route add -net 192.168.100.0 gw 192.168.10.1 metric 1 netmask 255.255.255.0 eth1

動作確認します。

root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w2</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w1</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w2</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w1</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w2</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w1</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w2</h1>
root@unicast-virtual-machine:~# curl http://192.168.100.100/
<h1>w1</h1>

ラウンドロビンでちゃんと動いているみたいです。
なお、今のままの設定だと192.168.100.100へpingを打っても反応しないみたいです。
さっそくベンチマーク。

root@unicast-virtual-machine:~# ab -n 1000 -c 100 'http://192.168.100.100/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.100.100 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.2.15
Server Hostname:        192.168.100.100
Server Port:            80

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      100
Time taken for tests:   0.367 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      278000 bytes
HTML transferred:       12000 bytes
Requests per second:    2723.27 [#/sec] (mean)
Time per request:       36.721 [ms] (mean)
Time per request:       0.367 [ms] (mean, across all concurrent requests)
Transfer rate:          739.32 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    6   5.9      4      43
Processing:     5   27   9.4     26      48
Waiting:        5   26   9.5     25      47
Total:         11   32   8.8     33      53

Percentage of the requests served within a certain time (ms)
  50%     33
  66%     37
  75%     39
  80%     40
  90%     44
  95%     47
  98%     50
  99%     50
 100%     53 (longest request)

2319.62から2723.27に捌ける件数が上がっていることがわかります。

現在の通信状況を確認する

いじめてみました。

# ab -n 10000000 -c 100 'http://192.168.100.100/' &
# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.100.100:80                377    17347    17350  1217755  1895196
  -> 192.168.31.100:0                  188     8673     8675   608859   947596
  -> 192.168.31.101:0                  188     8674     8675   608895   947600

両方共サーバーをダウンさせたらどうなるか

100と101のサーバのhealth.htmlをchmod -r health.htmlすればそのサーバーはダウンしたものとみなされます。

# curl http://192.168.100.100/
<h1>sorry</h1>

DSRはまた今度・・・ルーティングの勉強したほうがいいなあ。

参考

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください