版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://gudepeng.github.io/note/2019/12/09/curator/
demo样例:https://github.com/gudepeng/demoproject/tree/master/curator
一.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()方法保证了该节点在释放领导权后还可能获得领导权。