実験なので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はまた今度・・・ルーティングの勉強したほうがいいなあ。
参考
投稿者紹介
-
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。
最近のエントリ
- レポート2019.10.28ユニキャストレストランを開催しました🍳
- レポート2019.08.29社内研修ワークショップ~マシュマロ・チャレンジ~
- レポート2019.08.06Computex/InnoVEX 出展者・通訳として参加してきました。
- レポート2018.06.12Computex 2018 レポート