使用curator实现选举

本文涉及的产品
服务治理 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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
Zookeeper Leader选举机制
Zookeeper Leader选举机制
62 0
|
运维 监控 Java
Zookeeper客户端Curator使用
Zookeeper客户端Curator使用
Zookeeper客户端Curator使用
Zookeeper系列——一文带你了解Zookeeper的选举机制
Zookeeper系列——一文带你了解Zookeeper的选举机制
330 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
【ZooKeeper】⑤ ZooKeeper 的选举机制
在进行 ZooKeeper 集群启动的时候,集群中会有 Leader 节点和 Follower 节点。 一个集群中只会有一个 Leade r节点。启动 ZooKeeper 集群的时候 Leader 并不是固定的,而是通过一定的选举策略产生的。 选择 Leader 节点的时候需要进行投票(Vote)。其中每个集群节点(服务器)都可以进行投票,并把自己的投票结果发送给其他的所有节点。投票的主要的信息 Vote 包含两个字段 myid 和 zxid myid 是服务器节点的 id(服务器的标记) zxid 是选举的全局事务 id(zxid 每次选举都会递增,选举轮次)
126 0
【ZooKeeper】⑤ ZooKeeper 的选举机制
Zookeeper的Leader选举
Leader选举是保证分布式数据一致性的关键所在。Leader选举分为Zookeeper集群初始化启动时选举和Zookeeper集群运行期间Leader重新选举两种情况。在讲解Leader选举前先了解一下Zookeeper节点4种可能状态和事务ID概念。
111 0
Zookeeper的Leader选举
Zookeeper选举机制
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
Zookeeper选举机制
|
存储 SQL 缓存
zookeeper-paxos
在《常识五配置中心》文章中,少了一节关于zookeeper内容,现在补全 此篇也作为《从Paxos到zookeeper分布式一致性原理与实践》的读书笔记 这本书很早就出版了,现在才知道,惭愧。好书总是发现的晚,Better late than never! IT界日异月新,如果你还没有使用过ZK,那也可以跳过了,虽然现在大多数互联网架构都使用,但它也是个古老物件了。随着CoreOS和Kubernetes等项目在开源社区日益火热,etcd已是跃然而上,我司新一代配置中心架构也开始使用etcd代替zk 但功不唐捐,还是要努力抓住它的尾巴,回味一下错失的年华
401 0
zookeeper-paxos
|
分布式计算 资源调度 Hadoop
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
十、Zookeeper (leader)选举机制
|
算法 网络协议
【Zookeeper】源码分析之Leader选举(一)
分析完了Zookeeper中的网络机制后,接着来分析Zookeeper中一个更为核心的模块,Leader选举。
151 0
【Zookeeper】源码分析之Leader选举(一)

热门文章

最新文章