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