使用curator实现选举

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 概述使用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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
4月前
|
消息中间件 分布式计算 算法
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(上)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
249 0
|
4月前
|
监控 算法 网络协议
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(下)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
57 1
Zookeeper Leader选举机制
Zookeeper Leader选举机制
74 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
Zookeeper系列——一文带你了解Zookeeper的选举机制
572 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
【ZooKeeper】⑤ ZooKeeper 的选举机制
在进行 ZooKeeper 集群启动的时候,集群中会有 Leader 节点和 Follower 节点。 一个集群中只会有一个 Leade r节点。启动 ZooKeeper 集群的时候 Leader 并不是固定的,而是通过一定的选举策略产生的。 选择 Leader 节点的时候需要进行投票(Vote)。其中每个集群节点(服务器)都可以进行投票,并把自己的投票结果发送给其他的所有节点。投票的主要的信息 Vote 包含两个字段 myid 和 zxid myid 是服务器节点的 id(服务器的标记) zxid 是选举的全局事务 id(zxid 每次选举都会递增,选举轮次)
137 0
【ZooKeeper】⑤ ZooKeeper 的选举机制
Zookeeper的Leader选举
Leader选举是保证分布式数据一致性的关键所在。Leader选举分为Zookeeper集群初始化启动时选举和Zookeeper集群运行期间Leader重新选举两种情况。在讲解Leader选举前先了解一下Zookeeper节点4种可能状态和事务ID概念。
124 0
Zookeeper的Leader选举
Zookeeper选举机制
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
Zookeeper选举机制
|
分布式计算 资源调度 Hadoop
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
|
算法 网络协议
【Zookeeper】源码分析之Leader选举(一)
分析完了Zookeeper中的网络机制后,接着来分析Zookeeper中一个更为核心的模块,Leader选举。
168 0
【Zookeeper】源码分析之Leader选举(一)