一、lvs-nat
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器。是由章文嵩博士開發的一個在內核層面的負載均衡調度器。
lvs是在netfilter的INPUT鏈上根據我們制定的調度規則將特定目標地址和端口的數據包轉發到後面的特定主機的,由於是工作於內核空間,所以工作效率高,經過優化最高可達400萬的併發量調度。
lvs的實現需要兩部分:ipvs, ipvsadm
ipvs是協議規則,ipvsadm是實現ipvs的工具,跟iptables具有極高的相似性。
定義規則時,需要先定義集羣服務是什麼,然後在定義調度方法。
lvs的類型有四種:lvs-nat,lvs-dr,lvs-tun,lvs-fullnat。受限於物理設備狀況,本次試驗只做lvs-nat的lvs測試。拓撲結構如下:
選擇了lvs類型後,還需要選擇lvs的scheduler調度法則。調度法則有多種:
RR: round-robin, 輪詢;輪叫、輪調、輪流;
WRR:weighted round-robin, 加權輪詢;
SH:Source ip Hashing,源地址哈希;把來自同一個地址請求,統統定向至此前選定的RS;
DH:Destination ip Hashing, 目標地址哈希;把訪問同一個目標地址的請求,統統定向至此前選定的某RS;
LC: least connection
Overhead=Active*256+Inactive,overhead值越小的越優先被訪問
WLC: weighted least connection
Overhead=(Active*256+Inactive)/weight,overhead值越小的越優先被訪問
SED:Shorted Expection Delay
Overhead=(Active+1)*256/weight,overhead值越小的越優先被訪問
NQ:Never Queue
LBLC:Local-Based Least Connection,動態方式的DH算法;
LBLCR:Replicated LBLC
最常用的也是默認的調度法則是wlc。
二、lvs-nat的實現
(一)、物理基礎網絡架設:
1、添加虛擬網絡
設置vmnet2的網絡,只要將IP的前兩段設置跟RS主機的一樣,掩碼也設爲255.255.0.0,保證跟兩臺RS主機及調度器主機的一個內網網卡eth0在同一個網絡中就可以,IP的第三段和第四段隨便填
2、內網三臺主機(調度器DIRECTOR、RS1、RS2)的網絡設置
設置好網絡
其中作爲調度器DIRECTOR的主機需要有兩個網卡,一個連接外網,一個連接內網
設置如下:
Director
eth1:192.168.10.100/24 網卡設置爲橋接模式
eth0:172.16.20.150/16 網卡設置爲vmnet2 僅主機模式
RS1:
eth0:172.16.20.100/16 網卡設置爲vmnet2 僅主機模式
RS2:
eth0:172.16.20.1/16 網卡設置爲vmnet2 僅主機模式
3、打開調度器的ip轉發功能:
[root@kingdom Desktop]# cat /proc/sys/net/ipv4/ip_forward 0 [root@kingdom Desktop]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@kingdom Desktop]# cat /proc/sys/net/ipv4/ip_forward 1
4、測試網絡聯通情況
調度器DIRECTOR ping兩個RS:
[root@kingdom Desktop]# ping 172.16.20.1 PING 172.16.20.1 (172.16.20.1) 56(84) bytes of data. 64 bytes from 172.16.20.1: icmp_seq=1 ttl=64 time=1.53 ms …… [root@kingdom Desktop]# ping -c 1 172.16.20.100 PING 172.16.20.100 (172.16.20.100) 56(84) bytes of data. 64 bytes from 172.16.20.100: icmp_seq=1 ttl=64 time=0.347 ms --- 172.16.20.100 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.347/0.347/0.347/0.000 ms
兩個RS ping另一臺虛擬主機及調度器的內網網卡,這時是能ping同的,但量臺RS虛擬主機沒有ping通調度器的外網網卡。
5、查看調度器lvs協議狀況
由於centos6已經內嵌了lvs,所以我們現在可以很幸福地不用自己將lvs編譯進內核了
# grep -i -A 5 "ipvs" /boot/config-2.6.32-504.el6.x86_64 # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y -- # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m -- # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_PE_SIP=m #
(二)、RS虛擬主機網頁服務配置
1、在RS虛擬主機上配置虛擬主機的web服務。
最簡單的就是yum安裝一個httpd,然後修改配置文件,設置好默認主頁:
[root@aunt-s Desktop]# yum install -y httpd [root@aunt-s Desktop]# which httpd /usr/sbin/httpd [root@aunt-s Desktop]# rpm -q httpd httpd-2.2.15-39.el6.centos.x86_64 [root@aunt-s conf]# vim /etc/httpd/conf/httpd.conf Listen 80 KeepAlive On DocumentRoot "/var/www/html"
RS1設置主頁:
[root@aunt-s conf]# vim /var/www/html/index.html <h1>Page Test on RS1</h1> <h2>aaaaaaaaaaaaaaaa</h2>
RS2設置主頁:
# vim /var/www/html/index.html <h1>Page Test on RS2</h1> <h2>2222222222222222</h2>
2、啓動RS1和RS2的web服務:
# service httpd start Starting httpd: [ OK ] # ss -tunlp | grep httpd tcp LISTEN 0 128 :::80 :::* users:(("httpd",14906,4),("httpd",14909,4),("httpd",14910,4),("httpd",14911,4),("httpd",14912,4),("httpd",14913,4),("httpd",14914,4),("httpd",14915,4),("httpd",14916,4))
3、相關設置:
保證iptables對web服務是放行的:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
本次實驗是直接沒有設置iptables規則,如果原來設置了規則,需要調整一下,放行tcp80端口,源ip爲調度器的內網網卡。
保證selinux對web服務是放行的:
[root@www Desktop]# getenforce Permissive
本次實驗用的selinux是permissive。
3、測試web服務都能取得相應的網頁,服務開通成功。
[root@aunt-s conf]# curl http://172.16.20.100 <h1>Page Test on RS1</h1> <h2>aaaaaaaaaaaaaaaa</h2> [root@aunt-s conf]# curl http://172.16.20.1 <h1>Page Test on RS2</h1> <h2>2222222222222222</h2>
(三)、調度器ipvs及相關設置
1、安裝ipvsadm
# yum install -y ipvsadm …… Installed: ipvsadm.x86_64 0:1.26-4.el6 Complete!
由於網絡設置問題,可能需要事先安裝好再做上面的網絡配置。自己本次試驗由於內網是用的172.16網段,外網用的是192.168.10網段,與教室環境不在同一個網絡,所以,是先將外網網卡IP及路由都修改後安裝程序包的,安裝完後再修改回去:
# route add -host 172.16.0.1 gw 172.16.0.1 dev eth1 # yum install -y ipvsadm # route del -host 172.16.0.1 gw 172.16.0.1 dev eth1 # ifconfig eth1 192.168.10.100/24
2、設置DIRECTOR的lvs規則:
確定iptables和selinux不會對試驗造成障礙:
[root@kingdom Desktop]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@kingdom Desktop]# getenforce Disabled
先定義web集羣服務,再定義調度規則。
由於本次試驗的網絡拓撲結構爲nat型,所以,lvs類型只能選擇-m。但調度策略scheduler是可以任選的。
[root@kingdom Desktop]# ipvsadm -A -t 192.168.10.100:80 -s rr [root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:80 -r 172.16.20.100:80 -m -w 3 [root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:80 -r 172.16.20.1:80 -m -w 1 [root@kingdom Desktop]# 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.10.100:80 rr -> 172.16.20.1:80 Masq 1 0 0 -> 172.16.20.100:80 Masq 3 0 0 [root@kingdom Desktop]#
(四)、web服務測試
1、設置物理主機的網絡,以便能直接通過物理主機上的瀏覽器打開RS的web主頁:
由於我們的虛擬機都是自己私設的ip地址,所以,要使物理主機能直接訪問到,就應該讓物理主機的IPv4與調度器主機DIRECTOR的外網網卡在同一網段中,也即是192.168.10網段中。
沒有修改物理主機網段時,在物理主機上(windows的cmd窗口)是ping不同調度器外網網卡的:
設置好後可以ping調度器了,但是ping不同內網任何一個網卡:
2、測試web服務
在調度器上測試有沒有web服務:
[root@kingdom Desktop]# ss -tnlp | grep httpd [root@kingdom Desktop]#
結果是沒有。
然後通過物理主機(windows)的瀏覽器打開調度器DIRECTOR的外網網卡:
然後在DIRECTOR上都能打開內網RS的網頁:
[root@kingdom Desktop]# curl http://172.16.20.1 <h1>Page Test on RS2</h1> <h2>2222222222222222</h2> [root@kingdom Desktop]# curl http://172.16.20.100 <h1>Page Test on RS1</h1> <h2>aaaaaaaaaaaaaaaa</h2>
猜測原因:本次構建的網絡是lvs-nat,RS沒有將網關指向調度器DIRECTOR,在RS上抓包結果如下
給兩個RS添加網關,指向DIRECTOR:
# route add default gw 172.16.20.150 dev eth0
3、將lvs scheduler設置爲wlc 測試效果
先修改調度器DIRECTOR對web服務的調度規則:
[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s wlc [root@kingdom Desktop]# 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.10.100:80 wlc -> 172.16.20.1:80 Masq 1 0 3 -> 172.16.20.100:80 Masq 3 0 3 [root@kingdom Desktop]#
提供第四臺虛擬機,其網絡設置爲:
網絡適配器選擇爲橋接模式;
eth0:192.168.10.1/16
清空ipvs的計數器,以便更準確測試wlc策略的調度比值:
# ipvsadm -Z -t 192.168.10.100:80 # ipvsadm -l -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.100:80 0 0 0 0 0 -> 172.16.20.1:80 0 0 0 0 0 -> 172.16.20.100:80 0 0 0 0 0
在虛擬主機四上對調度器做web壓力測試:
# ab -n 5000 -c 100 http://192.168.10.100/index.html
在調度器上查看結果:
[root@kingdom Desktop]# ipvsadm -l -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.100:80 8334 276749 276376 19924288 32466424 -> 172.16.20.1:80 2723 101478 101339 7305856 11905439 -> 172.16.20.100:80 5611 175271 175037 12618432 20560985 [root@kingdom Desktop]# 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.10.100:80 wlc -> 172.16.20.1:80 Masq 1 0 10214 -> 172.16.20.100:80 Masq 3 0 17823
這結果,只能說大致傾向於2:1,這個是動態調度的結果。
4、將scheduler設置爲sh,查看調度效果:
[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s sh [root@kingdom Desktop]# 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.10.100:80 sh -> 172.16.20.1:80 Masq 1 0 0 -> 172.16.20.100:80 Masq 3 0 0 [root@kingdom Desktop]# ipvsadm -Z -t 192.168.10.100:80
在虛擬主機四上對調度器做web壓力測試:
# ab -n 5000 -c 100 http://192.168.10.100/index.html
在調度器上查看結果:
[root@kingdom Desktop]# ipvsadm -l -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.100:80 15134 75724 75184 5445456 8826054 -> 172.16.20.1:80 0 0 0 0 0 -> 172.16.20.100:80 15134 75724 75184 5445456 8826054
測試結果完全符合sh的調度規則(第一次隨機調度到某臺RS,隨後的同IP訪問全部依據第一次的調度進行)。
5、將scheduler修改爲wrr,查看調度效果:
[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s wrr [root@kingdom Desktop]# 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.10.100:80 wrr -> 172.16.20.1:80 Masq 1 0 0 -> 172.16.20.100:80 Masq 3 0 15002 # ipvsadm -Z -t 192.168.10.100:80
在虛擬主機四上對調度器做web壓力測試:
# ab -n 5000 -c 100 http://192.168.10.100/index.html
在調度器上查看結果:
[root@kingdom Desktop]# ipvsadm -l -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.10.100:80 28852 331710 330048 23870364 38780354 -> 172.16.20.1:80 7213 83052 81941 5967600 9626348 -> 172.16.20.100:80 21639 248658 248107 17902764 29154006
從結果可以看出,這次的靜態調度wrr與動態的調度不同,是遵循權重比值3:1的。
(五)、ssh和telnet遠程登錄調度測試
lvs調度是在內核的netfilter的INPUT鏈上調度數據包流向來達到調度目的的,工作位置比較底層,所以只要是需要通過tcp/ip數據包進行通信的服務都可以通過lvs進行調度,如web服務、ssh/telnet遠程登錄、https安全登錄、遠程mysql數據庫管理。
下面驗證ssh和telnet遠程登錄服務的調度。
基礎設置框架跟上面的web一樣,此外,需要在原來做RS的虛擬主機上安裝telnet服務器程序和sshd服務程序,並開啓。
# rpm -q telnet-server telnet-server-0.17-48.el6.x86_64 # chkconfig telnet on # service xinetd start Starting xinetd: # ss -tunlp | grep :23 tcp LISTEN 0 64 :::23 :::* users:(("xinetd",1702,5))
23號端口已處於監聽狀態,telnet服務已開啓。
在調度器主機上設置ipvs:
[root@kingdom Desktop]# ipvsadm -A -t 192.168.10.100:23 -s rr [root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:23 -r 172.16.20.1:23 -m -w 1 [root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:23 -r 172.16.20.100:23 -m -w 1 [root@kingdom Desktop]# 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.10.100:23 rr -> 172.16.20.1:23 Masq 1 0 0 -> 172.16.20.100:23 Masq 1 0 0 TCP 192.168.10.100:80 rr -> 172.16.20.1:80 Masq 1 0 0 -> 172.16.20.100:80 Masq 3 0 0 [root@kingdom Desktop]#
保證RS虛擬主機上有非root用戶能登錄:
從結果可以看出,ipvs是輪詢調度telnet登錄的,一次登錄在RS1上,下一次登錄在RS2上。
其他服務親們可以自行測試。
mysql遠程登錄是需要設置3306/tcp,mysql數據庫需要先授權訪問權限給發起訪問的遠程主機IP。
ssh遠程登錄是需要設置24/tcp