ZooKeeper集群解析。

这篇文章中来介绍一下 ZooKeeper 相关的集群角色,还有 ZAB协议,集群的安装在 ZooKeeper入门 中有介绍。

一、ZooKeeper集群中的角色

  • Leader 集群工作机制中的核心事务请求的唯一调度和处理者,保证集群事务处理的顺序集群内部个服务器的调度者(管理 follower,数据同步),为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。
  • Follower 集群工作机制中的跟随者处理非事务请求,为客户端提供读服务,如果是写服务则转发给Leader,参与事务请求 proposal 投票参与 leader 选举投票。
  • Observer 观察者3.30 以上版本提供,和 follower 功能相同,但不参与任何形式投票处理非事务请求,转发事务请求给 Leader 提高集群非事务处理能力,如果版本高于3.30需要配置使用方式:server.0=192.168.182.130:2888:3888:Observer

二、ZooKeeper集群一致性协议ZAB

ZAB协议的实现借鉴于 Paxos,是为了解决分布式系统的数据一致性问题。

1. 总览

zookeeper 就是根据 zab 协议建立了主备模型完成集群的数据同步(保证数据的一致性),前面介绍了集群的各种角色,这说所说的主备架构模型指的是,在 zookeeper 集群中,只有一台 leader(主节点)负责处理外部客户端的事务请求(写操作),leader 节点负责将客户端的写操作数据同步到所有的 follower 节点中,大概流程如下:

  1. zab 协议核心是在整个 zookeeper 集群中只有一个节点既 leader 将所有客户端的写操作转化为事务(提议 proposal),leader 节点再数据写完之后,将向所有的 follower 节点发送数据广播请求(数据复制)。
  2. 等所有的 follower 节点的反馈。
  3. 在 zab 协议中,只要超过半数 follower 节点反馈 ok,leader 节点会向所有 follower 服务器发送 commit 消息,既将 leader 节点上的数据同步到 follower 节点之上。

2. 崩溃恢复

什么时候会发生崩溃恢复?

  1. 当服务器启动时
  2. 当leader 服务器出现网络中断,崩溃或者重启的情况
  3. 当集群中已经不存在过半的服务器与Leader服务器保持正常通信

崩溃恢复的过程

  1. 每个 Server 会发出一个投票,第一次都是投自己。投票信息:(myid,ZXID)
  2. 收集来自各个服务器的投票
  3. 处理投票并重新投票,处理逻辑:优先比较 ZXID,然后比较 myid
  4. 统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定 leader
  5. 改变服务器状态

为什么要有限比较ZXID呢?

因为ZXID为事务id,值越大,证明它的数据最新。

在这个选举过程中每个 Server 有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻
  • LEADING:当前Server即为选举出来的leader
  • FOLLOWING:leader已经选举出来,当前Server与之同步

两种特殊情况

  1. 已经被处理的事务请求(proposal)不能丢(commit的)。
  2. 没被处理的事务请求(proposal)不能再次出现。

情况一的出现场景:

当 leader 收到合法数量 follower 的 ACK 后,就向各个 follower 广播 commit 命令,同时也会在本地执行 commit 并向连接的客户端返回 成功,但是如果在各个 follower 在收到 commit 命令前 leader 就挂了,导致剩下的服务器并没有执行都这条消息。

那么这种情况要怎么处理呢?

1、选举 ZXID 最大的节点作为新的 leader:由于所有提案被 commit 之前必须有合法数量的 follower ACK,即必须有合法数量的服务器的事务日志上有该 proposal,因此,ZXID 最大也就是数据最新的节点保存了所有被 commit 消息的 proposal 状态。

2、新的 leader 将自己事务日志中 proposal 但未 COMMIT 的消息处理。

3、新的 leader 与 follower 建立先进先出的队列, 先将自身有而 follower 没有的 proposal 发送给 follower,再将这些 proposal 的 COMMIT 命令发送给 follower,以保证所有的 follower 都保存了所有的 proposal、所有的 follower 都处理了所有的消息,通过以上策略,能保证已经被处理的消息不会丢。

情况二的出现场景

