zookeeper

147 阅读4分钟

一,ZK所在位置

image.png

非第一次启动

二,是什么

开源分布式,为分布式框架提供服务的apache项目

三,干什么

1--接受中间件的注册 2--管理注册者的状态 3--通知观察者注册者的状态 zookeeper==文件系统+通知机制

四,特点

(1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。

(2)Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。

(3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

(4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出。

(5)数据更新原子性,一次数据更新要么成功,要么失败。

(6)实时性,在一定时间范围内,Client能读到最新数据。

五,组成

由一个leader(领导者)和若干个follower(跟随者)组成。

每个节点都存在消息副本

六,数据结构

  1. ---与Linux类似,每个节点被称作一个ZNode
  2. ---每个节点默认存储1MB数据,且都是唯一标识

七,应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

●统一命名服务

在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。

●统一配置管理

(1)分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。

(2)配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。

●统一集群管理

(1)分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。

(2)ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。

●服务器动态上下线

客户端能实时洞察到服务器上下线的变化。

●软负载均衡

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

八,选举机制

第一次启动

  1. --服务器A启动发起选举并投自己一票,此时服务器只有一票,并不够半数以上,服务器继续保持lookige状态
  2. --服务器B启动发起选举并投自己一票,此时服务器共有两台,服务器A比较与B的myid,如果myid比B的小,A投票给B。此时服务器为双数,AB继续保持looking状态
  3. --服务器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时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加