LVS跨網段DR模式並使用ldirectord實現RS高可用性

DR模型的工做過程:

Client向VIP發起請求,請求被路由器接收到,轉發給不一樣網段的Director的VIP,Director再經過私有網絡轉給RS服務器,RS服務器處理請求並經過自身配置的VIP直接將響應發給Client.html


要點:

關鍵點是在集羣內部,Director和RS服務器都要配置相同的VIP,這就要解決IP衝突的問題,有三種方法:vim

        1,在路由器中綁定Director的MAC與VIP,各RS還要添加arptables拒絕網絡通告bash

        2,在RS中使用arptables解決服務器

        3,RS服務器對於路由器發起尋找VIP的廣播不予迴應,修改內核參數便可.網絡

每臺主機只需一塊網卡,並處於同一個物理網絡,請求到達Director以後會把報文從新封裝目標MAC爲選擇的其中一臺RS,這樣就能夠把報文發送給這臺RS來響應.架構

全部RS經過修改內核參數屏蔽arp通告.把VIP配置在lo:0這個別名上,再添加入棧路由,讓報文通過lo:0,這樣報文出棧時,源IP才能改爲VIP.curl

請求報文通過Director,響應報文不通過Director,RS網關只能指向路由器,不能指向DIP,沒法實現端口映射.工具


實驗環境:

假設:測試

Client網絡爲172.18.7.0ui

服務器公網:10.0.0.0

服務器內網(主機模式):192.168.7.0


準備五臺CentOS 7虛擬機,

Director:

一塊網卡,僅主機模式

VIP:10.0.0.100

網關:10.0.0.200 實際上隨意填一個網關均可以.由於並不真的須要使用這個網關,可是不寫又不行.

DIP:192.168.7.30

網關:192.168.7.200


RS1:

一塊網卡,僅主機模式

RIP:192.168.7.10

網關:192.168.7.200

VIP:10.0.0.100


RS1:

一塊網卡,僅主機模式

RIP:192.168.7.20

網關:192.168.7.200

VIP:10.0.0.100

網關:10.0.0.200


Router:

兩塊網卡,ens33橋接,ens37僅主機模式,不須要網關

公網IP(ens33):172.18.7.200

內網IP1(ens37):192.168.7.200

模擬另外一公網網關IP(ens37:1):10.0.0.200


Client:

一塊網卡,橋接

CIP:172.18.7.70

網關:172.18.0.1


配置Router:

Router須要兩塊網卡,ens33和ens37


ens33:

配置地址172.18.7.200,因爲是路由器,因此不須要網關

]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=172.18.7.200
PREFIX=16


ens37:

配置地址192.168.7.200和10.0.0.200

]# cd /etc/sysconfig/network-scripts/
]# vim ifcfg-ens37
BOOTPROTO="static"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.7.200
PREFIX=24


]# vim ifcfg-ens37:1
BOOTPROTO="static"
DEVICE="ens37:1"
ONBOOT="yes"
IPADDR=10.0.0.200
PREFIX=8


開啓ip地址轉發

]# cat /proc/sys/net/ipv4/ip_forward
]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
]# sysctl -p
net.ipv4.ip_forward = 1
]# cat /proc/sys/net/ipv4/ip_forward
1


這樣可讓RS服務器可以連通Client.

]# systemctl restart network


查看一下

clip_image001


Client:

客戶端ip地址172.18.7.70,網關指向路由器172.18.7.200

]# nmcli connection modify System\ ens33 ipv4.addresses 172.18.7.70/16 ipv4.gateway 172.18.7.200 ipv4.method manual
]# nmcli connection up System\ ens33
]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.7.200 0.0.0.0 UG 100 0 0 ens33
172.18.0.0 0.0.0.0 255.255.0.0 U 100 0 0 ens33


測試ping 另外兩個網段是否通

]# ping 192.168.7.200
PING 192.168.7.200 (192.168.7.200) 56(84) bytes of data.
64 bytes from 192.168.7.200: icmp_seq=1 ttl=64 time=3.31 ms
]# ping 10.0.0.200
PING 10.0.0.200 (10.0.0.200) 56(84) bytes of data.
64 bytes from 10.0.0.200: icmp_seq=1 ttl=64 time=3.47 ms


Director

做爲Director,只須要與RS服務器通信,因爲Director與RS服務器在同網段,因此實際上並不須要配置網關

暫時修改網關爲192.168.7.200

]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.30/24 ipv4.gateway 192.168.7.200 ipv4.method manual
]# nmcli connection up System\ ens33


運行如下腳本.

]# vim lvs_dr_vs.sh
#!/bin/bash
vip='10.0.0.100'
iface='ens33:1'
mask='255.255.255.255'
port='80'
rs1='192.168.7.10'
rs2='192.168.7.20'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /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 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 2
    echo "The VS Server is Ready!"
  ;;
  stop)
    ipvsadm -C
    ifconfig $iface down
    echo "The VS Server is Canceled!"
  ;;
  *)
    echo "Usage: $(basename $0) start|stop"
    exit 1
  ;;
esac


]# bash lvs_dr_vs.sh start

腳本中給ens33:1網卡別名添加了VIP10.0.0.100,而後經過yum安裝了ipvsadm,並添加了規則.


查看.

]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.7.10:80 Route 1 0 0
-> 192.168.7.20:80 Route 2 0 0


RS1

配置ip地址

]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.10/24 ipv4.gateway 192.168.7.200 ipv4.method manual
]# nmcli connection up System\ ens33


