使用curator实现分布式master选举

版权声明:本文为博主原创文章,遵循 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/node1,leader/node2,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()方法保证了该节点在释放领导权后还可能获得领导权。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值