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配置172網段ip:172.18.50.65
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
拓撲圖如下

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
注意:
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
DR模型不能基于端口排程
拓撲圖如下
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;
注意,以上環境為生産環境的實際配置,如果不用要把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