測試ping Client

]# ping 172.18.7.70
PING 172.18.7.70 (172.18.7.70) 56(84) bytes of data.
64 bytes from 172.18.7.70: icmp_seq=1 ttl=63 time=1.64 ms


準備預配置腳本,用於配置VIP,修改內核參數,安裝httpd和測試頁面等,要事先配置好yum原,我這裏使用本地光盤做爲yum源.

]# cat lvs_dr_rs.sh
#!/bin/bash
vip=10.0.0.100
mask='255.255.255.255'
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
    echo "The RS Server is Ready!"
    ;;
  stop)
    ifconfig $dev down
    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 RS Server is Canceled!"
    ;;
  *)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac


運行腳本

]# bash lvs_dr_rs.sh start

把VIP地址綁定到了本地迴環網卡lo的別名lo:1上.這樣RS會使用lo:1發送響應報文,源地址也就變成了VIP.

clip_image002

]# scp lvs_dr_rs.sh 192.168.7.20:/root/


RS2

配置ip地址配置

]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.20/24 ipv4.gateway 192.168.7.200 ipv4.method manual
]# nmcli connection up System\ ens33
]# ping 172.18.7.70
PING 172.18.7.70 (172.18.7.70) 56(84) bytes of data.
64 bytes from 172.18.7.70: icmp_seq=1 ttl=63 time=2.80 ms


跑腳本.

測試:

Client :

clip_image003


若是出現下面的狀況

]# curl 10.0.0.100
curl: (7) Failed connect to 10.0.0.100:80; No route to host

能夠嘗試:

給Director添加gateway

重啓網絡服務

]# bash lvs_dr_vs.sh stop
]# bash lvs_dr_vs.sh start

還不行就重啓Director.


ldirectord

LVS雖然調度效率極強,但也存在缺點.

1,一旦Director不可用,整個系統將不可用.

解決方案,配合高可用

2,某RS不可用時,Director依然會調度請求至此RS.


解決方案:由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啓用

此時就要藉助其餘工具來實現.相似工具備keepalived,heartbeat/corosync,ldirectord等,本次實驗以ldirectord爲例.

directord: 監控和控制LVS守護進程,可管理LVS規則


對於健康檢查,有如下幾種方式:

(a) 網絡層檢測,icmp

(b) 傳輸層檢測,端口探測

(c) 應用層檢測,請求某關鍵資源


RS全都不可用時:將訪問調度到backup server或叫作 sorry server,用於反饋用戶提示信息.

ldirecord支持包括https,firewall mark ,ftp,smtp,submission,pop,imap,ldap,UDP DNS,MySQL,PostgreSQL,Oracle等多種協議以及ipv6.


ldrectord下載地址

http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/


按照系統版本和架構選擇下載

這裏選擇頁面中Centos 7下的x86_64下的ldirectord-3.9.6-0rc1.1.2.x86_64.rpm


在Director中安裝ldirector:

以前要先清空ipvsadm建立的規則

]# ipvsadm -C

yum安裝ldirectord

]# yum -y install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
]# rpm -ql ldirectord
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/lib/systemd/system/ldirectord.service
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.6
/usr/share/doc/ldirectord-3.9.6/COPYING
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz


修改配置

]# cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
]# vim /etc/ha.d/ldirectord.cf
checktimeout=3 #每次檢測超時時長
checkinterval=1 #每次檢測間隔時間
fallback=127.0.0.1:80 #sorry_server,此處設置爲本機.須要在本機開啓http服務.
autoreload=yes #修改配置文件自動生效,無需手動reload
logfile="/var/log/ldirectord.log"
quiescent=no
virtual=10.0.0.100:80 #VIP
real=192.168.7.1:80 gate 1 #RS服務器,gate表示dr模式,數字爲權重.
real=192.168.7.2:80 gate 3
service=http
scheduler=wrr #權重輪詢
persistent=600
checktype=negotiate
checkport=80
request="test.html" #用於檢測的頁面
receive="test" #檢測關鍵字,若是檢測獲得,則認爲RS還活着


real參數還支持範圍寫法如real=192.168.6.2->192.168.6.7:80 gate.


安裝httpd,準備測試頁面,測試結果.

]# yum install httpd -y
]# echo 'sorry server' > /var/www/html/index.html
]# systemctl start httpd
]# curl 10.0.0.100
sorry server


兩個RS服務器創建測試頁面

]# echo 'test' > /var/www/html/test.html


Director開啓Ldirectord服務

]# systemctl start ldirectord


查看ipvsadmin狀態

]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.7.10:80 Route 1 0 0
-> 192.168.7.20:80 Route 3 0 0


規則已經配好


Client測試:

clip_image004


模擬RS宕機

中止RS1的httpd服務

]# systemctl stop httpd


Director中看ipvsadm規則

]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.7.20:80 Route 3 0 13


顯示只有RS2在.


回到CLient看結果,只剩下RS2了

clip_image005


模擬RS2也宕機

]# systemctl stop httpd


Director中看ipvsadm規則

]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 127.0.0.1:80 Route 1 0 0


RS服務器都不在,被sorry server代替


回到CLient看結果,結果顯示sorry server已經啓用

clip_image006


如今恢復RS1.和RS2

]# systemctl start httpd


Director查看規則

]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.7.10:80 Route 1 0 3
-> 192.168.7.20:80 Route 3 0 7


回到CLient看結果,已經恢復

clip_image007

測試結束.


可見,LVS配合ldirectord以後,功能性大大增強了.

相關文章
相關標籤/搜索