一,ZK所在位置
非第一次启动
二,是什么
开源分布式,为分布式框架提供服务的apache项目
三,干什么
1--接受中间件的注册 2--管理注册者的状态 3--通知观察者注册者的状态 zookeeper==文件系统+通知机制
四,特点
(1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
(2)Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
(3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
(4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出。
(5)数据更新原子性,一次数据更新要么成功,要么失败。
(6)实时性,在一定时间范围内,Client能读到最新数据。
五,组成
由一个leader(领导者)和若干个follower(跟随者)组成。
每个节点都存在消息副本
六,数据结构
- ---与Linux类似,每个节点被称作一个ZNode
- ---每个节点默认存储1MB数据,且都是唯一标识
七,应用场景
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
●统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。
●统一配置管理
(1)分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。
(2)配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。
●统一集群管理
(1)分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。
(2)ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。
●服务器动态上下线
客户端能实时洞察到服务器上下线的变化。
●软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
八,选举机制
第一次启动
- --服务器A启动发起选举并投自己一票,此时服务器只有一票,并不够半数以上,服务器继续保持lookige状态
- --服务器B启动发起选举并投自己一票,此时服务器共有两台,服务器A比较与B的myid,如果myid比B的小,A投票给B。此时服务器为双数,AB继续保持looking状态
- --服务器C启动发起选举并投自己一票,此时服务器共有三台,服务器AB比较与C的myid,如果myid比C的小,则投票给C;AB任意一台投给C,票数大于半数,C当选leader,AB为follower。
非第一次启动
1--出现下列两种情况,则启动leader选举
• 服务器初始化启动
• 服务器运行期间无法与leader保持联系
注意:奇数台服务器才能启动成功。
2--进入leader选举时,可能出现下列两种情况
集群已经存在一个leader
解决方法----与lerder机器建立链接,并进行状态同步
集群不存在leader
---------选举leader优先级------
1.EPOCH大的直接胜出
2.EPOCH相同,事务id大的胜出
3.事务id相同,服务器id大的胜出
----术语解释----------
• SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
• ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑速度有关。
• Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加