為什麼需要keepalived(保持存活)
keepalived實現高可用的工作原理
1. 準備一個叢集,為了實現高可用,如nginx負載均衡的2個機器,確保使用者的請求,能正確,高可用性的到達這個nginx叢集
2. 部署keepalived,生成VIP,虛擬IP資源。
3. keepalived是將 一組伺服器,組成一個虛擬裝置組,實現他們之間的心跳通訊(可以透過抓包,檢視他們的通訊協議,其實是VRRP虛擬路由冗餘協議。)
vrrp協議圖解
虛擬,路由, 冗餘,協議 ,vrrp
在同一組虛擬網路裝置中,master可以和backup互相通訊,知道對方的存活。
vip的漂移條件是,
心跳機制。
當backup收不到master發來的心跳資料包之後,就確認master掛掉了
vrrp工作原理
1. keppalived高可用是基於VRRP虛擬路由冗餘協議實現的,因此我從VRRP給您描述起
2. VRRP也就是虛擬路由冗餘協議,是為了解決靜態路由的單點故障;
3. VRRP透過競選協議將路由任務交給某一臺VRRP路由器。
4. VRRP正常工作時,master會自動傳送資料包,backup接收資料包,目的是為了判斷對方是否存活;如果backup收不到master的資料包了,自動接管master的資源;
backup節點可以有多個,透過優先順序競選,但是keepalived伺服器一般都是成對出現;
5. VRRP預設對資料包進行了加密,但是官網預設還是推薦使用明文來配置認證;
說完了VRRP,我再給您描述下keepalived工作原理。
1.keepalived就是基於VRRP協議實現的高可用,master的優先順序必須高於backup,因此啟動時master優先獲得機器的IP資源,backup處於等待狀態;若master掛掉後,backup頂替上來,繼續提供服務。
2.在keepalived工作時,master角色的機器會一直髮送VRRP廣播資料包,告訴其他backup機器,“我還活著”,此時backup不會搶奪資源,老實待著。
當master出現問題掛了,導致backup收不到master發來的廣播資料包,因此開始接替VIP,保證業務的不中斷執行,整個過程小於1秒。
透過抓包工具,檢視lb5和lb6的vrrp資料包的通訊(心跳資料包的傳送)
檢視資料包
模擬master掛掉,檢視資料包
目前,master會不斷的向這個組播地址,發心跳資料包,。
檢視資料包
恢復master機器,檢視這個心跳資料包的走向。
keepalived組播原理
單播流量走向圖
廣播資料流
組播資料流
keepalived環境準備(實踐部署)
1.先部署web機器組(web7、web8)
簡單部署,讓web7,web8分別提供一個不同的靜態頁面,能看出負載均衡的效果即可。
1. 安裝nginx
yum install nginx -y
2. 部署nginx,提供靜態頁面的虛擬主機就OK
3.建立測試資料
echo 'web7 ~~~~~~~~~~~~~~' > /usr/share/nginx/html/index.html
echo 'web8 ====================' > /usr/share/nginx/html/index.html
4.啟動2個web機器
nginx
5.本地測試,檢查nginx
[root@web-7 ~]#ps -ef|grep nginx
root 2172 1 0 10:40 ? 00:00:00 nginx: master process nginx
nginx 2173 2172 0 10:40 ? 00:00:00 nginx: worker process
root 2175 2054 0 10:40 pts/1 00:00:00 grep --color=auto nginx
[root@web-7 ~]#
[root@web-7 ~]#netstat -tnlp|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2172/nginx: master
tcp6 0 0 :::80 :::* LISTEN 2172/nginx: master
[root@web-7 ~]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
2.部署負載均衡裝置(lb5,lb6)
1. 安裝nginx,使用它的負載均衡功能
yum install nginx -y
2. 建立負載均衡地址池
upstream web_pools {
server 10.0.0.7;
server 10.0.0.8;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://web_pools;
include proxy_params;
}
}
代理引數的配置
[root@lb-6 /etc/nginx/conf.d]#cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
3.啟動nginx,檢視負載均衡的效果
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
到這裡,就明確配置好了 slb5 和slb6,都可以正確的進行負載均衡
3.部署兩臺lb裝置,需要支援高可用了。(keepavlied技術)
這裡得細心了,注意看配置檔案。,預設基於epel源即可安裝。
yum install keepalived -y
1. 部署slb5的keepalived(master角色,優先獲取VIP資源,當master掛掉不可用,然後才輪到backup上場。)
注意,中文註釋,別寫入到配置檔案中
global_defs {
router_id lb-5 # 路由器ID,每個機器不一樣
}
vrrp_instance VIP_1 { # 設定VRRP路由器組組名,屬於同一組的名字一樣
state MASTER # 角色,master、backup兩種
interface eth0 # VIP繫結的網路卡
virtual_router_id 50 # 虛擬路由IP,同一組的一樣
priority 150 # 優先順序,優先順序越高,權重越高
advert_int 1 # 傳送組播間隔1s
authentication { # 認證形式
auth_type PASS # 密碼認證,明文密碼 1111
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 # 指定虛擬VIP地址,必須沒人使用
}
}
# lb5機器的配置檔案
global_defs {
router_id lb-5
}
vrrp_instance VIP_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
# 簡單能理解,keepalived的配置檔案,需要設定哪些引數的,扣6,
# 總結一波,如下設定,理解這個引數,是方便你如果出錯,可以去拍錯,檢查這些引數即可。
#
router_id 在這個虛擬路由器組中的都不一樣
state 只有一個master,可以有多個backup
interface 指定當前負載均衡機器的 通訊的網路卡即可,。
virtual_router_id 注意,每個機器,都一樣,表示是一組內的裝置
priority 優先順序,master需要高於backup
authentication 一組裝置中的master和backup的通訊認證,是明文形式的 1111
這個資訊,可以透過抓包看到。
virtual_ipaddress 指定VIP的ip地址,需要在區域網內,無人使用。。
# lb6機器的配置檔案,注意如下部分引數,要和lb5機器區分開即可。
global_defs {
router_id lb-6
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
4.分別啟動兩臺機器的keepalived
systemctl start keepalived
5.繫結客戶端的VIP,訪問檢視效果,檢視日誌
10.0.0.3 www.linux0224.cc
keepalived腦裂問題
2.如何解決腦裂
基於shell指令碼去維護。
問題1,故障出在了backup機器,搶奪了VIP問題1,故障出在了backup機器,搶奪了VIP
[root@lb-6 /etc/keepalived]#ls
check_vip.sh keepalived.conf
# 1.在backup機器,設定好監控指令碼
[root@lb-6 /etc/keepalived]#
[root@lb-6 /etc/keepalived]#cat check_vip.sh
#!/bin/bash
MASTER_VIP=$(ssh 10.0.0.5 ip a|grep 10.0.0.3|wc -l)
MY_VIP=$(ip a|grep 10.0.0.3|wc -l)
# 如果遠端有VIP並且自己本地也存在了VIP,就幹掉自己
if [ ${MASTER_VIP} == 1 -a ${MY_VIP} == 1 ]
then
systemctl stop keepalived
fi
# 2. 讓keepalived去檢測使用這個指令碼,修改配置檔案如下
【前提矯健是,lb5和lb6機器可以免密登入,才可以遠端執行命令,以及給指令碼新增可執行許可權】
global_defs {
router_id lb-6
}
# 定義指令碼
vrrp_script check_vip {
script "/etc/keepalived/check_vip.sh"
interval 5 # 指令碼執行的時間間隔
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
# 調動指令碼
track_script {
check_vip
}
}
[root@lb-6 /etc/keepalived]#chmod +x check_vip.sh
[root@lb-6 /etc/keepalived]#ssh-copy-id root@10.0.0.5
確保可以正確重啟keepavlied
[root@lb-6 /etc/keepalived]#systemctl restart keepalived
[root@lb-6 /etc/keepalived]#systemctl status keepalived
去手動,讓backup機器,搶奪VIP資源,如開啟防火牆服務
systemctl restart firewalld
3. 等待,檢視backup機器的是否會幹掉自己的keepalived以及檢查VIP
故障2,master機器出現了nginx掛掉的解決方案
這個指令碼,執行於 master機器
#!/bin/bash
NGINX_STATUS=$(ps -ef|grep ngin[x]|wc -l)
# 如果nginx掛了
if [ ${NGINX_STATUS} == 0 ]
then
systemctl restart nginx
# 如果重啟失敗
if [ $? == 1 ]
then
# keepalived沒必要活著了
systemctl stop keepalived
fi
fi
# 給指令碼執行許可權
[root@lb-5 /etc/keepalived]#vim check-web.sh
[root@lb-5 /etc/keepalived]#chmod +x check-web.sh
修改keepalived配置檔案
global_defs {
router_id lb-5
}
vrrp_script check_web {
script "/etc/keepalived/check_web.sh"
interval 5
}
vrrp_instance VIP_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
[root@lb-5 /etc/keepalived]#systemctl restart keepalived
[root@lb-5 /etc/keepalived]#systemctl status keepalived
[root@lb-5 ~]#echo 'yuchaoit.cn' >> /etc/nginx/nginx.conf
[root@lb-5 ~]#systemctl stop nginx
5.此時已經正確切換到backup了。