簡介
在分布式計算中,主節點選舉是為了把某個進程作為主節點來控制其它節點的過程。在選舉結束之前,我們不知道哪個節點會成為主節點。curator對於主節點選舉有兩種實現方式,本文示例演示Latch的實現示例。
官方文檔:http://curator.apache.org/curator-recipes/leader-latch.html
javaDoc:http://curator.apache.org/apidocs/org/apache/curator/framework/recipes/leader/LeaderLatch.html
代碼示例
zookeeper的選舉是通過爭搶最小節點來實現的,這里添加了爭搶結果的監聽,如果當前節點編程主節點則觸發isLeader,如果當前節點從主節點變成非主節點則觸發notLeader
import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.leader.LeaderLatch; import org.apache.curator.framework.recipes.leader.LeaderLatchListener; import org.apache.curator.retry.ExponentialBackoffRetry; public class LatchDemo { private static CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(3000, 3)); private static String path = "/master"; private static String id = "0001"; public static void main(String[] args) throws Exception { // curator客戶端啟動 client.start(); // 創建選舉實例 LeaderLatch latch = new LeaderLatch(client, path, id); // 添加選舉監聽 latch.addListener(new LeaderLatchListener() { @Override public void isLeader() { // 如果成為master則觸發 System.out.println("is leader"); } @Override public void notLeader() { // 如果從主節點變成非主節點則觸發 System.out.println("not leader"); } }); // 加入選舉 latch.start(); // curator客戶端關閉 client.close(); } }
主節點選舉出了Curator客戶端需要star以外,latch也需要start,當然latch也會配對着一個close。start意味着參加選舉,close意味着退出選舉。