ZooKeeper集群解析
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 节点中,大概流程如下:

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

2. 崩溃恢复
什么时候会发生崩溃恢复?
- 当服务器启动时
- 当leader 服务器出现网络中断,崩溃或者重启的情况
- 当集群中已经不存在过半的服务器与Leader服务器保持正常通信
崩溃恢复的过程
- 每个 Server 会发出一个投票,第一次都是投自己。投票信息:(myid,ZXID)
- 收集来自各个服务器的投票
- 处理投票并重新投票,处理逻辑:优先比较 ZXID,然后比较 myid
- 统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定 leader
- 改变服务器状态
为什么要有限比较ZXID呢?
因为ZXID为事务id,值越大,证明它的数据最新。
在这个选举过程中每个 Server 有三种状态:
- LOOKING:当前Server不知道leader是谁,正在搜寻
- LEADING:当前Server即为选举出来的leader
- FOLLOWING:leader已经选举出来,当前Server与之同步
两种特殊情况
- 已经被处理的事务请求(proposal)不能丢(commit的)。
- 没被处理的事务请求(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 反馈。
具体步骤如下:
- 客户端发起一个写操作请求
- Leader 服务器将客户端的 request 请求转化为事物 proposql 提案,同时为每个 proposal 分配一个全局唯一的 ID,即 ZXID
- leader 服务器与每个 follower 之间都有一个队列,leader 将消息发送到该队列
- follower 机器从队列中取出消息处理完(写入本地事物日志中)毕后,向 leader 服务器发送 ACK 确认
- leader 服务器收到半数以上的 follower 的 ACK 后,即认为可以发送 commit
- leader 向所有的 follower 服务器发送 commit 消息
都读到这里了,来个 点赞、评论、关注、收藏 吧!
文章作者:IT王小二
首发地址:https://www.itwxe.com/posts/2c8e19cc/
版权声明:文章内容遵循 署名-非商业性使用-禁止演绎 4.0 国际 进行许可,转载请在文章页面明显位置给出作者与原文链接。
ZooKeeper集群解析的更多相关文章
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- Zookeeper集群的安装和使用
Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google ...
- 安装zookeeper集群
zookeeper集群的安装 顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache So ...
- Kafka/Zookeeper集群的实现(二)
[root@kafkazk1 ~]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12. ...
- Centos6下zookeeper集群部署记录
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目的 最终一致性:client不论 ...
- Zookeeper集群搭建以及python操作zk
一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...
- zookeeper集群的部署
因为这里zookeeper的集群部署都会2n+1台 Dubbo建议使用Zookeeper作为服务的注册中心. Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基 ...
- 关于Linux系统下zookeeper集群的搭建
1.集群概述 1.1什么是集群 1.1.1集群概念 集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系 ...
- hadoop+zookeeper集群高可用搭建
hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...
随机推荐
- 简单说几个MySQL高频面试题
前言: 在各类技术岗位面试中,似乎 MySQL 相关问题经常被问到.无论你面试开发岗位或运维岗位,总会问几道数据库问题.经常有小伙伴私信我,询问如何应对 MySQL 面试题.其实很多面试题都是大同小异 ...
- re_path 的 ?P<>
- 风变编程(Python自学笔记)第11关-杀死那只“机”生虫
1.Debug:为程序排除错误. 2.SyntaxError:语法错误. 3.append()函数是列表的一个方法,要用句点.调用,且append()每次只能接受一个参数. 4.解决思路不清的两个工具 ...
- 17.继承 and18.接口和多态 内部类 匿名内部类,Lambda表达式
1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现 ...
- Vue3响应式系统api 之 ref reactive
reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的 Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...
- Linux权限问题(2)-unzip引发的权限问题
背景:依然是上一个朋友,在用php调用unzip命令时,再次出现了权限被拒绝的问题. Notice:此处描述的问题,为使用php命令行执行php文件,因此进程属主为登录的用户,而不是nginx用户. ...
- 小白菜Windows10系统安装Linux(ubuntu)虚拟机超详细教程(全)
注:本文"( )"中的内容可忽略 1.下载VMware(威睿 计算机虚拟化软件) 官方下载地址 默认为最新版15.1.0,我们选择立即下载 (找一个比较大的盘不要是 ...
- linux 详解useradd 命令基本用法
linux 详解useradd 命令基本用法 时间:2019-03-24 本文章向大家介绍linux 详解useradd 命令基本用法,主要包括linux 详解useradd 命令基本用法使用实例.应 ...
- zabbix监控之自动发现/自动注册
一.自动发现 1.概述 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,zabbix可以在你的机器上自动开始监控文件系统或者网络接口,而无需为每个文件系统或网 ...
- Linux中级之netfilter防火墙(iptables)
一.什么是防火墙? 防火墙其实就是一个隔离工具:工作于主机或者网络的边缘 对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配检测 对于能够被规则所匹配的报文做出相应处理的组件(这个组件可以是硬 ...