Zookeeper
zookeeper文件目录
bin
conf
zoo.cfg
配置文件
myzkData
myid
身份标志
…等等
选举机制
出现以下情况会进入leader选举
- 服务器
初始化
启动 - 服务器运行期间无法和
Leader
保持连接
每个zookeeper服务器都具有的东西
1)服务器初始化启动
选票都给
myid最大
的那个,选出了leader后,后面进来的zookeeper只能成为follower
2)服务器运行期间无法和Leader保持连接
当服务器运行期间无法与Leader保持连接后,无论是当前服务器出错了还是leader出错了,当前服务器都会认为是leader出错而发起选举。这个时候就会出现两种情况
-
集群中本来就已经存在一个Leader
机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。
-
集群中确实不存在Leader
选举Leader规则: ①EPOCH大的直接胜出 ②EPOCH相同,事务id大的胜出 ③事务id相同,服务器id大的胜出
大的直接胜出 ②EPOCH相同,事务id大的胜出 ③事务id相同,服务器id大的胜出
监听器原理
分为zk客户端和服务端
1、zk客户端main()线程
2、创建zkclient
- listener
- connect
3、zkclient用getChildren("/",true)获取监听
4、当zk集群中"/"发生节点变化时反应给zkclient->listener
5、zkclient调用watcher中process()做出反应
利用Zookeeper实现分布式锁
在zookeeper集群中创建locks节点
当上锁时:
{
在locks创建带序号的非永久节点
判断创建节点的序号{
如果序号小于0,数据错误
序号大于0,利用zookeeper watcher对节点删除进行监听,如果删除了节点且为当前序号前一位则继续
序号等于0,立刻获取锁
}
}
释放锁:{
删除对应创建的非永久节点
}
/**
* 基于Zookeeper的分布式锁
*/
public class DistributedLock {
private final ZooKeeper zooKeeper;
private final CountDownLatch connect = new CountDownLatch(1);
private final CountDownLatch wake = new CountDownLatch(1);
private String preNode;
private String currentNode;
public DistributedLock() throws IOException, InterruptedException, KeeperException {
//创建zookeeper客户端
String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"<