keepalived 雙機熱備
首先,要知道 keepalived 有三個模塊,分別是core、check和vrrp。其中core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。
keepalived 工作在網絡層,通過VRRP 協議,將信號廣播到網絡內的所有機器。當網絡組中的主機收到廣播後,就會檢測自己的優先級,如果發現本機的優先級是最高,則將VIP綁定到本機的網卡。
所以,keepalived 軟件主要是靠VRRP 協議通信。所以,當keepalived 機器組裏的機器不能正常通信後,就會出現腦裂問題——即有兩臺以上的主機在搶占VIP 。
keepalived 通常用在組建雙機熱備,當master 出現故障後,備機會獲得vip綁定,替代出現故障的機器提供服務。當然熱備的主機數量可以不止兩臺。
2. 搭建雙機熱備的思路
有兩臺nginx 提供web服務功能,在nginx 服務器上各安裝keepalived 軟件,其中一臺配置為master,另一臺配置成backup。keepalived 的配置文件可以統一完成這些需求。keepalived 還可以自定義檢測nginx健康情況的腳本。這個檢測nginx的腳本功能是,當keepalive發現nginx服務出現問題後,先嘗試重啟nginx服務,如果重啟nginx服務失敗,則keepalived 軟件自動停止。當keepalived 停止工作後,master主機將不再對網絡組內的機器發送vrrp 廣播。這時,其他的backup 主機,就會根據優先值大小,較大優先值的主機有權將vip 綁定到自己的網卡。這個切換過程是自動完成,對請求服務的客戶來說,幾乎察覺不到。
3. keepalived 搭建雙機熱備的過程
3.1. 搭建環境說明
兩臺 centos7 系統的主機 : cenvm71 和 cenvm72
3.2. 在兩臺主機上安裝keepalived 軟件
yum install -y keepalived
說明,安裝keepalived 的方法有很多,除了用yum 安裝,也可以下載安裝包,經過編譯安裝。
3.3. 在兩臺機器上安裝nginx 服務
為了簡化測試的過程,我這裏直接用yum 安裝nginx 服務
1. 安裝: yum install -y nginx 2. 修改 html 頁面用於後面的測試: vi /var/share/nginx/html/index.html 分別在兩臺主機的nginx 的默認html頁面寫入不同的內容,只要能區分兩臺服務器就可以了。 3. 啟動nginx systemctl start nginx
3.4. 修改master 主機的keepalived 配置文件
keepalived 的配置文件所在路徑,默認安裝的,在 /etc/keepalived/ 目錄
[root@cenvm71 default]# cat /etc/keepalived/keepalived.conf
global_defs { # global_defs 這個模塊的設置不需要管
notification_email {
[email protected] # 這個是郵件設置,當主機的 keepalived 有問題後,將發郵件
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" # 這是用來檢測nginx 服務健康情況的腳本,需要自己寫
interval 3 # 檢測時間間隔是3秒
}
vrrp_instance VI_1 {
state MASTER # master 名字
interface eno16777736 # 綁定的網卡,網卡名字根據自己機器而不同
virtual_router_id 51 # 工作組號,master 和 backup 所有的機器配置都一樣,表示工作在一個組內
priority 100 # 這個就是 優先級,範圍0-255,值越大優先級越高
advert_int 1
authentication {
auth_type PASS
auth_pass hell>com # 用於傳輸認證,master 和 backup 上都要一樣
}
virtual_ipaddress {
192.168.188.109 # 這個是虛擬 ip 地址,即 vip ,實際生產環境是一個對外的外網 IP;
}
track_script {
chk_nginx # 監測調用的模塊,就是上面 vrrp_script 模塊的名字。調用腳本,檢查nginx 服務。
}
}
3.5. 修改 backup 主機上的keepalived 配置文件
backup 主機上的配置文件和 master 主機的幾乎一致,只需要修改 優先級即可,最好根據自己的實際情況修改。
[root@cenvm72 html]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" # 腳本,用來監測 nginx 服務的工作情況。
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 51
priority 90 # 這裏的優先級比 master 上的要低
advert_int 1
authentication {
auth_type PASS
auth_pass hell>com
}
virtual_ipaddress {
192.168.188.109
}
track_script {
chk_nginx
}
}
3.6. 在master 和 backup 上創建 nginx服務監測腳本
[root@cenvm72 html]# cat /usr/local/sbin/check_ng.sh
#時間變量,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程為0,則啟動nginx,並且再次檢測nginx進程數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
4. 測試 keepalived 高可用
首先看看兩臺主機的ip :
ip add show
可以看到在 master 上,已經出現vip 192.168.188.109 被綁定在網卡上了。
在瀏覽器訪問一下 vip 192.168.188.109:
可以看到,現在訪問的nginx服務是master 主機(cenvm71)上的html頁面。
將cenvm71 主機上的keepalived 服務停止:
systemctl stop keepalived
看看結果:
可以看到,當master 主機上的 keepalived 服務停止後,vip 馬上就切換到 backup 機器了。
接著,用瀏覽器再訪問一次 vip :
可以看到,客戶端(瀏覽器)訪問vip ,返回的頁面已經是 backup 上的nginx 提供的頁面了。
最後,在master 機器上重新啟動keepalived 服務:
systemctl start keepalived
看看結果:
可以看到,vip 馬上切換會 master 主機了。
5. 總結
通過以上的實驗,可以看出,通過keepalived 實現雙機熱備切換,配置還是挺方便的,切換速度也很快。在實際環境中,當keepalived 監測的服務出現故障後,keepalived 才會自動停止。keepalived 停止工作,則vrrp 廣播也停止了。其他的backup機器就會通過優先級判斷誰將頂替master 對外提供服務。所以,監測腳本需要根據實際生產需求,重新編寫。
keepalived 雙機熱備