keepalived是如何解決或者防止腦裂問題的?
如題!heartbeat呢?
不能吧,參考 36. LVS: High Availability, Failover protection
keepalived has the same split brain problem as heartbeat.
- 可以採用第三方仲裁的方法。由於keepalived體系中主備兩台機器所處的狀態與對方有關。如果主備機器之間的通信出了網題,就會發生腦裂,此時keepalived體系中會出現雙主的情況,產生資源競爭。
- 一般可以引入仲裁來解決這個問題,即每個節點必須判斷自身的狀態。最簡單的一種操作方法是,在主備的keepalived的配置文件中增加check配置,伺服器周期性地ping一下網關,如果ping不通則認為自身有問題 。
- 最容易的是藉助keepalived提供的vrrp_script及track_script實現。如下所示。
global_defs {
router_id LVS_DEVEL
}
vrrp_sync_group VG_1 {
group {
VI_1
}
notify_master /root/slave2master.py
notify_backup /root/master2slave.py
}
vrrp_instance VI_1 {
vrrp_unicast_bind 192.168.150.21
vrrp_unicast_peer 192.168.150.20
state BACKUP
interface manbr
virtual_router_id 51
nopreempt
priority 100
advert_int 10
authentication {
auth_type PASS
auth_pass XXXX
}
virtual_ipaddress {
192.168.150.23 dev manbr
}
}
增加仲裁的配置:
global_defs {
router_id LVS_DEVEL
}
track_script {
check_local
}
vrrp_script check_local {
script "/root/check_gateway.sh"
interval 5
}
vrrp_sync_group VG_1 {
group {
VI_1
}
notify_master /root/slave2master.py
notify_backup /root/master2slave.py
}
vrrp_instance VI_1 {
vrrp_unicast_bind 192.168.150.21
vrrp_unicast_peer 192.168.150.20
state BACKUP
interface manbr
virtual_router_id 51
nopreempt
priority 100
advert_int 10
authentication {
auth_type PASS
auth_pass XXXX
}
virtual_ipaddress {
192.168.150.23 dev manbr
}
}
check_gateway.sh 就是我們的仲裁邏輯,發現ping不通網關,則關閉keepalived service keepalived stop。
該方法在伺服器通信正常之後無法再將keepalived啟動起來
4. 我認為更值得推薦的是自己寫腳本,寫一個while循環,每輪ping網關,累計連續失敗的次數,當連續失敗達到一定次數則運行service keepalived stop關閉keepalived服務。如果發現又能夠ping通網關,再重啟keepalived服務。
最後在腳本開頭再加上腳本是否已經運行的判斷邏輯,將該腳本加到crontab裡面。貌似RedHat Cluster 有防止split brain 的功能,可以看看。剩下keepalived和heartbeat都不具備。但是前者貌似包含heartbeat.
看了一下樓上評論,都沒有說全面.
HA 從機制上必須滿足2點(缺一不可):
1. 必須加入仲裁節點防止2個節點的腦裂問題.【2個節點無法確定對端問題,還是本地問題】
2. 必須增加fencing/stonith機制,防止出現短時間/瞬間的【『腦裂現象』】。【故障發現,故障切換,2個節點的時間順序上存在先後】
從這個點上看,2個節點的keepalived 做HA 是有風險。
keepalived支持多個網卡綁定同一個VIP嗎?或者聲明多個實例,每個實例使用一個網卡綁定不同VIP?如果可以的話,這樣可以防治腦力。
keepalived遵循的是VRRP協議,用的就是paxos演算法,或者近似的演算法來選主的,通訊走的是多播ip地址,映像中是這樣,具體可以看keepalived放在github上的源代碼,模塊是很清晰的。
推薦閱讀:
※類似COC那種大世界網遊的服務端是採取什麼樣的架構?
※伺服器集群為什麼節點間通信為什麼要用到RPC,這個是為了解決什麼問題?
※分散式與集群的區別是什麼?