3-6-LVS實現企業負載均衡高級應用配置實戰

回顧:
lvs:四層交換或四層路由器;
lvs-type:
nat/dr/tun(ipip)/fullnat
nat/fullnat:請求和響應都經由director;
nat:僅修改請求報文的目標IP和端口
fullnat:修改請求報文的源和目標IP,目標端口(源端口最好不改)
dr/tun:僅請求報文經由director
dr:dip所屬的網絡接口與各RS的RIP所屬的網絡接口要在同一個物理網絡;
tun:從新封裝,跨路由
lvs-scheduler:
靜態算法:僅根據算法進行調度,適用於短連接
rr/wrr/sh/dh
動態算法:根據算法和後端服務器負載進行調度
lc/wlc/sed/nq,lblc/lblcr一般適用於正向代理的使用場景
nat:多目標的Dnat,最容易實現html

注意:若是每一個RS上安裝了web服務和telnet服務,能夠基於web來調度,也能夠基於telnet來調度,能夠分開進行調度
有時候監聽的端口不一樣不表明是不一樣的服務,例如80,443一個是http,一個是https,這是同一種服務
有時候訪問的url必須使用https服務,(會話綁定會怎樣?)有時候nginx還能夠改寫http請求爲https,意味着客戶端要從新發起請求了,還有可能若是作了會話黏性,http一臺主機,https一臺主機,普通頁面能夠訪問http,登錄頁面要訪問https,這時候就會訪問不到資源linux

把多個服務端口綁定爲一個服務,基於防火牆標記來定義,讓lvs識別爲同一種服務,
也就是說基於iptables規則先把流量歸爲一類(打標記),而後根據防火牆標記來進行調度
在prerouting上作統一標記,input上根據標記來調度,哪一個標記調度到哪裏nginx

接下來演示將多個服務統一調度:
視頻中機器重啓了,配置就丟了,rs先配置vip地址,而後設置內核參數,測試vip,ping不通而後directory配置vip,就能ping通web

視頻中機器重啓了,配置丟了
directory:192.16.0.6
ifconfig eno16777736:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置vip
ifconfig---查看ip配置好沒有
這時能夠ping通,由於ping的是directory算法

RS1:172.16.0.7
bash -x setparam.sh start
ifconifg
scp setparam.sh 172.16.0.8:/root/
而後ping vip172.16.0.99不通,由於directory尚未配置,上邊的directory vip配置vim

systemctl start httpd.service後端

RS2:172.16.0.8
bash -x setparam.sh start
ifconifg緩存

systemctl start httpd.servicebash

這裏使用sh模型來演示,之前講過不一樣服務怎麼調度,這裏就不演示了
http可使用httpd服務,可是https須要配置證書的,兩臺機器可使用相同的證書,私鑰也是同一個,https很貴又很慢,意味着每次會話請求要使用更多的資源,爲了加速,使用會話緩存。
ssl服務創建後,在服務端會有緩存機制,默認會話緩存5分鐘,有兩種邏輯,一、每個worker進程有本身的私有緩存(有問題,被調度後會話到另外一個server上了),二、多個worker可使用共享緩存
使用同一個證書就能夠緩存了,可是會出現1的問題,因此只能會話綁定,可是又違反負載均衡規則,因此,
能夠這麼作,用戶請求到達調度器是ssl會話,調度器和server之間就不是ssl了,不過這是lvs作不到的,lvs只能讓rs都配置證書,nginx可讓nginx本身安裝證書,rs不須要,nginx前還可使用lvs進行四層調度。靈活運用!!!服務器

把lvs:director看成調度器和CA
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)---建立私鑰
req -new -x509 -key private/cakey.pem -out cacert.pem -days 365---生成自簽證書,會要求輸入證書的內容,時間是1年
Country Name:CN
State or Province Name:Beijing
Locality Name:Beijing
Organization Name:MageEdu
Organizational Unit Name:devops
Common Name:ca.ilinux.io

touch index.txt
echo 01 > serial

本機或者後端RS均可以生成私鑰和證書請求,只要複製給其餘主機就能夠,視頻中仍然是在本機設置
openssl genrsa -out httpd.key 2048---生成私鑰
chmod 600 httpd.key---修改權限
openssl req -new -key httpd.key -out httpd.csr---會要求輸入證書的內容
Country Name:CN
State or Province Name:Beijing
Locality Name:Beijing
Organization Name:MageEdu
Organizational Unit Name:devops
Common Name:www.ilinux.io---必定是解析成vip地址時的域名

openssl ca -in httpd.csr -out httpd.crt -days 365
把crt和key證書和私鑰複製給rs
scp -p httpd.crt httpd.key 172.16.0.7:/etc/httpd/conf.d/
scp -p httpd.crt httpd.key 172.16.0.8:/etc/httpd/conf.d/

