Curator如何实现基于zookeeper leader选举,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一,基本介绍
Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,处理复杂的链接管理,重试操作。下面是它的一些特点:
1,自动连接管理。
A),存在的潜在错误情况,需要ZooKeeper客户端创建连接和/或重试操作。Curator 自动和透明(主要)处理这些情况。
B),监视NodeDataChanged事件,并根据需要调用updateServerList()。
C),Watches 会被Curator recipes自动移除。
2,简洁的API
A),提供现代简洁的接口
B),简化了zookeeper原生的方法,事件等。
3,实现了很多功能
A),Leader选举
B),共享锁
C),队列
D),Barriers
E),Counters
F),Caches
G),Nodes
本文主要是讲解leader选举。
现在分布式系统,基本架构模型架构是master/slaves,
二,leader选举
分布式系统中,一般都是master/slaves结构,为了容灾一般都是希望启动多个master,一个Leader,若干Followers,Leader宕机有Followers选举一个再做Leader。之所以,多个Master之间需要选举出Leader,实际上是为了保证数据的强一致性。
Zookeeper就是我们做Leader选举和配置下发的好的一种框架。
CuratorFramework
该类实例是线程安全的,一个应用程序最好公用一个。可以通过CuratorFrameworkFactory创建实例。
Leader选举的主要类,两个构造
public LeaderLatch(CuratorFramework client, String latchPath)Parameters: client - the client latchPath - the path for this leadership grouppublic LeaderLatch(CuratorFramework client, String latchPath, String id)Parameters: client - the client latchPath - the path for this leadership groupid - participant ID
public boolean hasLeadership() Return true if leadership is currently held by this instance
<properties>
<curator.version>3.2.1</curator.version>
</properties>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
2,LeaderLatchListenerImpl
public class LeaderLatchListenerImpl implements LeaderLatchListener {
@Override
public void isLeader() {
// TODO Auto-generated method stub
System.out.println("master");
}
@Override
public void notLeader() {
// TODO Auto-generated method stub
System.out.println("slave");
}
}
3,LeaderLatchListener
public class LeaderLatchMain {
private static final String PATH = "/examples/leader";
public static void main(String[] args) throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient("106.75.13.87:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
LeaderLatch leaderLatch = new LeaderLatch(client, PATH,args[0]);
leaderLatch.addListener(new LeaderLatchListenerImpl());
try {
leaderLatch.start();
Thread.sleep(10000);
System.out.println(leaderLatch.getLeader());
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
leaderLatch.close();
client.close();
}
}
}
java -jar LeaderLatchMain.jar 1java -jar LeaderLatchMain.jar 2
第一次启动的时候leader
杀死Leader后
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。