由于ZooKeeper的数据模型简单且全部在内存中,ZooKeeper的速度非常快。它提供了一系列保证(Guarantees):

• 顺序一致性(Sequential Consistency)

原子性(Atomicity)

单一视图(Single System Image)

可靠性(Reliability )

实时性(Timeliness )

下面将结合源码(3.4.10版本)介绍下,ZooKeeper如何保证单一视图(Single System Image)。

一、ZooKeeper单一视图定义

单一视图(Single System Image)是指同一个客户端无论连接到集群中的哪台机器上,都将会看到服务的同一视图。即:同一客户端无论什么时候连接到哪个服务器上,都不会看到比自己之前看到的数据更早版本的数据。

单一视图保证是由ZooKeeper客户端与服务端建立连接请求时的一些校验操作实现的,具体如何实现?需要介绍下客户端到服务端连接建立的过程。

二、客户端到服务端连接建立以及请求处理流程

客户端到服务端建立连接流程基本如下:

客户端通过服务器连接字符串、timeout等参数,创建客户端实例,启动客户端相关处理线程

客户端服务端之间创建socket连接

客户端服务端发送连接建立请求

服务端接收到连接建立请求后,会验证是否合法,决定是否建立连接

♦ 如果连接合法,那么将与客户端之间建立起连接,并开始请求处理流程

如果连接不合法,那么将拒绝连接,客户端将会寻找集群中的其他服务器,尝试建立连接

上述描述的流程如下图所示:

下面将结合源码(3.4.10版本)具体分析以上流程。

初始化

当创建ZooKeeper客户端实例(new ZooKeeper)的时候,会初始化客户端的一些设置:除了设置watcher、host提供器(HostProvider)之外,还会创建ClientCnxn实例。

/**

* TIPS:ClientCnxn类功能介绍

* ClientCnxn类主要负责客户端的socket I/O功能,同时还提供了一个透明的到连接可用服务器的理由功能

* TIPS:host提供器(HostProvider)

* 这里介绍的客户端是ZooKeeper提供的原生客户端,其他客户端暂时不做分析。host提供器默认为StaticHostProvider,当连接新的服务器时,采用的是轮询列表中下一个服务器的方案

*/

ClientCnxn初始化的时候启动两个线程:消息收发线程SendThread和事件处理线程EventThread

消息收发线程:处理消息发送、消息接收以及心跳处理

事件处理线程:主要处理节点相关事件以及连接状态事件

/**

* TIPS:节点相关事件包括

* 节点创建(NodeCreated)、节点删除(NodeDeleted)、节点数据更新(NodeDataChanged)、子节点变化(NodeChildrenChanged,包括子节点的创建和删除)

*/

这里主要涉及到消息收发线程。消息收发线程SendThread启动后,会判断与服务器之间是否有连接,如果没有,则会根据host提供器选择集群中的一台服务器建立socket连接,同时发送建立连接的请求。以下将以NIO通信(ZooKeeper3.4.0版本开始提供netty通信方式)为例。

客户端连接建立过程

ClientCnxn类中的SendThread线程里,当检测与服务器之间没有建立的socket连接时,会通过ClientCnxnSocket创建连接(clientCnxnSocket.connect(addr),NIO通信通过ClientCnxnSocketNIO类完成),主要完成以下步骤:

创建与服务端的socket连接

注册selector,并发送建立连接请求到服务端

具体ClientCnxnSocketNIO中连接建立方法如下:

在注册selector和建立连接的过程中,会通过消息收发线程SendThread的primeConnection方法发送连接请求,发送连接建立请求具体如下源码所示:

ClientCnxn.SendThread类中,创建连接请求包,这个包里将会包含客户端上次收到服务端反馈的事务id:zxid信息(客户端每次请求响应,服务端都会将最新的事务id作为消息头发送给客户端)。消息收发线程会通过建立的socket将该请求发送到服务端。

/**

* TIPS:事务id - zxid

* ZooKeeper事务都需要由leader节点处理,每个事务都有一个唯一的标识号,称之为事务id,记做zxid

* 表示:ZooKeeper使用64位long型整数来表示zxid

* 含义:前32位为epoch(此处翻译为时代,每发生一轮选举,epoch增一,因此可以认为一个leader当选的代表);后32位为当前leader处理事务的一个递增序列号

* 深层含义:zxid为递增序列,因此zxid可以代表当前ZooKeeper服务器上的数据版本:zxid越大代表数据版本越新

*/