RS1:
172.16.0.7---就能夠配置ssl了
yum -y install mod_ssl---安裝模塊
vim /etc/httpd/conf.d/ssl.conf---作以下修改:
DocumentRoot 「/var/www/html」---把註釋去掉
ServerName www.ilinux.io---修改成本身的主機名
SSLCertificateFile /etc/httpd/conf.d/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/httpd.key
httpd -t檢查下語法
systemctl restart httpd.service
ss -tnl---能夠看到80、443就能夠
scp ssl.conf 172.16.0.8:/etc/httpd/conf.d/
而後172.16.0.8就能夠直接重啓服務了
systemctl restart httpd.service
ss -tnl---能夠看到80、443就能夠

CURL能夠指明使用哪一個協議使用哪一個證書來訪問,若是要驗證客戶端發過來的證書,要指明本身的ca證書,
curl --cacert /etc/pki/CA/cacert.pem https://172.16.0.7---這裏會有問題,沒有作域名
vim /etc/hosts---添加下面一行
172.16.0.7 www.ilinux.io

證實能夠訪問了,就須要把兩個服務打包成一個了
在172.16.0.6上作
iptables -F---先清空全部的規則
iptables -t mangle -vnL---查看現有的規則
iptables -t mangle -A PREROUTING -d 172.16.0.99 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3
iptables -t mangle -vnL---查看現有的規則

ipvsadm -A -f 3 -s sh---f表示防火牆標記爲3的流量,sh是調度方法
ipvsadm -a -f 3 -r 172.16.0.7 -g---r是realserver的意思
ipvsadm -a -f 3 -r 172.16.0.8 -g---r是realserver的意思
ipvsadm -ln---查看ipvs的規則列表

而後在一個客戶端:這是測試客戶端
vim /etc/hosts---添加下列一行
172.16.0.99 www.ilinux.io

curl http://www.ilinux.io/test1.html
屢次請求能夠看到始終訪問的是rs1,由於使用的sh算法

在172.16.0.6上
scp /etc/pki/CA/cacert.pem 172.16.0.67:/root/---放到客戶端上
客戶端上再次請求
curl --cacert /root/cacert.pem https://www.ilinux.io/test1.html
屢次訪問能夠看到,仍然是綁定在rs1上,由於是用了sh算法

172.16.0.6上
ipvsadm -E -f 3 -s rr---更換調度方法爲rr輪詢
ipvsadm-save > /etc/sysconfig/ipvsadm
iptables-save > /etc/sysconfig/iptables

在客戶端上
for i in {1..10}; do curl http://www.ilinux.io/test1.html;curl --cacert /root/cacert.pem https://www.ilinux.io/test1.html;done
這是一個循環,能夠看到是輪詢調度的

注意:sh算法是根據源地址和hash來進行綁定,可是綁定多長時間呢?不知道

視頻中的課件:
FWM:FireWall Mark
netfilter:
target:MARK,This target is used to set the Netfilter mark value assoclated with the packet.
--set-mark value
藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度;

打標記方法(在Director主機):
        #iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
    基於標記定義集羣服務:
        #ipvsadm -A -f NUMBER[options]
lvs persistence:持久鏈接---脫離於算法,不管用什麼算法都是持久的
    持久鏈接模板:實現不管使用任何調度算法,在一段時間內,可以實現未來自同一個地址的請求始終發往同一個RS;
        ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]]
    port Affinity:
        每端口持久:每一個端口對應定義爲一個集羣服務,每集羣服務單獨調度;
        每防火牆標記持久:基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity;
        每客戶端持久:基於0端口定義集羣服務,即將客戶端對應全部應用的請求通通調度至後端主機,必須定義爲持久模式;

保存及重載規則:
    保存:建議保存至/etc/sysconfig/ipvsadm
        ipvsadm-save > /PATH/TO/IPVASDM_FILE
        ipvsadm -S > /PATH/TO/IPVSADM_FILE
        systemctl stop ipvsadm.service

    重載:
        ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
        ipvsadm -R > /PATH/FROM/IPVSADM_FILE
        systemctl restart ipvsadm.service
考慮:
    (1)Director不可用,整個系統將不可用;SPoF
        解決方案:高可用
            keepalived
            heartbeat/corosync
    (2)某RS不可用時,Director依然會調度請求至此RS;
        解決方案:對各RS的健康狀態作檢查,失敗時禁用,成功時啓用;
            keepalived
            heartbeat/corosync,idirectord

注意:ipvsadm -A -t 172.16.0.99:0 -s rr -p---不加-p選項會報錯,必須加,0表示通配,全部的服務都做爲一個集羣服務ipvsadm -a -t 172.16.0.99:0 -r 172.16.0.7 -gipvsadm -a -t 172.16.0.99:0 -r 172.16.0.8 -gipvsadm -ln而後客戶端繼續使用for循環仍然能夠看到是綁定在一臺主機上的,由於使用了持久連接。

相關文章
相關標籤/搜索