使用curator实现分布式master选举

2019/12/09 curator

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

Search

    Table of Contents