建立连接请求包信息具体如下所示:

服务端连接建立过程

在ZooKeeper服务端,NIO通信接收连接请求的类为NIOServerCnxn。服务端接收到连接请求后,会通过ZooKeeperServer类的processConnectRequest来单独处理连接建立的请求。服务端读取连接请求过程具体如下:

ZooKeeperServer类的processConnectRequest方法中,主要分为以下几步:

解析请求包数据

获取该客户端之前收到的zxid信息

验证客户端当前看到的数据版本信息是否比服务器的数据版本新,如果客户端当前看到的数据版本比较新,那么服务器将直接拒绝连接建立请求

服务端处理连接请求,验证数据版本zxid信息的过程具体如下:

请求处理过程

服务端:每次服务器端处理客户端的请求,FinalRequestProcessor都会将当前服务器处理的最新的zxid放在响应头中返回。具体响应构建如下:

客户端:客户端收发线程接收到服务端的响应后,解析结果中的zxid,更新自己的lastZxid值信息,readResponse方法中处理如下:

三、单一视图保证

从上面的源码分析可知:当客户端正常连接集群中的一台服务器时,每次请求响应都会返回所连接的服务器上所处理的最新的事务id并进行记录。当客户端由于各种原因导致与服务器之间断连时,客户端将会以自己看到代表数据版本信息的zxid一起发送给服务端,请求建立连接。服务端在收到连接建立请求时,会进行判断:自己的数据版本没有客户端之前看到的数据版本新,服务端将会拒绝连接建立。从而保证客户端不会连接到数据版本比自己之前看到的旧的服务器上,因此不会请求到老版本的数据,从而保证了单一视图特性。

下面通过一个简单示例,来说明整个过程,如下图所示:

假设:集群中有三台服务器A/B/C,A为leader,其余两台为follower。

/**

* TIPS:ZooKeeper服务器角色说明

* Leader:领导者,是ZooKeeper集群的核心,负责集群各角色之间的协调和调度、事务请求的调度和处理,保证事务的顺序性以及数据一致性

* Follower:追随者,可独立处理非事务请求,转发事务请求给Leader,参与事务的投票以及Leader选举投票

* Observer:观察者,可独立处理非事务请求,转发事务请求给Leader,但是不参与各种投票,可提高整个集群的非事务请求处理能力

* 其中,Follower和Observer称之为Learner

*/

某一时刻,服务器A与C数据一致,zxid均为5,服务器B的zxid为4。当出现以下情况时,客户端与服务端的处理过程:

♦ 客户端client此时连接到服务器C,并且最后一个请求响应返回的zxid为5,client保存到lastZxid中

♦ 由于client与服务器C之间存在网络问题导致client与C之间断连。client开始重新与集群建立连接

♦ client随机到服务器B,开始与B建立连接

♦ 发送的连接建立请求中,携带lastZxid为5

♦ 服务器B接收到client的连接建立请求,判断自己的zxid与client传过来的lastZxid信息。发现客户端所看到的数据版本要比自己新(lastZxid > zxid),因此拒绝了client的建立连接的请求

♦ client与服务器B建立连接失败,开始新一轮尝试,向服务器A发送建立连接请求

♦ 服务器A同样去对比zxid以及客户端的lastZxid信息,发现版本一致,允许连接建立。至此,client与集群中的服务器A建立了新的连接。可以开始请求的发送与处理过程

四、参考资料

1、zookeeper整体概述:http://zookeeper.apache.org/doc/current/zookeeperOver.html

2、Observer角色说明:https://zookeeper.apache.org/doc/r3.3.3/zookeeperObservers.html

