1. 程式人生 > >LVS - 利用ldirectord實現RS的高可用

LVS - 利用ldirectord實現RS的高可用

LVSLdirectord

利用ldirectord實現RS的高可用性 --- 實驗:搭建Ldirectord,實現Real Server的高可用性

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的高可用