当 leader 接收到消息请求生成 proposal 后就挂了,其他 follower 并没有收到此 proposal,因此经过恢复模式重新选了 leader 后,这条消息是被跳过的,此时,之前挂了的 leader 重新启动并注册成了 follower,他保留了被跳过消息的 proposal 状态,与整个系统的状态是不一致的,所以需要将其删除。

3. 消息广播

在 zookeeper 集群中数据副本的传递策略就是采用的广播模式,Zab 协议中的 leader 等待 follower 的 ack 反馈,只要半数以上的 follower 成功反馈就好,不需要收到全部的 follower 反馈。

具体步骤如下:

  1. 客户端发起一个写操作请求
  2. Leader 服务器将客户端的 request 请求转化为事物 proposql 提案,同时为每个 proposal 分配一个全局唯一的 ID,即 ZXID
  3. leader 服务器与每个 follower 之间都有一个队列,leader 将消息发送到该队列
  4. follower 机器从队列中取出消息处理完(写入本地事物日志中)毕后,向 leader 服务器发送 ACK 确认
  5. leader 服务器收到半数以上的 follower 的 ACK 后,即认为可以发送 commit
  6. leader 向所有的 follower 服务器发送 commit 消息

都读到这里了,来个 点赞、评论、关注、收藏 吧!

文章作者:IT王小二

首发地址:https://www.itwxe.com/posts/2c8e19cc/

版权声明:文章内容遵循 署名-非商业性使用-禁止演绎 4.0 国际 进行许可,转载请在文章页面明显位置给出作者与原文链接。

ZooKeeper集群解析的更多相关文章

  1. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

  2. Zookeeper集群的安装和使用

    Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google ...

  3. 安装zookeeper集群

    zookeeper集群的安装   顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache So ...

  4. Kafka/Zookeeper集群的实现(二)

    [root@kafkazk1 ~]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12. ...

  5. Centos6下zookeeper集群部署记录

    ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目的 最终一致性:client不论 ...

  6. Zookeeper集群搭建以及python操作zk

    一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...

  7. zookeeper集群的部署

    因为这里zookeeper的集群部署都会2n+1台 Dubbo建议使用Zookeeper作为服务的注册中心. Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基 ...

  8. 关于Linux系统下zookeeper集群的搭建

    1.集群概述 1.1什么是集群 1.1.1集群概念 集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系 ...

  9. hadoop+zookeeper集群高可用搭建

                                                                  hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...

随机推荐

  1. copy函数与ostream_iterator、reverse_iterator

    #include <iostream> #include <iterator> #include <vector> int main() { using names ...

  2. NumPy之:ndarray中的函数

    NumPy之:ndarray中的函数 目录 简介 简单函数 矢量化数组运算 条件逻辑表达式 统计方法 布尔数组 排序 文件 线性代数 随机数 简介 在NumPy中,多维数组除了基本的算数运算之外,还内 ...

  3. 【转载】fedora22和win10之间的文件共享互访

    fedora22和win10之间的文件共享互访 钢铁侠与孔子 关注 2016.06.04 14:10* 字数 1327 阅读 2170评论 0喜欢 1 一,相关知识了解(本文执行环境为fedora22 ...

  4. 【例 3】 修改 bols 文件的 atime 和 mtime。 [root@localhost ~]# touch -d "2017-05-04 15:44" bols

    Linux touch命令:创建文件及修改文件时间戳 < Linux删除空目录(rmdir命令)Linux在文件之间建立软/硬链接(ln命令) > <Linux就该这么学>是一 ...

  5. STM32的时钟系统RCC详细整理(转载)

    一.综述: 1.时钟源 在 STM32 中,一共有 5 个时钟源,分别是 HSI . HSE . LSI . LSE . PLL . ①HSI 是高速内部时钟, RC 振荡器,频率为 8MHz : ② ...

  6. mysql事务实现方式

    事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性. 原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 由und ...

  7. Java反射机制详情

    1.运行环境 JDK8+lntellij IDEA 2018.3 2.反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个 ...

  8. fragment textWatcher的设置位置

    override fun onStart() { super.onStart() Log.d("------------", "1") val titleWat ...

  9. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.8 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  10. Linux下RAID磁盘阵列的原理与搭建

    RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有"独立磁盘构成的具有冗余能力的阵列"之意. 磁盘阵列是由很多价格较 ...