Keepalived高可用之間是經過VRRP通訊的,所以,我從VRRP開始給您講起:前端
介紹完了VRRP,接下來我再介紹一下Keepalived服務的工做原理:ios
HOSTNAME | IP | 說明 |
---|---|---|
lb01 | 192.168.103.121 | Keepalived主服務器(Nginx主負載均衡器) |
lb02 | 192.168.103.122 | Keepalived備服務器(Nginx備負載均衡器) |
web01 | 192.168.103.123 | web01服務器 |
web02 | 192.168.103.124 | web02服務器 |
說明:下面有關Keepalived安裝,啓動服務的操做都是同時處理lb01,lb02兩臺機器。nginx
可經過官方地址獲取Keepalived源碼軟件包編譯安裝,也可使用yum的安裝方式直接安裝,這裏選擇更爲簡便額後者--yum安裝方式,下面以lb01爲例,介紹整個安裝步驟,以下:web
//lb01 [root@lb01 /]# yum install keepalived -y [root@lb01 /]# rpm -qa keepalived keepalived-1.3.5-8.el7_6.5.x86_64 //lb02 [root@lb02 /]# yum install keepalived -y [root@lb02 /]# rpm -qa keepalived keepalived-1.3.5-8.el7_6.5.x86_64
提示:數據庫
1)上述安裝過程須要在lb01和lb02兩臺服務器上同時安裝。
2)Keepalived版本爲3.5版vim
啓動服務命令:安全
service keepalived start
systemctl enable keepalived.service
建議查找資料將服務作成開機自動運行。bash
檢查服務是否正常啓動敲以下命令查看日誌:服務器
journalctl -xe
和其餘使用yum安裝的軟件同樣,Keepalived軟件的配置文件默認路徑及配置文件名爲:網絡
[root@lb01 /]# ls -l /etc/keepalived/keepalived.conf -rw-r--r--. 1 root root 3598 7月 30 01:19 /etc/keepalived/keepalived.conf
前面已經說過,Keepalived軟件有3個主要功能,而這裏僅講解其高可用部分的功能。
這裏的具有高可用功能的Keepalived.conf配置文件包含了兩個重要區塊,下面會分別說明
global_defs { notification_email { # 定義服務故障報警的Email地址。做用是當服務發生切換或RS節點等有故障時,發報警郵件。這幾行是可選配置,notification_email指定在Keepalived發生事件時,須要發送的Email地址,能夠有多個,每行一個。【可選的配置】 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # 指定發送郵件的發送人,即發件人地址。【可選的配置】 smtp_server 192.168.200.1 # 指定發送郵件的smtp服務器,若是本機開啓了sendmail或postfix,就可使用上面默認配置實現郵件發送。【可選配置】 smtp_connect_timeout 30 # 接smtp的超時時間。【可選配置】 router_id LVS_DEVEL # Keepalived服務器的路由標識(router_id).在一個局域網內,這個標識(router_id)應該是惟一的。建議使用機器名【【必須】】 vrrp_skip_check_adv_addr # 檢查vrrp報文中的全部地址比較耗時,設置此標誌的意思是若是接收的到報文和上一個報文來至同一個路由器,則不執行檢查。默認是跳過檢查 vrrp_strict # 嚴格執行VRRP協議規範,此模式不支持節點單播,引發vip問題的就是這個參數 vrrp_garp_interval 0 vrrp_gna_interval 0 }
建議去掉紅色標註部分
大括號「{}」。用來分隔區塊,要成對出現。若是漏寫了半個大括號,Keepalived運行時,不會報錯,但也不會獲得預期的結果。另外,因爲區塊間存在多層嵌套關係,所以很容易遺漏區塊結尾處的大括號,要特別注意。
vrrp_instance VI_1 { # 表示定義一個vrrp_instance實例,名字是VI_1,每一個vrrp_instance實例能夠認爲是Keepalived服務的一個實例或者做爲一個業務服務,在Keepalived服務配置中,這樣的vrrp_instance實例能夠有多個。注意,【存在於主節點中的vrrp_instance實例在備節點中也要存在,這樣才能實現故障切換接管】 state MASTER # 表示當前實例VI_1的【角色狀態】,當前角色爲MASTER,這個狀態只能有【MASTER】和【BACKUP】兩種狀態,而且須要【大寫】這些字符。其中MASTER爲正式工做的狀態,BACKUP爲備用的狀態。當MASTER所在的服務器故障或失效時,BACKUP所在的服務器會接管故障的MASTER繼續提供服務。 interface eth0 # 網絡通訊接口。爲對外提供服務的網絡接口,如eth0,eth1。當前主流的服務器都有2~4個網絡接口,在選擇服務接口時,要搞清楚了。 virtual_router_id 51 # 虛擬路由ID標識,這個標識最好是一個【數字】,而且要在一個keepalived.conf配置中是【惟一的】。【可是MASTER和BACKUP配置中相同實例的virtual_router_id又必須是【一致的】,不然將出現腦裂問題。】 priority 100 # 數字越大,表示實例優先級越高。在同一個vrrp_instance實例裏,MASTER的優先級配置要高於BACKUP的。若MASTER的priority值爲150,那麼BACKUP的priority必須小於150,通常建議【間隔50以上爲佳】,例如:設置BACKUP的priority爲100或更小的數值。 advert_int 1 # 同步通知間隔。MASTER與BACKUP之間通訊檢查的時間間隔,單位爲秒,默認爲1. authentication { # 權限認證配置。包含認證類型(auth_type)和認證密碼(auth_pass)。 auth_type PASS # 認證類型有PASS(Simple Passwd(suggested)),AH(IPSEC(not recommended))兩種,官方推薦使用的類型爲PASS。 auth_pass 1111 # 驗證密碼爲明文方式,最好長度不要超過8個字符,建議用4位數字,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通訊。 } virtual_ipaddress { # 虛擬IP地址。能夠配置多個IP地址,每一個地址佔一行,配置時最好明確指定子網掩碼以及虛擬IP綁定的網絡接口。不然,子網掩碼默認是32位,綁定的接口和前面的interface參數配置的一致。注意,這裏的虛擬IP就是在工做中須要和域名綁定的IP,即和配置的高可用服務監聽的IP要保持一致! 192.168.200.16 192.168.200.17 192.168.200.18 } }
[root@lb01 /]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 786744873@qq.com # 郵箱隨便寫 } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 # 郵件服務器IP smtp_connect_timeout 30 router_id lb01 # id爲lb1,不能和其餘Keepalived節點相同(全局惟一) } vrrp_instance VI_1 { # 實例名字爲VI_1,相同實例的備節點名字要和這個相同 state MASTER # 狀態爲MASTER,備節點狀態須要爲BACKUP interface enp0s3 # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱 virtual_router_id 55 # 實例ID爲55,要和備節點相同 priority 150 # 優先級爲150,備節點的優先級必須比此數字低 advert_int 1 # 通訊檢查間隔時間1秒 authentication { auth_type PASS # PASS認證類型,此參數備節點設置和主節點相同 auth_pass 1111 # 密碼1111,此參數備節點設置和主節點相同 } virtual_ipaddress { 192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同 } }
[root@lb01 /]# service keepalived restart
[root@lb01 /]# ip a | grep 192.168.103.120 inet 192.168.103.120/24 scope global secondary enp0s3:1
[root@lb02 /]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 786744873@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 # id爲lb2,不能和其餘Keepalived節點相同(全局惟一) } vrrp_instance VI_1 { state BACKUP #此參數和lb01 MASTER不一樣 interface enp0s3 virtual_router_id 55 priority 100 # 此參數和lb01 MASTER不一樣 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.103.120/24 dev enp0s3 label enp0s3:1 } }
[root@lb02 /]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@lb02 /]# ip a | grep 192,168.103.120 [root@lb02 /]#
這裏沒有返回任何結果就對了,由於lb02爲BACKUP,當主節點活着的時候,它不會接管 192.168.103.120
// lb01 [root@lb01 /]# ip a | grep 192.168.103.120 #虛擬VIP在lb01服務器上 inet 192.168.103.120/24 scope global secondary enp0s3:1 [root@lb01 /]# service keepalived stop #停掉服務 Redirecting to /bin/systemctl stop keepalived.service [root@lb01 /]# ip a | grep 192.168.103.120 #虛擬VIP消失了 [root@lb01 /]# // lb02 [root@lb02 /]# ip a | grep 192.168.103.120 #虛擬VIP出如今了lb02上 inet 192.168.103.120/24 scope global secondary enp0s3:1
[root@lb01 /]# ip a | grep 192.168.103.120 #虛擬VIP在lb01服務器上 inet 192.168.103.120/24 scope global secondary enp0s3:1
說明:
這裏僅實現了VIP的自動漂移切換,所以,僅適合兩臺服務器提供的服務均保持開啓的應用場景,這也是工做中經常使用的高可用解決方案。
Keepalived配置參數 | MASTER節點特殊參數 | BACKUP節點特殊參數 |
---|---|---|
router_id(惟一標識) | router_id lb01 | router_id lb02 |
state(角色狀態) | state MASTER | state BACKUP |
priority(競選優先級) | priority 150 | priority 100 |
因爲某些緣由,致使兩臺高可用服務器對在指定時間內,沒法檢測到對方的心跳消息,各自取得資源及服務的全部權,而此時的兩臺高可用服務器對都還活着並在正常運行,這樣就會致使同一個IP或服務在兩端同時存在而發生衝突,最嚴重的是兩臺主機佔用同一個VIP地址,當用戶寫入數據時可能會分別寫入到兩端,這可能會致使服務器兩端的數據不一致或形成數據丟失,這種狀況就被稱爲裂腦。
通常來講,裂腦的發生,有如下幾種緣由:
提示:
Keepalived配置裏同一VRRP實例若是virtual_router_id兩端參數配置不一致,也會致使裂腦問題發生。
在實際生產環境中,咱們能夠從如下幾個方面來防止裂腦問題的發生:
做爲互聯網應用服務器的高可用,特別是前端Web負載均衡器的高可用,裂腦的問題對普通業務的影響是能夠忍受的,若是是數據庫或者存儲的業務,通常出現裂腦問題就很是嚴重了。所以,能夠經過增長冗餘心跳線路來避免裂腦問題的發生,同時增強對系統的監控,以便裂腦發生時人爲快速介入解決問題。
下面是生產場景檢測裂腦故障的一些思路:
前面給出的是Keepalived單實例主備模式的高可用演示,Keepalived還支持多實例多業務雙向主備模式,即A業務在lb01上是主模式,在lb02上是備模式,而B業務在lb01上是備模式,在lb02上是主模式,下面就以雙實例爲例講解不一樣業務實現雙主的配置。
下圖爲Keepalived雙實例雙主模式IP及VIP規劃表
HOSTNAME | IP | 說明 |
---|---|---|
lb01 | 192.168.103.121 | VIP:192.168.103.120(用於綁定A服務www.yunjisuan.com域名) |
lb02 | 192.168.103.122 | VIP:192.168.103.130(用於綁定B服務bbs.yunjisuan.com域名) |
[root@lb01 /]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
786744873@qq.com # 郵箱隨便寫
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 # 郵件服務器IP
smtp_connect_timeout 30
router_id lb01 # id爲lb1,不能和其餘Keepalived節點相同(全局惟一)
}
vrrp_instance VI_1 { # 實例名字爲VI_1,相同實例的備節點名字要和這個相同
state MASTER # 狀態爲MASTER,備節點狀態須要爲BACKUP
interface enp0s3 # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱
virtual_router_id 55 # 實例ID爲55,要和備節點相同
priority 150 # 優先級爲150,備節點的優先級必須比此數字低
advert_int 1 # 通訊檢查間隔時間1秒
authentication {
auth_type PASS # PASS認證類型,此參數備節點設置和主節點相同
auth_pass 1111 # 密碼1111,此參數備節點設置和主節點相同
}
virtual_ipaddress {
192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp0s3
virtual_router_id 56
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同
}
}
#提示: 以vrrp_instance VI_1在lb01 192.168.103.121服務器上的角色爲主,vrrp_instance VI_2在lb01 192.168.103.121服務器上的角色爲備。
[root@lb02 /]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
786744873@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lb02 # id爲lb2,不能和其餘Keepalived節點相同(全局惟一)
}
vrrp_instance VI_1 {
state BACKUP #此參數和lb01 MASTER不一樣
interface enp0s3
virtual_router_id 55
priority 100 # 此參數和lb01 MASTER不一樣
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.103.120/24 dev enp0s3 label enp0s3:1
}
}
vrrp_instance VI_2 {
state MASTER
interface enp0s3
virtual_router_id 56
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同
}
}
#提示: 以vrrp_instance VI_1在lb02 192.168.103.121服務器上的角色爲備,vrrp_instance VI_2在lb02 192.168.103.122服務器上的角色爲主。
#關閉服務 [root@lb01 /]# service keepalived stop Redirecting to /bin/systemctl stop keepalived.service [root@lb02 /]# service keepalived stop Redirecting to /bin/systemctl stop keepalived.service #在lb01上進行以下操做: [root@lb01 keepalived]# service keepalived restart [root@lb01 keepalived]# ip a | egrep "192.168.103.120|192.168.103.130" inet 192.168.103.120/24 scope global secondary eth0:1 #因爲lb02還沒開服務 inet 192.168.103.130/24 scope global secondary eth0:2 #主備VIP都顯示在lb01上 #在lb02上進行以下操做: [root@lb02 keepalived]# service keepalived restart [root@lb02 keepalived]# ip a | egrep "192.168.103.120|192.168.103.130" inet 192.168.103.130/24 scope global secondary eth0:2 #lb01開啓的狀況下,lb02開啓服務後,只顯示了vrrp_instance VI_2實例lb02做爲主模式的VIP 192.168.103.130 #再次在lb01上進行以下操做: [root@lb01 ~]# ip a | egrep "120|130" inet 192.168.103.120/24 scope global secondary eth0:1 #lb01上只有192.168.103.120了。
特別提示:
若是測試結果不符,請查看是否沒有關閉iptables
到此爲止,咱們發現lb01,lb02主備節點已經實現了初始配置的VIP服務狀態,當任意一端宕機,VIP能夠實現互相切換接管。在實際工做中,能夠把www.yunjisuan.com解析到192.168.103.120提供服務,把bbs.yunjisuan.com解析到192.168.103.130提供服務,固然了,lb01,lb02也要配置相應服務,例如:Nginx反向代理服務等。
結合上節介紹的Nginx負載均衡的環境,調整好主負載均衡器lb01,備用負載均衡器lb02服務器上Nginx負載均衡環境,兩臺服務器的安裝基礎環境如出一轍。
這裏使用的Nginx負載均衡的配置以下:
[root@lb01 /]# vim /usr/local/nginx/conf/nginx.conf [root@lb02 /]# vim /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.103.123:80 weight=1; server 192.168.103.124:80 weight=1; } server { listen 80; server_name www.yunjisuan.com; location / { proxy_pass http://www_server_pools; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } } }
提示:此配置僅代理了www.yunjisuan.com域名
Keepalived的配置與本節以前的實驗配置一致。
準備工做以下:
(1)在客戶端hosts文件裏把www.yunjisuan.com域名解析到VIP 192.168.103.120上,正式場景需經過DNS解析。
(2)兩臺服務器配好Nginx負載均衡服務,而且確保後面代理的Web節點能夠測試訪問。
由於我們暫時沒有域名,因此沒法測試
默認狀況下Keepalived軟件僅僅在對方機器宕機或Keepalived停掉的時候纔會接管業務。但在實際工做中,有業務服務中止而Keepalived服務還在工做的狀況,這就會致使用戶訪問的VIP沒法找到對應的服務,那麼,如何解決業務服務宕機能夠將IP漂移到備節點使之接管提供服務呢?
# 此腳本的基本思想是若沒有80端口存在,就停掉Keepalived服務實現釋放本地的VIP。在後臺執行上述腳本並檢查: [root@lb01 /]# vim /etc/keepalived/check_nginx.sh #!/bin/sh while true do if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then service keepalived stop fi sleep 5 done # 啓動腳本 [root@lb01 /]# sh /etc/keepalived/check_nginx.sh & [1] 18446 [root@lb01 /]# ps -ef | grep check | grep -v grep root 18446 32623 0 13:17 pts/0 00:00:00 sh /etc/keepalived/check_nginx.sh #確認Nginx以及Keepalived服務是正常的 [root@lb01 /]# netstat -antup | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21620/nginx: master [root@lb01 /]# service keepalived status Redirecting to /bin/systemctl status keepalived.service ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled) Active: active (running) since 六 2019-08-31 13:31:51 CST; 44s ago Process: 22193 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) #而後模擬Nginx服務掛掉,看IP是否發生切換。 [root@lb01 /]# /usr/local/nginx/sbin/nginx -s stop [root@lb01 /]# service keepalived status Redirecting to /bin/systemctl status keepalived.service ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled) Active: inactive (dead) since 六 2019-08-31 13:34:03 CST; 3s ago Process: 22193 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 22195 (code=exited, status=0/SUCCESS) [root@lb01 /]# netstat -antup | grep nginx #此時,備節點已接管: [root@lb02 /]# ip a | egrep "192.168.103.120|192.168.103.130" inet 192.168.103.130/24 scope global secondary enp0s3:2 inet 192.168.103.120/24 scope global secondary enp0s3:1
[root@lb01 /]# vim /etc/keepalived/chk_nginx_proxy.sh #!/bin/bash if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then service keepalived stop fi # 修改屬性(可執行文件) [root@lb01 /]# chmod +x /etc/keepalived/chk_nginx_proxy.sh [root@lb01 /]# ls -l /etc/keepalived/chk_nginx_proxy.sh -rwxr-xr-x. 1 root root 100 8月 31 13:39 /etc/keepalived/chk_nginx_proxy.sh
此時,Keepalived服務的完整配置爲:
[root@lb01 /]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 786744873@qq.com # 郵箱隨便寫 } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 # 郵件服務器IP smtp_connect_timeout 30 router_id lb01 # id爲lb1,不能和其餘Keepalived節點相同(全局惟一) } vrrp_script chk_nginx_proxy { #定義vrrp腳本,檢測HTTP端口 script "/etc/keepalived/chk_nginx_proxy.sh" #執行腳本,當Nginx服務有問題,就停掉Keepalived服務 interval 2 #間隔2秒 weight -60 } vrrp_instance VI_1 { # 實例名字爲VI_1,相同實例的備節點名字要和這個相同 state MASTER # 狀態爲MASTER,備節點狀態須要爲BACKUP interface enp0s3 # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱 virtual_router_id 55 # 實例ID爲55,要和備節點相同 priority 150 # 優先級爲150,備節點的優先級必須比此數字低 advert_int 1 # 通訊檢查間隔時間1秒 authentication { auth_type PASS # PASS認證類型,此參數備節點設置和主節點相同 auth_pass 1111 # 密碼1111,此參數備節點設置和主節點相同 } virtual_ipaddress { 192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同 } track_script { chk_nginx_proxy # 觸發檢查 } } vrrp_instance VI_2 { state BACKUP interface enp0s3 virtual_router_id 56 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同 } }
下面測試接管結果
#先殺掉以前的後臺進程腳本的運行,以後進行以下操做 [root@lb01 /]# /usr/local/nginx/sbin/nginx [root@lb01 /]# netstat -antup | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3937/nginx [root@lb01 /]# service keepalived start Starting keepalived: [ OK ] [root@lb01 /]# service keepalived status keepalived (pid 3949) is running... [root@lb01 /]# ip a | grep 192.168.103.120 inet 192.168.103.120/24 scope global secondary eth0:1 [root@lb01 /]# /usr/local/nginx/sbin/nginx -s stop [root@lb01 /]# ip a | grep 192.168.103.120 [root@lb01 /]# service keepalived status keepalived is stopped #當停掉Nginx的時候,Keepalived 2秒鐘內會被自動停掉,VIP被釋放,由對端接管,這樣就實現了即便服務宕機也會進行IP漂移,業務切換。
注意:本人測試後發現方法2不會中止keepalived,只會進行MASTER轉移
當在同一個局域網內部署了多組Keepalived服務器對,而又未使用專門的心跳線通訊時,可能會發生高可用接管的嚴重故障問題。以前已經講解過Keepalived高可用功能是經過VRRP協議實現的,VRRP協議默認經過IP多播的形式實現高可用對之間的通訊,若是同一個局域網內存在多組Keepalived服務器對,就會形成IP多播地址衝突問題,致使接管錯亂,不一樣組的Keepalived都會使用默認的224.0.0.18做爲多播地址。此時的解決辦法是,在同組的Keepalived服務器全部的配置文件裏指定獨一無二的多播地址,配置以下:
global_defs router_id LVS_19 vrrp_mcast_group4 224.0.0.19 #這個就是指定多播地址的配置 } #提示: 1)不一樣實例的通訊認證密碼也最好不一樣,以確保接管正常。 2)另外一款高可用軟件Heartbeat,若是採用多播方式實現主備通訊,一樣會有多播地址衝突問題。
檢測思路:在備節點上執行腳本,若是能夠ping通主節點而且備節點有VIP就報警,讓人員介入檢查是否裂腦。
[root@lb02 /]# vim /etc/keepalived/check_split_brain.sh #!/bin/bash lb01_vip=192.168.103.120 lb01_ip=192.168.103.121 while true do ping -c 2 -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then echo "ha is split brain.warning." else echo "ha is OK" fi sleep 5 done [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh ha is OK ha is OK ha is OK #正常狀況下,主節點活着,VIP 192.168.103.121在主節點,所以不會報警,提示「ha is OK」
// lb01 [root@lb01 /]# service keepalived stop Redirecting to /bin/systemctl stop keepalived.service [root@lb01 /]# ip a | grep 192.168.103.120 [root@lb01 /]# // lb02 [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh ha is split brain.warning. ha is split brain.warning. ha is split brain.warning.
// lb02 [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh ha is split brain.warning. ha is split brain.warning. ha is split brain.warning. ha is split brain.warning. ha is split brain.warning. ha is split brain.warning. ha is split brain.warning. ha is OK ha is OK ha is OK #裂腦報警恢復了。