LVS 之 集群設計
1 概述
負載均衡集群設計時要註意兩點:一是否需要會話保持;二是否需要共享存儲,共享存儲分為NAS,SAN,DS(分布式存儲)
本文結合實驗介紹了lvs-nat,lvs-dr,FWM的實現,同時介紹持久連接的相關配置
2 lvs-nat
設計要點:
(1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP
(2) 支持端口映射
(3) Director要打開核心轉發功能
實驗:VS實現LVS-NAT模式的調度
實驗環境準備:
iptables,selinux,關閉,服務器時間同步。
內網網段:172.18.0.0/16
外網網段:192.168.32.0/24
RS1 和RS2分別開啟httpS服務
client配置
VS配置兩個網卡,分別配置172網段和192網段,eth0 ip 172.18.50.72 eth1 ip 192.168.32.72
RS兩臺配置192網段 RS1 ip:192.168.32.63 RS2 ip: 192.168.32.73
RS1 和RS2的網關要指向 VS 的192.168.32.72
client 網關指向 VS 的 172.18.50.72
拓撲圖如下
在VS上配置如下三條命令
ipvsadm -A -t 172.18.50.72:443 -s rr ipvsadm -a -t 172.18.50.72:443 -r 192.168.32.63:443 -m ipvsadm -a -t172.18.50.72:443 -r 192.168.32.73 -m
如果改規則的時候出現報錯,內存分配問題(Memory allocation problem),解決辦法,清掉規則,全部重新添加
RS上配置https
VS上要啟用路由轉發功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
轉發功能要永久存盤,
centos7寫入/etc/sysctl.d/99-sysctl.conf
vim /etc/sysctl.d/99-sysctl.conf net.ipv4.ip_forward=1
然後重啟網絡後生效
centos6寫入/etc/sysctl.conf文件
/etc/sysctl.conf net.ipv4.ip_forward=1
安裝http和mod_ssl模塊
yum –y install httpd mod_ssl
生成證書
註意,證書可以向CA中心申請,這個案例介紹如何生成自己前面的證書的另一個方法
生成自簽名的證書
cd /etc/pki/tls/certs make http.crt
生成證書http.crt和私有http.key,這裏生成key時需要輸入密碼,這樣每次重啟httpd服務的時候,需要輸入密碼才能成功啟動
去掉證書密碼的命令如下
openssl rsa –in http.key –out http2.key
輸入密碼後可以生成新的
mv http.key http.key.bak mv http2.key http.key
這樣http.key就沒有密碼,重啟http的時候就不需要輸入密碼
配置ssl文件,指定證書和私鑰的路徑
vim /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/conf.d/http.crt SSLCertificateKeyFile /etc/httpd/conf.d/http.key
保存後重啟http服務即可
將生成的私鑰和證書發到另一臺機器上,後端的RS的https服務的key和證書要同一個
後端RS的https服務配置完成後,到此,LVS-NAT配置完成,可以將請求調度到後端的https服務器
測試如下
for i in {1..10};do curl -k https://172.18.50.72;done;
結果為輪詢調度63和73這兩臺RS
3 LVS-DR
dr模型中,各主機上均需要配置VIP,解決地址沖突的方式有三種:
(1) 在前端網關做靜態綁定
(2) 在各RS使用arptables
(3) 在各RS修改內核參數,來限制arp響應和通告的級別
.限制響應級別:arp_ignore,選擇1
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,才給予響應
.限制通告級別:arp_announce,選擇2
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:盡量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
VIP建議配置在lo口上比較合理(雖然可以配置在任意網卡,但是建議配置在lo)
實驗:VS實現LVS-DR模式的調度
環境如下:
五臺機器的ip配置如下
host1-->client: eth1: 172.18.50.65/16
host2-->ROUTER: WAN: eth1:172.18.50.62/16
LAN: eth0:192.168.32.62/24
eth0:1 : 10.10.10.12/24
host3-->VS: eth33:192.168.32.72/24
eth33:1 10.10.10.10/24
host4-->RS1:eth0:192.168.32.63/24
lo:1 10.10.10.10/24
host5-->RS2:eth33:192.168.32.73/24
lo:1 10.10.10.10/24
註意:
RS上取消arp的響應和arp_announce
Router上配置三個ip,開啟路由轉發功能,同時在網卡eth0上配置獨臂路由
VS和RS都配置默認的路由,網關都指向 Router LAN: eth0:192.168.32.62/24
VS和RS添加默認路由命令:route add default gw 192.168.32.62
拓撲圖如下
RS的一鍵配置腳本
#!/bin/bash vip=10.10.10.10 mask=‘255.255.255.0‘ dev=lo:1 rpm -q httpd &> /dev/null || yum -y install httpd&>/dev/null service httpd start &> /dev/null && echo"The httpd Server is Ready!" #echo "<h1>`hostname`</h1>" >/var/www/html/index.html case $1 in start) echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev$vip netmask $mask broadcast $vip up route add -host$vip dev $dev echo "The RSServer is Ready!" ;; stop) ifconfig $devdown echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce echo "The RSServer is Canceled!" ;; *) echo "Usage:$(basename $0) start|stop" exit 1 ;; esac
VS的一鍵配置腳本
#!/bin/bash vip=‘10.10.10.10‘ iface=‘ens33:1‘ mask=‘255.255.255.0‘ port=‘80‘ rs1=‘192.168.32.63‘ rs2=‘192.168.32.73‘ scheduler=‘wrr‘ type=‘-g‘ rpm -q ipvsadm &> /dev/null || yum -y installipvsadm &> /dev/null case $1 in start) ifconfig $iface$vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t${vip}:${port} -s $scheduler ipvsadm -a -t${vip}:${port} -r ${rs1} $type -w 2 ipvsadm -a -t${vip}:${port} -r ${rs2} $type -w 1 echo "The VSServer is Ready!" ;; stop) ipvsadm -C ifconfig $ifacedown echo "The VSServer is Canceled!" ;; *) echo "Usage:$(basename $0) start|stop" exit 1 ;; esac
測試如下
for i in {1..10};do curl http://172.18.50.72;done;
結果為輪詢調度63和73這兩臺RS
註意,以上環境為生產環境的實際配置,如果不用要把VIP也設置為私有ip,如192.168.32.66,那麽在路由器上就不需要多配置一個eth0:1的ip了,路由器上只需要配置兩個ip就可以,其他配置都不變。
4 FireWallMark
.FWM:FireWall Mark
.MARK target 可用於給特定的報文打標記
同一類服務實現統一調度。如http和https,這裏需要加上Mark標記
默認工作模式是dr,默認的調度算法是wlc
--set-mark value
# value是在防火墻的策略上會顯示為16進制數,可以隨便定義,如這裏定義value值是12,但是在防火墻上通過命令iptables –vnL -t mangle 看到的是0xc,是十六進制
.借助於防火墻標記來分類報文,而後基於標記定義集群服務;可將多個不同的應用使用同一個集群服務進行調度
.實現方法:
.在Director主機打標記:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-markNUMBER
LVS上定義如下
.在Director主機基於標記定義集群服務和管理RS:
ipvsadm -A -f NUMBER [options1]
這裏的iptions1可以定義算法,如跟上-s wrr
ipvsadm -a -f NUMBER -r real-server [options2]
這裏的iptions2可以定義集群的類型,如-g表示dr模型
實驗
在vs上配置
iptables -t mangle -A PREROUTING -d 192.168.32.66 -p tcp -m multiport--dports 80,443 -j MARK --set-mark 12 ipvsadm –A -f 12 -s wrr ipvsadm -a -f 12 -r 192.168.32.63 -g -w 3 ipvsadm -a -f 12 -r 192.168.32.73 –g
RS配置可以參考LVS-dr的腳本配置
測試
for i in {1..10};docurl -k https://192.168.32.66;curl http://192.168.32.66;done;
結果是輪詢調度後端RS的http和https服務。
5 持久連接
來自同一個服務的請求盡可能發到同一臺後端的RS上處理。這裏可以實現session綁定
註意LVS的算法,默認只有sh能夠實現根據session來實現調度。其他的調度算法不能實現session綁定。但是sh的第一次是隨機的,不能根據權重調度。
綜合sh和其他算法,用持久連接的技術來實現。這是一個折中的方法。
-p [timeout]這個選項來實現持久連接,默認是360s,和man幫助裏不一樣,man裏是300s,實際默認是360s
.session 綁定:對共享同一組RS的多個集群服務,需要統一進行綁定,lvs sh算法無法實現
.持久連接(lvs persistence )模板:實現無論使用任何調度算法,在一段時間內(默認360s ),能夠實現將來自同一個地址的請求始終發往同一個RS
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
.持久連接實現方式:
.每端口持久(PPC):每個端口對應定義為一個集群服務,每集群服務單獨調度
.每防火墻標記持久(PFWMC):基於防火墻標記定義集群服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity
.每客戶端持久(PCC):基於0端口(表示所有服務)定義集群服務,即將客戶端對所有應用的請求都調度至後端主機,必須定義為持久模式.但是實際生產不這麽定義,因為這樣相當於是把後端的服務都發布到公網了。
例子
ipvsadm -E -f 12 -s wrr -p 20
#這裏的-p後面接數字20表示20秒內,同一客戶端將會被調度到同一服務器上,如果跟數字20,就是默認的360
本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1975813
LVS 之 集群設計