keepalived深度結合lvs_dr模式


keepalived與dr模式結合

keepalived介紹

keepalived可提供vrrp以及health-check功能,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),
這樣可以簡單實現一個雙機熱備高可用功能;
keepalived是以VRRP虛擬路由冗余協議為基礎實現高可用的,
可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,
這個組里面有一個master和多個backup,
master上面有一個對外提供服務的vip
(該路由器所在局域網內其他機器的默認路由為該vip),
master會發組播,當backup收不到VRRP包時就認為master宕掉了,
這時就需要根據VRRP的優先級來選舉一個backup當master。
這樣的話就可以保證路由器的高可用了。
keepalived可提供vrrp以及health-check功能,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),
這樣可以簡單實現一個雙機熱備高可用功能;
keepalived是以VRRP虛擬路由冗余協議為基礎實現高可用的,
可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,
這個組里面有一個master和多個backup,
master上面有一個對外提供服務的vip
(該路由器所在局域網內其他機器的默認路由為該vip),
master會發組播,當backup收不到VRRP包時就認為master宕掉了,
這時就需要根據VRRP的優先級來選舉一個backup當master。
這樣的話就可以保證路由器的高可用了。

keepalived實驗

實驗環境 4台虛擬機

dr1		192.168.1.135
dr2		192.168.1.106
rs1		192.168.1.190
rs2		192.168.1.187
VIP		192.168.1.180
為方便實驗,建議關閉iptables,或者開通80端口

dr1和dr2安裝ipvsadm和keepalived
yum install -y ipvsadm keepalived

real_server1和real_server2上安裝nginx
開啟80端口訪問,區分兩個real_server

實驗操作

  • 修改配置文件
1.修改dr1的keepalived配置文件

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {    # 配置郵箱報警
     acassen@firewall.loc    # (如果要開啟郵件報警,需要開啟相應的sendmail服務)
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1    # 郵箱的服務器
   smtp_connect_timeout 30    # 郵箱連接設置
   router_id LVS_DEVEL    # 表示keepalived服務器的一個標識,是發郵件時顯示在郵件主題中的信息
}

vrrp_instance VI_1 {    #定義一個vrrp組,組名唯一
    state MASTER        #定義改主機為keepalived的master主機
    interface eth0      #監控eth0號端口
    virtual_router_id 58   #虛擬路由id號為58,id號唯一,這個id決定了多播的MAC地址
	# (一組keepalived相同,多組不能相同)
    priority 150         #設置本節點的優先級,master的優先級 要比backup的優先級別高,數值要大
	# (一組中keepalived會檢查此選項然后選舉出一台服務器作為路由,配置vip)
    advert_int 1         #檢查間隔,默認為1秒
    authentication {
        auth_type PASS    #認證方式,密碼認證
        auth_pass 1111    #認證的密碼,這個密碼必須和backup上的一致
    }
    virtual_ipaddress {    #設置虛擬的ip, 這個ip是以后對外提供服務的ip。如果有多個VIP,繼續換行填寫.
        192.168.1.180
    }
}

virtual_server 192.168.1.180 80 {    #虛擬主機設置,ip同上。
    delay_loop 2                  #每隔2秒查詢realserver狀態
    lb_algo rr                    #lvs的調度算法
    lb_kind DR                    #lvs的集群模式
    nat_mask 255.255.255.0
    # persistence_timeout 50        #同一IP的連接50秒內被分配到同一台realserver
	# 測試的時候可以不用開
    protocol TCP                  #用TCP協議檢查realserver狀態

    real_server 192.168.1.187 80 {    #后端真實主機1
        weight 100                #每台機器的權重,0表示不給該機器轉發請求,直到它恢復正常。
        TCP_CHECK {                #健康檢查項目,以下
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port  80
        }
    }

    real_server 192.168.1.190 80 {        #后端真實主機2
        weight 100                    #每台機器的權重,0表示不給該機器轉發請求,直到它恢復正常。
        TCP_CHECK {                    #健康檢查項目,以下
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port  80
        }
    }
}
2.修改dr2上的keepalived配置文件

vim /etc/keepalived/keepalived.conf

只要修改dr1上的配置內容
backup主機的配置和master的基本一樣,只有以下地方需要修改。
state BACKUP        #定義改主機為keepalived的backup主機,監控主master
priority 100         #設置本節點的優先級,數值要比master主機上的小
3.配置real_server的dr腳本(同dr模式腳本)

