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 { # 定義報警郵件地址
[email protected]

}
[email protected] #定義發送郵件的地址
smtp_server 192.168.200.1 #郵箱服務器
smtp_connect_timeout 30 #定義超時時間
router_id LVS_DEVEL #定義路由標識信息,相同局域網唯一
}

15-30行表示虛擬ip配置 vrrp

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地址信息,這種情況就稱爲腦裂
出現腦裂的原因:

  1. 心跳線出現問題
    網卡配置有問題
    交換設備有問題
    線纜連接有問題

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
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章