簡體   English   中英

Zookeeper 多領導選舉問題

[英]Zookeeper multiple leader election issue

我有一個使用 ZooKeeper 進行領導選舉的分布式應用程序。 Only the elected leader can commit to the database. 我最近發現有一種潛在的情況可能會導致多個領導者。 The situation arises when the elected leader is paused for a long GC and can lose the heartbeat to the ZooKeeper, leading to the election of a new leader. 此時,兩個節點都認為自己是領導者,可能會導致沖突。

關於如何避免這種情況的任何建議?

當您使用ZooKeeper進行領導者選舉時,您無法保證領導者獨特性。即使沒有GC暫停,也可能遇到這種情況。 例如,當在網絡分區期間領導者與ZooKeeper仲裁隔離時,或者當領導者發出長時間運行的查詢時,死亡和新領導者可以在當前仍處於活動狀態時發出新查詢。

解決方法是在更新數據庫時使用比較和設置。 一旦選出新的領導者,您應該獲得越來越多的領導者ID(例如,通過更新ZooKeeper中的節點並使用其版本或mzxid)並使用它來保護該領導者發布的每個交易。

例如,如果要更改db的狀態,則代替以下事務:

BEGIN TRANSACTION;
db.update($change);
END TRANSACTION;

你應該使用類似的東西

BEGIN TRANSACTION;
if (db.leaderID <= $leaderID) {
    db.leaderID = $leaderID;
    db.update($change);
}
END TRANSACTION;

這個技巧將保護您的系統免受並發領導者造成的不確定性。 當然, 您的數據庫應該是可線性化的,並且支持比較和設置。

為了更正答案之一,Zookeeper 確實通過基於仲裁的一致性保證了網絡分區上的領導者唯一性。 在網絡分區時,如果領導者與仲裁隔離,它將由於無法連接到仲裁節點而失去領導權。 同時,在另一個分區中選舉了一個新的領導者。 同理,老領導所在的分區無法選舉新領導。 通過發布新的領導者選舉恢復網絡分區后,這種情況得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM