img

1.What is ZooKeeper?💫

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable.

Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage.

Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

  • Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
  • 简单来说zookeeper=文件系统+监听通知机制。令人头秃 👴

2.Zookeeper What can to be done?🙌

  1. Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务
  2. 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等
  3. zookeeper功能非常强大,可以实现诸如
  4. 分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能
  5. 我们这里拿比较简单的分布式应用配置管理为例来说明。
  6. 假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
  7. 使用案例 mycat中使用zookeeper
  8. img

3.特性

1.全局数据一致:集群中每个服务器保存一份相同的数据副本,client无论连接到哪个服务器,展示的数据都是一致的,这是最重要的特征;
2.可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受。
3.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
4.数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态;
5.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。

4.架构布局

zookeeper本身可以是单机模式,也可以是集群模式,为了zookeeper本身不出现单点故障,通常情况使用集群模式,而且是master/slave模式的集群。

img

  • Zookeeper集群中的角色介绍
    1. Leader Leader不直接接受client的请求,但接受由其他Follower和Observer转发过来的Client请求,此外,Leader还负责投票的发起和决议,即时更新状态和数据。
    2. Follower Follower角色接受客户端请求并返回结果,参与Leader发起的投票和选举,但不具有写操作的权限。
    3. Observer Observer角色接受客户端连接,将写操作转给Leader,但Observer不参与投票(即不参加一致性协议的达成),只同步Leader节点的状态,Observer角色是为集群系统扩展而生的。
  • Zookeeper 的读写机制
    1. Zookeeper是一个由多个server组成的集群
    2. 一个leader,多个follower
    3. 每个server保存一份数据副本
    4. 全局数据一致
    5. 分布式读写
    6. 更新请求转发,由leader实施
  • Zookeeper 的保证
    1. 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
    2. 数据更新原子性,一次数据更新要么成功,要么失败
    3. 全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的
    4. 实时性,在一定时间范围内,client能读到最新数据
  • Zookeeper节点数据操作流程
    1. 在Client向Follwer发出一个写的请求
      • Follwer把请求发送给Leader
      • Leader接收到以后开始发起投票并通知Follwer进行投票
      • Follwer把投票结果发送给Leader
      • Leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给Follwer,然后
      • commit;
      • Follwer把请求结果返回给Client
    2. Follower主要有四个功能:
      • 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
      • 接收Leader消息并进行处理;
      • 接收Client的请求,如果为写请求,发送给Leader进行投票;
      • 返回Client结果。
    3. Follower的消息循环处理如下几种来自Leader的消息
      • PING消息: 心跳消息;
      • PROPOSAL消息:Leader发起的提案,要求Follower投票;
      • COMMIT消息:服务器端最新一次提案的信息;
      • UPTODATE消息:表明同步完成;
      • REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
      • SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
  • leader 选举
    1. 选举流程图:因为每个服务器都是独立的,在启动时均从初始状态开始参与选举,下面是简易流程图。
    2. img
    3. 选举状态图描述Leader选择过程中的状态变化,这是假设全部实例中均没有数据,假设服务器启动顺序分别为:A,B,C。img
    4. 目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
      • 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
      • 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
      • 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
      • 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
      • 服务器5启动,后面的逻辑同服务器4成为小弟。

5.借鉴网址

https://www.cnblogs.com/raphael5200/p/5285267.html
https://blog.csdn.net/java_66666/article/details/81015302
https://blog.csdn.net/weixin_43893397/article/details/103458575
https://www.cnblogs.com/ASPNET2008/p/6421571.html 这个大🐂
https://blog.csdn.net/sunjin9418/article/details/80138370