使用curator實現分佈式master選舉

NO IMAGE

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:gudepeng.github.io/note/2019/1…
demo樣例:github.com/gudepeng/de…

一.curator概念

1.curator是什麼?

curator是Netflix公司開源的一個Zookeeper客戶端,後來捐獻給了Apache,Curator框架在zookeeper原生API接口上進行了包裝,
解決了很多ZooKeeper客戶端非常底層的細節開發。提供ZooKeeper各種應用場景(分佈式鎖、leader選舉、共享計數器、
緩存機制、分佈式隊列等)的抽象封裝。

2.leader選舉概念

在我們開發分佈式系統的時候,需要一個master節點去管理,但是隻有一個master節點的話,master掛掉了,整個分佈式系統就運行不了了,所以在考慮
高可用的情況下,我們要簡歷master集群,並且在master集群中選擇出來一個leader求執行任務。

3.curator選舉的兩種方式

1.LeaderLatch:

根據一個根路徑,多臺客戶端在該路徑下創建臨時順序節點,例如:leader/node_1,leader/node_2,leader/node_3,節點編號最小的客戶端成為leader,沒搶到
leader的節點都監聽前一個節點的刪除事件,在前一個節點刪除後重新搶主。

2.LeaderSelector:

利用分佈式鎖進行搶主,搶到鎖的就是主節點。

二.curator代碼實現

1.引包

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>

2.註冊zookeeper

RetryPolicy retryPolicy  = new ExponentialBackoffRetry(zkConfig.getBaseSleepTimeMs(),zkConfig.getMaxRetries());
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(zkConfig.getServer())
.retryPolicy(retryPolicy)
.namespace(zkConfig.getNamespace())
.build();
client.start();

3.LeaderLatch方式選主

String lockPath = "/leader";
LeaderLatch leaderLatch = new LeaderLatch(client,lockPath);
LeaderLatchListener listener = new LeaderLatchListener() {
@Override
public void isLeader() {
System.out.println("i am master");
}
@Override
public void notLeader() {
System.out.println("i am salver");
}
};
leaderLatch.addListener(listener);
leaderLatch.start();
leaderLatch.await();

解析:創建LeaderLatch對象,client為zookeeper的CuratorFramework對象,lockPath為競爭目錄,LeaderLatchListener中當節點成獲得領導權時觸發isLeader方法
當主節點失去領導權(調用close方法,和zookeeper失去連接等情況)後觸發notLeader方法。只有主節點能夠繼續執行leaderLatch.await()後的代碼,沒有搶到主的會一直等待。

4.LeaderSelector方式選主

String lockPath = "/leader";
LeaderSelector leaderSelector = new LeaderSelector(client,lockPath,new LeaderSelectorListenerAdapter(){
@Override
public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
System.out.println("i am master");
}
});
leaderSelector.autoRequeue();
leaderSelector.start();

解析:創建LeaderSelector對象,client為zookeeper的CuratorFramework對象,lockPath為競爭目錄,當被選舉為主節點後執行takeLeadership方法,當方法執行
完成後,釋放領導權。autoRequeue()方法保證了該節點在釋放領導權後還可能獲得領導權。

相關文章

100行代碼拆解EventBus核心邏輯(三)

基於Gitlab進行開發團隊管理的嘗試——02.成員負載可視化

feign中的hytrix和turbin配置

來吧!一文徹底搞定哈希表!