keepalived高可用服務總結分享
一、keepalived介紹
keepalived軟體起初是為LVS軟體設計的,用來監控LVS叢集中各個叢集的節點狀態,後來又加入了vrrp高可用功能,因此keepalived不但可以管理LVS叢集節點,還可做其他服務(Nginx、Mysql、Haproxy等)的高可用解決方案
二、keepalived高可用工作原理
keepalived高可用服務之間的故障轉移通過虛擬路由冗餘協議vrrp來實現的,在keepalived正常工作的時候,主節點會不斷的向備節點發送組播包,(224.0.0.18)告訴backup節點自己還活著,叫他不要篡權奪位,當主節點發生故障時候(backup接收不到組播包)這是備節點就會代替主節點,完成主節點的一切工作,這個過程也叫vip地址的漂移
三、keepalived的使用
(一)、安裝keepalived
yum -y install keepalived
rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf #keepalived服務主配置檔案
/etc/rc.d/init.d/keepalived #服務啟動指令碼
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/libexec/keepalived
/usr/sbin/keepalived
(二)、keepalived配置說明
cat /etc/keepalived/keepalived.conf
1-13行表示全域性配置
global_defs { #全域性配置
notification_email { 定義報警郵件地址br/>[email protected]
[email protected]br/>[email protected]
}
notification_email_from [email protected] #定義傳送郵件的地址
smtp_server 192.168.200.1 #郵箱伺服器
smtp_connect_timeout 30 #定義超時時間
router_id LVS_DEVEL #定義路由標識資訊,相同區域網唯一
}
15-30行 虛擬ip配置 brrp
vrrp_instance VI_1 { #定義例項
state MASTER #狀態引數 master/backup 只是說明
interface eth0 #虛IP地址放置的網絡卡位置
virtual_router_id 51 #同一家族要一直,同一個叢集id一致
priority 100 # 優先順序決定是主還是備 越大越優先
advert_int 1 #主備通訊時間間隔
authentication { # ↓
auth_type PASS #↓
auth_pass 1111 #認證
} #↑
virtual_ipaddress { #↓
192.168.200.16 裝置之間使用的虛擬ip地址
192.168.200.17
192.168.200.18
}
}
(三)、配置例項
說明:配置lb01和lb02兩臺機器的keepalived服務,讓lb01為主lb02為備,vip為10.0.0.3
lb01配置
cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}vrrp_instance gorup01 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
/etc/init.d/keepalived reload
lb02配置
cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}vrrp_instance group01 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
/etc/init.d/keepalived reload
(四)、keepalived腦裂
腦裂是大部分高可用服務的通病,腦裂指的是在keepalived高可用叢集中,出現了兩個相同虛擬IP地址資訊,這種情況就稱為腦裂
出現腦裂的原因:
- 心跳線出現問題
網絡卡配置有問題
交換裝置有問題
線纜連線有問題
2 . 有防火牆軟體阻止問題
3.virtual_router_id配置數值不正確
總之:只要備伺服器收不到組播包,就會成為主,而主資源沒有釋放,就會出現腦裂
防止腦裂解決思路
通過上邊的說明我們可以知道如果備伺服器出現了vip地址就說明這個keepalived服務壞掉了,當然這壞掉也有兩種情況,一是主節伺服器真的掛掉了,備伺服器正常接替主伺服器工作,二就是出現了腦裂的情況,這時候我們就可以寫一個監控備伺服器上有沒有這個vip地址,如果有就給我個提示,或者傳送郵件,作為運維人員收到這個資訊後就應該看看是什麼原因造成了備伺服器上有這個vip地址了!
在備伺服器上編寫指令碼
vim /server/scripts/ checkup.sh
#!/bin/bash
check_info=$(ip a|grep -c 10.0.0.3)
if [ $check_info -ne 0 ]
then
echo "keepalived server error!!!"
fi
寫完指令碼後可以加入到定時任務裡邊一分鐘執行一次
(五)、nginx反向代理服務停止keepalived服務也停止
有時候像類似nginx+keepalived這樣的環境中,如果nginx服務已經停止,那麼keeepalived服務也就沒有了存在價值,反倒影響使用者體驗,比如主服務上的nginx停止了,keepalived並沒有停止,使用者在請求資料的時候還是會走主伺服器上,這時候使用者的請求就會出錯
編寫兩個服務的關聯指令碼
vim /server/scripts/web_info.sh
#!/bin/bash
web_info=$(ps -ef|grep [n]ginx|wc -l)
if [ $web_info -lt 2 ]
then
/etc/init.d/keepalived stop
fi
放到keepalived服務的配置檔案中執行
! Configuration File for keepalived
global_defs {
router_id lb01
}vrrp_script check { #定義指令碼
script "“/server/scripts/check_web.sh" --- 表示將一個指令碼資訊賦值給變數check_web
interval 2 --- 執行監控指令碼的間隔時間
weight 2 ---利用權重值和優先順序進行運算,從而降低主服務優先順序使之變為備伺服器(建議先忽略)
}
中間忽略
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
track_script { #呼叫指令碼
check
}
(六)、實現高可用雙主(互為主備)
有時候我們可能不止一個叢集,如果都讓把所有的請求都交給一個主伺服器,那他的壓力就太了,而備伺服器卻沒有事兒幹,這樣顯然是不合理的,這時候就可以讓不同的高可用伺服器成為不同叢集的主伺服器,這樣既分擔了單個伺服器的壓力,有提高了使用者的體驗;
lb01配置
vrrp_instance gorup01 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
vrrp_instance gorup02 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24 dev eth0 label eth0:1
}
}
lb02配置
vrrp_instance gorup01 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
}
vrrp_instance gorup02 {
state MASTER
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24 dev eth0 label eth0:1
}
}