1.zookeeper监听器原理
1.首先要有一个main()线程
2.在main线程中创建zk客户端,zk客户端会创建两个线程,分别是: lintener()(负责监听)和connect()(负责网络连接通信)
3.connect()线程将注册的监听事传给zookeeper
4.zookeeper监听器中的注册监听列表会把注册的监听事件添加进去。
5.zookeeper一旦监听到路径或者数据有所改变会向listener()线程发送消息。
6.listener()线程内部调用了process()方法。
监听器监听的事件:
1.zookeeper监听节点位置发生变化get path [watch]
2.zookeeper监听节点增减的变化。 ls path[watch]
2.zookeeper选举机制
(1)半数机制:只有集群中有半数以上机器正存活,集群可用,zookeeper中适合安装半数台服务器。
(2)zookeeper配置文件中没有指定master和slave,它工作时,有一个节点为leader,其他为follewer,leader需要通过内部选举临时产生,选举的机制是投票投给集群id最大的机器,当他获得集群中机器数量一半以上的选票时,会当选为leader。
(3)以一个简单的例子讲述一下zookeeper的选举过程,首先有一个五台机器组成的集群,他们的id为1-5,同时它们都是最新启动的,没有历史数据,在存放数据量方面没有区别,假设这些服务器依次启动,看看会发生什么:
1.当服务器1启动,发起一次选举,因为只有它一台机器,所以它会给自己投一票,由于没有超过半数选票(3票),所以选举无法完成,节点1处于looking状态
2.当服务器2启动时,服务器1和服务器2都会投自己一票,然后交换选票信息,此时服务器1发现服务器2的id大于它原来推举的id(服务器1),更改选票为推举服务器2,此时,服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2都处于looking状态。
3.当服务器3启动时,发起一次选举,服务器3会投自己一票,服务器1和服务器2都会把选票投给服务器器3,此时,机器3得到三票,恰好超过集群数量的一半,服务器3当选为leader,服务器1和服务器2的状态更改为following,服务器3状态改为leading。
4.当服务器4启动时,发起一次选举,此时服务器1,2,3已经都不是lookinjg状态,他们不会更改自己的选票信息,此时服务器1:0票,服务器2:0票,服务器3:3票,服务器4:1票,此时服务器4服从多数,更改选票信息为服务器3,并且把状态更改为following。
5.服务器5启动,同服务器4,服从多数,把票投给服务器3,更改状态为follower。