LVS - 利用ldirectord實現RS的高可用
LVS高可用性 --- RS的高可用
-
1 Director不可用,整個系統將不可用;
SPoF Single Point of Failure 單點失敗
解決方案:高可用 keepalived(實現相對容易的,輕量級的解決方案) heartbeat/corosync(重量級的實現方法,在生產中用的越來越少)
-
2 某RS不可用時,Director依然會調度請求至此RS
解決方案: 由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啟用 keepalived heartbeat/corosync
ldirectord(更好的解決方案,可以放便的實現健康狀態檢查功能,此外,還帶有IPVS策略的定義,此前定義IPVS策略是手動鍵入命令,但是ldirectord自動就把IPVS策略配置好了,不用手動配置了)
- 檢測方式
- (a) 網絡層檢測,icmp
- (b) 傳輸層檢測,端口探測
- (c) 應用層檢測,請求某關鍵資源
- RS全不可用時:backup server, sorry server
LVS在具體實現的時候存在單點失敗的問題,例如LVS本身出故障了。
Ldirectord策略可以替代ipvsadm策略,所以,安裝Ldirectord就可以不要ipvsadm策略了
[root@localhost ~]# ipvsadm -C
Ldirectord只能夠配置LVS服務器,配置不了Real Server
ldirectord官網:http://horms.net/projects/ldirectord/
ldirectord?ldirectord is a daemon to monitor and administer real servers in a?LVS?cluster of load balanced virtual servers.?ldirectord?typically used as a resource for?Linux-HA?, but can also be run from the command line.
ldirectord ldirectord是監控和管理實際服務器守護進程在LVS集群負載均衡的虛擬服務器。linux - ha ldirectord通常作為一個資源,但也可以從命令行運行。
ldirectord屬於高可用集成套件中的一個包而已
安裝ldirectord
[root@LVS ~]# yum -y install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
ldirectord依賴很多perl包
安裝後生成的文件
[root@LVS ~]# 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
搭建Ldirectord,實現Real Server的高可用性
在RS機器上需要運行的腳本
[root@rs1 ~]# cat lvs_dr_rs.sh
#!/bin/bash
vip=10.0.0.100
mask=‘255.0.0.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 "`hostname`" > /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
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
[root@rs1 ~]#
在LVS機器上需要運行的腳本
[root@LVS ~]# cat lvs_dr_vs.sh
#!/bin/bash
vip=‘10.0.0.100‘
iface=‘ens34:1‘
mask=‘255.255.255.255‘
port=‘80‘
rs1=‘192.168.159.102‘
rs2=‘192.168.159.103‘
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 1
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
[root@LVS ~]#
配置ldirectord,把配置文件模板,復制到/etc/ha.d下,當做配置文件
[root@localhost ~]# cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
配置文件中大部分都是註釋,註釋大部分都是範例,可以根據自己的生產環境,參考例子改改就可以了
Ldirectord重要的作用就是健康性檢查功能,檢查後端的Real Server是不是可用
配置文件內容
[root@LVS ~]# vim /etc/ha.d/ldirectord.cf
checktimeout=3 檢查超時時間,探測一次3秒不回應,就認為死了
checkinterval=1 探測間隔(一秒探測一次,探測時間太久用戶就可能會發覺服務不可用)
#fallback=127.0.0.1:80 備用服務器的地址(如果服務器全掛了會看到拒絕訪問,入如果配置了這個選項,用戶就會看到這個服務器提供的頁面,一般配置成LVS服務器所在的地址,所以要確保LVS可以提供網頁服務。去掉註釋,啟用)
在LVS服務器上搭建備用服務器
yum -y install httpd && systemctl start httpd
echo Sorror,Server Down! > /var/www/html/index.html[root@LVS ~]# curl 10.0.0.100
Sorror,Server Down!
#fallback6=[::1]:80 IPV6地址
autoreload=yes IPV6地址,不用管它。這個配置文件將來需不需要改完以後通過systemctl restart的方式生效。 不需要配置,修改完以後自動生效(第一次還需要把ldirectord服務手動的起來,起來以後,在修改這個文件,就會自動生效了,而不用重啟服務)
#logfile="/var/log/ldirectord.log" 日誌
#logfile="local0" 日誌級別
# Sample for an http virtual service VIP
virtual=192.168.6.240:80
real=192.168.6.2:80 gate 1 gate(DR模型) 1(權重)
real=192.168.6.3:80 gate
real=192.168.6.6:80 gate
service=http 服務
scheduler=rr 調度算法
#persistent=600 超時時間
#netmask=255.255.255.255
protocol=tcp 協議
checktype=negotiate 測試的類型(健康性檢查的方式)
checkport=80 健康性就檢查80端口,看測試頁是否可以被訪問可以訪問就沒問題
request="index.html" 要探測的頁面(準備一個測試頁比較好)
receive="Test Page" 探測頁面中的關鍵字符串
virtualhost=www.x.y.z 不用加,註釋掉
修改配置文件
[root@LVS ~]# vim /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
# Sample for an http virtual service
virtual=10.0.0.100:80
real=192.168.111.102 gate 1
real=192.168.111.103 gate 3
# fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="test.html"
receive="test"
# virtualhost=www.x.y.z
準備測試頁
[root@RS1 ~]# echo test > /var/www/html/test.html
[root@RS2 ~]# echo test > /var/www/html/test.html
啟動服務
[root@localhost ~]# systemctl start ldirectord
註意:沒有手工加ipvsadm策略,啟動服務的時候會自動根據配置文件,生成的ipvsadm策略
[root@LVS ~]# 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.111.102:80 Route 1 0 0
-> 192.168.111.103:80 Route 3 0 0
配置LVS網絡
ifconfig ens34:1 10.0.0.100 netmask 255.255.255.255 broadcast 10.0.0.100 up
從配置文件中讀取出來的,不用使用ipvsadm添加策略了,除此,還能夠做健康性檢查
[root@client ~]# for i in {1..10}; do curl 10.0.0.100; done
server1.ding.com
server2.ding.com
server2.ding.com
server1.ding.com
server2.ding.com
……
訪問測試
[root@client ~]# for i in {1..100};do curl 10.0.0.100; sleep 0.2; done
RS1
RS2
RS2
RS2
Real Server停機測試,把檢測的文件內容改變就可以了,ldirectord檢測不到要探測的文件的內容就認為RS宕機了
Real Server停機模擬
[root@RS1 ~]# > /var/www/html/test.html
RS宕機,會自動的把出錯的機器從調度列表中踢出了
[root@LVS ~]# 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.111.103:80 Route 3 0 49
[root@localhost ~]#
如果RS全部停止服務
[root@RS2 ~]# systemctl stop httpd
訪問測試
[root@client ~]# curl 10.0.0.100
Sorror,Server Down!
如果服務器修復,會自動上線服務器,並提供調度
查看日誌
[root@LVS ~]# tail -f /var/log/ldirectord.log
[Mon Mar 5 20:33:05 2018|ldirectord|2559] Deleted fallback server: 127.0.0.1:80 (192.168.6.240:80)
[Mon Mar 5 20:33:05 2018|ldirectord|2559] Deleted real server: 192.168.6.2:80 (192.168.6.240:80)
RS的日誌文件中會記錄探測,1s就會有一個測試的請求
[root@RS1 ~]# tail -f /var/log/httpd/access_log
192.168.111.100 - - [05/Mar/2018:20:55:12 +0800] "GET /test.html HTTP/1.1" 200 5 "-" "libwww-perl/6.05"
192.168.111.100 - - [05/Mar/2018:20:55:13 +0800] "GET /test.html HTTP/1.1" 200 5 "-" "libwww-perl/6.05"
192.168.111.100 - - [05/Mar/2018:20:55:14 +0800] "GET /test.html HTTP/1.1" 200 5 "-" "libwww-perl/6.05"
實現綜合調度 - 實現http和https的綜合調度
實現綜合調度
在LVS機器上打標簽
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
查看配置文件中關於打標簽的配置
[root@LVS /etc/ha.d]# vim ldirectord.cf
# Sample configuration for a fwmark based service For an explanation of
# fwmark see the ipvsadm(8) man page
#virtual=1 標簽
# real=192.168.6.2 gate
# real=192.168.6.3 gate
# real=192.168.6.6 gate
# fallback=127.0.0.1:80 gate
# service=http
# scheduler=rr
# #persistent=600
# #netmask=255.255.255.255
# protocol=fwm
# checktype=negotiate
# checkport=80
# request="index.html"
# receive="Test Page"
# virtualhost=x.y.z
修改配置文件
# Sample for an http virtual service
virtual=10
real=192.168.111.102 gate 1 不用寫端口號
real=192.168.111.103 gate 3 不用寫端口號
# fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
#persistent=600 持久連接,啟用後就會一直往一個服務器上調度了
#netmask=255.255.255.255
protocol=fwm #這個加不加都可以
checktype=negotiate
checkport=80
request="test.html"
receive="test"
# virtualhost=www.x.y.z
修改完配置文件以後不需要重啟服務,因為有自動加載功能
查看(不用重啟服務)
[root@LVS ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wrr
-> 192.168.111.102:0 Route 1 0 0
-> 192.168.111.103:0 Route 3 0 0
[root@LVS ~]#
訪問測試
[root@client ~]# for i in {1..100} ; do curl -k https://10.0.0.100; curl 10.0.0.100; done
[root@client ~]# ssh 10.0.0.100
[email protected]‘s password:
Last login: Thu Apr 26 11:51:32 2018 from 192.168.3.204
[root@LVS ~]#
其他端口不會調度,因為防火墻策略裏面已經定義只針對80和443端口的訪問才打標簽,別的就不知道標簽是啥
添加策略控制外部主機訪問內網在路由器上配置防火墻,實現安全防護
iptables -A FORWARD -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j REJECT
測試
[root@client ~]# for i in {1..100} ;do curl -k https://10.0.0.100;curl 10.0.0.100;done
RS2
RS1
[root@client ~]# ssh 10.0.0.100
ssh: connect to host 10.0.0.100 port 22: Connection refused
啟用持久連接
修改配置文件
[root@LVS ~]# vim /etc/ha.d/ldirectord.cf
persistent=600 去掉註釋文件
[root@LVS ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wrr persistent 600
-> 192.168.111.102:0 Route 1 0 0
-> 192.168.111.103:0 Route 3 0 0
[root@LVS ~]#
測試
[root@client ~]# for i in {1..100} ;do curl -k https://10.0.0.100;curl 10.0.0.100;done
RS2
RS2
RS2
RS2
LVS - 利用ldirectord實現RS的高可用