使用curator实现选举

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 概述使用zookeeper自己来实现选举还是有点麻烦的(使用zookeeper实现选举),这个时候可以使用curator正如官网所说,curator对于zookeeper就像guava对于java,它让我们能更加便利、可靠地使用zookeeper。

概述

使用zookeeper自己来实现选举还是有点麻烦的(使用zookeeper实现选举),这个时候可以使用curator

正如官网所说,curator对于zookeeper就像guava对于java,它让我们能更加便利、可靠地使用zookeeper。

这篇博客会介绍如何通过curator来实现选举。

使用方式

引入jar

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-client</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.11.0</version>
</dependency>

使用LeaderSelector实现选举

String zookeeperAddr = "127.0.0.1:2181";
//zk的重连策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//获取连接
CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperAddr, retryPolicy);
client.start();

String path = "/newserver/leader";  //选举的节点信息放在这个path下

//这里建议使用LeaderSelectorListenerAdapter,它实现了stateChanged,当与zk失连后,会自动取消领导权
LeaderSelector leaderSelector = new LeaderSelector(client, path, new LeaderSelectorListenerAdapter() {

    @Override
    public void takeLeadership(CuratorFramework client) throws Exception {
        System.out.println("成为leader了");
        Thread.sleep(10000);  //sleep 10秒
        //注意当takeLeadership方法返回之后,相当于放弃成为leader了
        System.out.println("放弃成为leader");
    }

});

//放弃领导权之后,自动再次竞选
leaderSelector.autoRequeue();
leaderSelector.start();

TimeUnit.HOURS.sleep(1);

测试结果

两个竞选者轮流成为leader

img_aff0ba49a32d28c99792d14cc142e986.png

img_ecd1b929707cab1c9490f544d38f08de.png

使用LeaderLatch来实现选举

String zookeeperAddr = "127.0.0.1:2181";
//重连策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//获取连接
CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperAddr, retryPolicy);
client.start();

String path = "/newserver/leader";
LeaderLatch leaderLatch = new LeaderLatch(client, path);
leaderLatch.start();
leaderLatch.await();//阻塞等待自己有领导权
System.out.println("成为leader了");
new BufferedReader(new InputStreamReader(System.in)).readLine();//输入参数后,放弃领导权

leaderLatch.close(); 
System.out.println("放弃成为leader,当前是否有领导权:" + leaderLatch.hasLeadership());
img_d80395ed1bd44c02ea2e2b25a76edd68.png

LeaderLatch与LeaderSelector的不同

1)LeaderSelector使用回调的方式来处理获取领导权之后的操作,LeaderLatch提供了类似于CountDownLatch的方式,可以阻塞程序,直到服务获取领导权为止。

https://stackoverflow.com/questions/17998616/leaderlatch-vs-leaderselector

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
运维 监控 Java
Zookeeper客户端Curator使用
Zookeeper客户端Curator使用
Zookeeper客户端Curator使用
Zookeeper Leader选举机制
Zookeeper Leader选举机制
81 0
|
API Apache
利用Zookeeper实现分布式应用的Leader选举
利用Zookeeper实现分布式应用的Leader选举
320 0
利用Zookeeper实现分布式应用的Leader选举
Zookeeper的Leader选举
Leader选举是保证分布式数据一致性的关键所在。Leader选举分为Zookeeper集群初始化启动时选举和Zookeeper集群运行期间Leader重新选举两种情况。在讲解Leader选举前先了解一下Zookeeper节点4种可能状态和事务ID概念。
137 0
Zookeeper的Leader选举
Zookeeper选举机制
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
Zookeeper选举机制
|
分布式计算 资源调度 Hadoop
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
|
算法 网络协议
【Zookeeper】源码分析之Leader选举(一)
分析完了Zookeeper中的网络机制后,接着来分析Zookeeper中一个更为核心的模块,Leader选举。
177 0
【Zookeeper】源码分析之Leader选举(一)
|
消息中间件 算法 网络协议
【分布式】Zookeeper的Leader选举
前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举。
162 0
【分布式】Zookeeper的Leader选举
|
消息中间件 算法 网络协议
【Zookeeper】源码分析之Leader选举(二)之FastLeaderElection
前面学习了Leader选举的总体框架,接着来学习Zookeeper中默认的选举策略,FastLeaderElection。
156 0