Curator是一個非常流行的Zookeeper開源客戶端,是Netflix公司開源的一套ZooKeeper客戶端框架,作者是Jordan Zimmerman。它解決了很多ZooKeeper客戶端非常底層的細節開發工作,包括連接重連、反覆註冊Watcher和NodeExistsException異常等,目前已經成爲Apache的頂級項目,是全世界範圍內使用最廣泛的ZooKeeper客戶端之一。
在分佈式系統中,經常會遇到這樣的場景:對於一個複雜的任務,僅需要從集羣中選舉出一臺進行處理即可。諸如此類的分佈式問題,我們統稱爲“Master選舉”。
以上內容摘抄自《從PAXOS到ZOOKEEPER分佈式一致性原理與實踐》。
這本書上有一個Master選舉的代碼示例,但我覺得沒有這篇博客上http://blog.csdn.net/wo541075754/article/details/70216046 寫的好,摘抄如下:
public class RecipesMasterSelect {
private static final String PATH = "/demo/leader";
public static void main(String[] args) {
List<LeaderSelector> selectors = new ArrayList<>();
List<CuratorFramework> clients = new ArrayList<>();
try {
for (int i = 0; i < 10; i++) {
CuratorFramework client = getClient();
clients.add(client);
final String name = "client#" + i;
LeaderSelector leaderSelector = new LeaderSelector(client, PATH, new LeaderSelectorListener() {
@Override
public void takeLeadership(CuratorFramework client) throws Exception {
System.out.println(name + ":I am leader.");
Thread.sleep(2000);
}
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
}
});
leaderSelector.autoRequeue();
leaderSelector.start();
selectors.add(leaderSelector);
}
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
} finally {
for(CuratorFramework client : clients){
CloseableUtils.closeQuietly(client);
}
for(LeaderSelector selector : selectors){
CloseableUtils.closeQuietly(selector);
}
}
}
private static CuratorFramework getClient() {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.retryPolicy(retryPolicy)
.sessionTimeoutMs(6000)
.connectionTimeoutMs(3000)
.namespace("demo")
.build();
client.start();
return client;
}
}
我引入的版本是:
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
控制檯上將會打印出選舉結果,太簡單方便了哈:
client#8:I am leader.
client#1:I am leader.
client#2:I am leader.
client#0:I am leader.
client#7:I am leader.
client#6:I am leader.
client#3:I am leader.
client#4:I am leader.
client#9:I am leader.
client#5:I am leader.
client#8:I am leader.
client#1:I am leader.