天天看點

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配置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

拓撲圖如下

LVS 之 叢集設計
在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

注意:

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模型不能基于端口排程

拓撲圖如下 

LVS 之 叢集設計

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