vim /usr/local/sbin/lvs_dr.sh

#!/bin/bash
vip=192.168.1.180
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
  • 啟動執行
1.將2台dr上的keepalived啟動
/etc/init.d/keepalived start
2.執行腳本
sh /usr/local/sbin/lvs_dr.sh
  • 檢查是否搭建成功
查看VIP和ipvsadm
通過檢查網卡信息看vip綁定在哪台機器的網卡上
ip addr

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:46:c8:ae brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.180/32 scope global eth0
    inet6 fe80::20c:29ff:fe46:c8ae/64 scope link 
       valid_lft forever preferred_lft forever

不要跟dr模式混亂,這里啟動keepalived后不需要再執行dr模式下的lvs_dr.sh腳本

  • 測試

(注:如果發現rs沒有輪詢,注釋掉keepalived.conf中persistence_timeout 50即可)

A:dr1存活(正常輪詢)
[root@151 ~]# curl 192.168.1.180
rs2 nginx
[root@151 ~]# curl 192.168.1.180
rs1 nginx
[root@151 ~]# curl 192.168.1.180
rs2 nginx

此時vip在135上

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:46:c8:ae brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.180/32 scope global eth0
    inet6 fe80::20c:29ff:fe46:c8ae/64 scope link 
       valid_lft forever preferred_lft forever

B:dr1掛掉

停掉dr1的keepalived,vip自動綁定到dr2,keepalived搭建完成
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5a:c3:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.135/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.180/32 scope global eth0
    inet6 fe80::20c:29ff:fe5a:c348/64 scope link 
       valid_lft forever preferred_lft forever


因為給192.168.1.106配置的priority優先級為150
而192.168.1.135的優先級是100
所以,當keepalived連接通信時(主從同時存在時),vip會在106上
而當106宕機時,vip會飄到135上
當重新啟動106(啟動106上的keepalived)等於重新做了keepalived主從
106因為優先級為150,所以又會重新獲得vip

腦裂問題(主從模式)

上述主從配置方式存在腦裂的可能,
即兩個節點實際都處於正常工作狀態,但是無法接收到彼此的組播通知,
這時兩個節點均強行綁定虛擬IP,導致不可預料的后果。 

這就是我剛剛實驗中說不需要執行dr模式下的lvs_dr.sh腳本,因為執行腳本后,主從同時獲得vip

這時就需要設置仲裁,即每個節點必須判斷自身的狀態(應用服務狀態及自身網絡狀態),
要實現這兩點可使用自定義shell腳本實現,通過周期性地檢查自身應用服務狀態,
並不斷ping網關(或其它可靠的參考IP)均可。
當自身服務異常、或無法ping通網關,
則認為自身出現故障,就應該移除掉虛擬IP(停止keepalived服務即可)。
主要借助keepalived提供的vrrp_script及track_script實現:
(實驗中沒有添加這個)

在keepalived的配置文件最前面加入以下代碼,定義一個跟蹤腳本:

vrrp_script check_local { #定義一個名稱為check_local的檢查腳本    
    script "/usr/local/keepalived/bin/check_local.sh" #shell腳本的路徑    
    interval 5  #運行間隔    
}   

再在vrrp_instance配置中加入以下代碼使用上面定義的檢測腳本:

track_script {    
  check_local    
}   
我們在/usr/local/keepalived/bin/check_local.sh定義的檢測規則可以是: 
(以上的路徑及文件是自己定義的。)

a.自身web服務故障(超時,http返回狀態不是200)

b.無法ping通網關

c.產生以上任何一個問題,均應該移除本機的虛擬IP(停止keepalived實例即可)

但這里有個小問題,如果本機或是網關偶爾出現一次故障,那么我們不能認為是服務故障。
更好的做法是如果連續N次檢測本機服務不正常或連接N次無法ping通網關,
才認為是故障產生,才需要進行故障轉移。
另一方面,如果腳本檢測到故障產生,並停止掉了keepalived服務,
那么當故障恢復后,keepalived是無法自動恢復的。
我覺得利用獨立的腳本以秒級的間隔檢查自身服務及網關連接性,
再根據故障情況控制keepalived的運行或是停止。

這里提供一個思路,具體腳本內容請大家根據自己的需要編寫即可。

腳本 /usr/local/nginx/check_nginx.sh"內容:
#!/bin/bash    
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
	then    
	/usr/local/nginx/sbin/nginx    
	sleep 5    
	if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
	then    
		killall keepalived    
	fi    