zookeeper保证单一视图相关推荐

  1. CVPR 2021 | 跨模态点云补全新框架ViPC:用单一视图推断完整信息

     OPPO 随着CVPR 2021的落幕,越来越多专业论文进入大众视野.OPPO研究院团队与清华大学等多个机构学者群策群力, 基于点云数据不完整的问题联合提出了一种名为ViPC(view-guided ...

  2. ZooKeeper 保证数据一致性

    learn from 从0开始学大数据(极客时间) 文章目录 1. 分布式一致性原理 2. Paxos 算法与 ZooKeeper 架构 1. 分布式一致性原理 CAP 原理认为,一个提供数据服务的分 ...

  3. 主数据(MD Master Data)

    为什么80%的码农都做不了架构师?>>>    主数据(MD Master Data) 目录 1 什么是主数据 2 主数据的因素 3 主数据管理 4 主数据管理问题存在的根源 5 主 ...

  4. [SAP-MDM]MDM的基本概念--主数据管理详解

    主数据是指在整个企业范围内各个系统(操作 /事务型应用系统以及分析型系统 )间要共享的数据,比如,可以是与客户 (customers),供应商(suppliers),帐户(accounts)以及组织单 ...

  5. ZooKeeper简单使用

    ZooKeeper简单使用 ZooKeeper简单使用 1.ZooKeeper简介 2.ZooKeeper能做什么 3.ZooKeeper核心 3.1.ZooKeeper安装 3.2.ZooKeepe ...

  6. 亲 , Zookeeper了解一下 : 概述

    2019独角兽企业重金招聘Python工程师标准>>> 在学习的过程中,我们总需要一个来自灵魂的拷问: 为什么? 为什么会产生Zookeeper 这个问题有深度,那要从五百万年说起, ...

  7. ZooKeeper和CAP理论及一致性原则

    ZooKeeper和CAP理论及一致性原则 一.CAP理论概述 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:Consistency) 可用性(A:Available) 分区容 ...

  8. 深入浅出 ZooKeeper

    ZooKeeper 是一个分布式协调服务 ,由 Apache 进行维护. ZooKeeper 可以视为一个高可用的文件系统. ZooKeeper 可以用于发布/订阅.负载均衡.命令服务.分布式协调/通 ...

  9. ZooKeeper基础学习

    简介: ZooKeeper:为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务.配置管理和分布式锁等分布式的基础服务. Zookeeper介绍: 是一个开放源代码的分布式协调服务,设 ...

  10. Zookeeper高级

    1.1. 一致性协议概述 前面已经讨论过,在分布式环境下,有很多不确定性因素,故障随时都回发生,也讲了CAP理论,BASE理论 我们希望达到,在分布式环境下能搭建一个高可用的,且数据高一致性的服务,目 ...

最新文章

  1. Appnium安装-Mac平台
  2. leetcode 844. 比较含退格的字符串
  3. [systemd]systemd使用
  4. rabbitmq可靠性投递_RabbitMQ 可靠投递
  5. 导致大量kworker的原因_氨氮超标的几种原因及解决办法
  6. 机器学习2/100天-简单线性回归
  7. BZOJ 1041 数学
  8. Linux系统--CentOS 7.6.1810 安装 nginx 1.16.0
  9. 阿里云云防火墙全新发布,重装上阵!
  10. 华为机顶盒视频播放代码
  11. python处理时间序列非平稳_非平稳时间序列的自相关
  12. 为什么要制定项目计划?
  13. 单个html页面面包屑,总结11个网页面包屑设计技巧
  14. ESP32 学习笔记(二十二)睡眠模式
  15. HBase--JavaAPI的操作,创建表修改表,增删改查数据
  16. canvas - 基础知识 - 绘制剪纸图形
  17. 对谈Jason Fox:如何导向探索
  18. 贝叶斯网络的联合概率到底有什么用:贝叶斯理论(4)
  19. springboot+websocket+token验证+jedis支持集群部署发消息
  20. 关于项目结束时的工作总结

热门文章

  1. Python---基础-运算符int和range函数
  2. C#把汉字转换成16进制(HEX)并向串口发送数据
  3. VMware 共享目录不显示的解决办法
  4. Git:常用命令记录
  5. 【matlab】:matlab中不断的出现计算过程怎么办
  6. jQuery 生成随机字符
  7. python Asyncore.dispatcher 理解
  8. Linux系统编程(28)——线程间同步
  9. C# webclient UploadStringAsync如何得到变量?
  10. 全新We7 CMS 2.6版火热发布