fi    
vi /etc/keepalived/keepalived.conf
global_defs {    
   router_id nginx_backup    
}
#監控服務.NGINX mysql等

vrrp_script chk_nginx {    
    script "/usr/local/nginx/check_nginx.sh"    
    interval 2    
    weight 2    
}    
    
vrrp_instance VI_1 {    
    state BACKUP    
    interface eth0    
    virtual_router_id 51    
    priority 99    
    advert_int 1    
    authentication {    
        auth_type PASS    
        auth_pass 1111    
    }    
    virtual_ipaddress {    
 192.168.xx.xx    #VIP(虛擬ip)  
 192.168.xx.xx    #主服務器IP  
 192.168.xx.xx    #從服務器IP  
 }   
track_script {   
chk_nginx #檢測腳本 上面配置的   
}  
}  

keepalived健康檢查方式

keepalived對后端realserver的健康檢查方式主要有以下幾種

TCP_CHECK:工作在第4層,keepalived向后端服務器發起一個tcp連接請求,
如果后端服務器沒有響應或超時,那么這個后端將從服務器池中移除。

HTTP_GET:工作在第5層,向指定的URL執行http請求,
將得到的結果用md5加密並與指定的md5值比較看是否匹配,不匹配則從服務器池中移除;
此外還可以指定http返回碼來判斷檢測是否成功。
HTTP_GET可以指定多個URL用於檢測,這個一台服務器有多個虛擬主機的情況下比較好用。

SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL連接

MISC_CHECK:用腳本來檢測,腳本如果帶有參數,
需將腳本和參數放入雙引號內。腳本的返回值需為:

0)  檢測成功

1)  檢測失敗,將從服務器池中移除

2-255)檢測成功;如果有設置misc_dynamic,權重自動調整為 退出碼-2,
如退出碼為200,權重自動調整為198=200-2。

SMTP_CHECK:用來檢測郵件服務的smtp的

當把nginx與keepalived部署在同一台服務器上時

nginx做反向代理,keepalived做vip(重點還是nginx的反向代理)

同時配置BACKUP文件,重新做主從不替換

當keepalived的MASTER宕掉,BACKUP啟動。再恢復MASTER會再次搶走vip,
但此時並不需要更換vip,如果業務量大的話,反而會對業務有影響。
此時將兩台機器的keepalived同時設置為BACKUP,priority相同
兩台服務器使用相同的keepalived的BACKUP配置文件
兩台機器會搶vip,因為優先權相同。當誰先啟動誰就擁有了vip
避免了更換從主的問題

nginx+keepalived雙主模式

雙主模式與普通主從模式的最大區別,充分使用兩台服務器,不會有閑置BACKUP機器
注意:
配置中的虛擬路由標識virtual_router_id在MASTER和BACKUP處配置不能一樣(但在主從模式下配置是一樣的)

1)master負載機上的keepalived配置:
(注意,這里是雙主配置,MASTER-BACKUP和BACKUP-MASTER;
如果是多主,比如三主,
就是MATER-BACKUP-BACKUP、BACKUP-MASTER-BACKUP和BACKUP-BACKUP-MASTER)
雙主模式就是設置兩個vrrp_instance VI_1和VI_2
vrrp_instance VI_1 {
state MASTER
virtual_router_id 51
priority 101
}

vrrp_instance VI_2 {
state BACKUP
virtual_router_id 52
priority 99
}

#在另一台機器上
vrrp_instance VI_1 {
state BACKUP
virtual_router_id 51
priority 99
}

vrrp_instance VI_2 {
state MASTER
virtual_router_id 52
priority 101
}

主要就是這三項的變化
同一個虛擬的vrrp_instance相同
然后互為主從,權限不同

將nginx中配置的域名解析到這兩個VIP地址上:(萬網DNS解析配置)
103.110.98.20 www.chenhaoran.com
103.110.98.21 www.chenhaoran.com

參考鏈接
http://blog.chinaunix.net/uid-10480699-id-5179873.html
http://blog.csdn.net/qiandublog/article/details/52474450
http://www.keepalived.org/doc/introduction.html

推薦閱讀
http://www.361way.com/keepalived-health-check/5218.html
https://www.cnblogs.com/kevingrace/p/6248941.html

雙主模式參考
https://www.cnblogs.com/kevingrace/p/6146031.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM