文章目录

  • 流程图
  • why ?
  • How ?
    • 何时触发数据同步的机制?
    • 同步哪些数据
    • 同步方式
      • DIFF 同步
      • TRUNC+DIFF 同步
      • TRUNC 同步
      • SNAP 同步
    • 同步后的处理
  • 源码分析


流程图

在 Leader 节点选举后,还需要把 Leader 服务器和 Follow 服务器进行数据同步。在保证整个 ZooKeeper 集群中服务器数据一致的前提下,ZooKeeper 集群才能对外提供服务。


why ?

介绍 ZooKeeper 集群数据同步之前,先要清楚为什么要进行数据同步。在 ZooKeeper 集群服务运行过程中,主要负责处理发送到 ZooKeeper 集群服务端的客户端会话请求。这些客户端的会话请求基本可以分为事务性的会话请求和非事务性的会话请求,而这两种会话的本质区别在于,执行会话请求后,ZooKeeper 集群服务器状态是否发生改变。

事物性会话请求最常用的操作类型有节点的创建、删除、更新等操作。而查询数据节点等会话请求操作就是非事务性的,因为查询不会造成 ZooKeeper 集群中服务器上数据状态的变更 。

我们之前介绍过,分布式环境下经常会出现 CAP 定义中的一致性问题。

比如当一个 ZooKeeper 集群服务器中,Leader 节点处理了一个节点的创建会话操作后,该 Leader 服务器上就新增了一个数据节点,如果不在 ZooKeeper 集群中进行数据同步,那么其他服务器上的数据则保持旧有的状态,新增加的节点在服务器上不存在。

当 ZooKeeper 集群收到来自客户端的查询请求时,会出现该数据节点查询不到的情况,这就是典型的集群中服务器数据不一致的情况

为了避免这种情况的发生,在进行事务性请求的操作后,ZooKeeper 集群中的服务器要进行数据同步,而主要的数据同步是从 Learnning 服务器同步 Leader 服务器上的数据


How ?

主要通过三个方面来讲解 ZooKeeper 集群中的同步方法,分别是同步条件、同步过程、同步后的处理。


何时触发数据同步的机制?

我们知道 Leader 选举首先要判断集群中 Leader 服务器是否存在不同,要想进行集群中的数据同步,首先需要 ZooKeeper 集群中存在用来进行数据同步的 Learning 服务器。

也就是说,当 ZooKeeper 集群中选举出 Leader 节点后,除了被选举为 Leader 的服务器,其他服务器都作为 Learnning 服务器,并向 Leader 服务器注册。之后系统就进入到数据同步的过程中。


同步哪些数据

在数据同步的过程中,ZooKeeper 集群的主要工作就是将那些没有在 Learnning 服务器上执行过的事务性请求同步到 Learning 服务器上。

这里请你注意,事务性的会话请求会被同步,而像数据节点的查询等非事务性请求则不在数据同步的操作范围内


同步方式

在具体实现数据同步的时候,ZooKeeper 集群又提供四种同步方式,

DIFF 同步

DIFF 同步即差异化同步的方式.

在 ZooKeeper 集群中,Leader 服务器探测到 Learnning 服务器的存在后,首先会向该 Learnning 服务器发送一个 DIFF 不同指令。

在收到该条指令后,Learnning 服务器会进行差异化方式的数据同步操作。

在这个过程中,Leader 服务器会将一些 Proposal 发送给 Learnning 服务器。之后 Learnning 服务器在接收到来自 Leader 服务器的 commit 命令后执行数据持久化的操作。


TRUNC+DIFF 同步

TRUNC+DIFF 同步代表先回滚再执行差异化的同步,这种方式一般发生在 Learnning 服务器上存在一条事务性的操作日志,但在集群中的 Leader 服务器上并不存在的情况 。

发生这种情况的原因可能是 Leader 服务器已经将事务记录到本地事务日志中,但没有成功发起 Proposal 流程。

当这种问题产生的时候,ZooKeeper 集群会首先进行回滚操作,在 Learning 服务器上的数据回滚到与 Leader 服务器上的数据一致的状态后,再进行 DIFF 方式的数据同步操作。


TRUNC 同步

TRUNC 同步是指仅回滚操作,就是将 Learnning 服务器上的操作日志数据回滚到与 Leader 服务器上的操作日志数据一致的状态下。之后并不进行 DIFF 方式的数据同步操作。


SNAP 同步

SNAP 同步的意思是全量同步,是将 Leader 服务器内存中的数据全部同步给 Learnning 服务器。

在进行全量同步的过程中,Leader 服务器首先会向 ZooKeeper 集群中的 Learning 服务器发送一个 SNAP 命令,在接收到 SNAP 命令后, ZooKeeper 集群中的 Learning 服务器开始进行全量同步的操作。

随后,Leader 服务器会从内存数据库中获取到全量数据节点和会话超时时间记录器,将他们序列化后传输给 Learnning 服务器。Learnning 服务器接收到该全量数据后,会对其反序列化后载入到内存数据库中。


同步后的处理

数据同步的本质就是比对 Leader 服务器与 Learning 服务器,将 Leader 服务器上的数据增加到 Learnning 服务器,再将 Learnning 服务器上多余的事物日志回滚。

前面的介绍已经完成了数据的对比与传递操作,接下来就在 Learning 服务器上执行接收到的事物日志,进行本地化的操作。


源码分析

首先我们来看看 Learnning 服务器是如何接收和判断同步方式的。

如下面的代码所示,ZooKeeper 底层实现了一个 Learner 类,该类可以看作是集群中 Learnning 服务器的实例对象,与集群中的 Learning 服务器是一一对应的。

public class Learner {}

而在 Learner 类的内部,主要通过 syncWithLeader 函数来处理来自 Leader 服务器的命令。在接收到来自 Leader 服务器的命令后,通过 qp.getType() 方法判断数据同步的方式。

protected void syncWithLeader(long newLeaderZxid) throws Exception{if (qp.getType() == Leader.DIFF) {snapshotNeeded = false;}else if (qp.getType() == Leader.TRUNC) {}}

在确定了数据同步的方式后,再调用 packetsCommitted.add(qp.getZxid()) 方法将事物操作同步到处理队列中,之后调用事物操作线程进行处理。

if (pif.hdr.getZxid() == qp.getZxid() && qp.getType() == Leader.COMMITANDACTIVATE) {QuorumVerifier qv = self.configFromString(new String(((SetDataTxn) pif.rec).getData()));boolean majorChange = self.processReconfig(qv, ByteBuffer.wrap(qp.getData()).getLong(),qp.getZxid(), true);if (majorChange) {throw new Exception("changes proposed in reconfig");}}if (!writeToTxnLog) {if (pif.hdr.getZxid() != qp.getZxid()) {LOG.warn("Committing " + qp.getZxid() + ", but next proposal is " + pif.hdr.getZxid());} else {zk.processTxn(pif.hdr, pif.rec);packetsNotCommitted.remove();}} else {packetsCommitted.add(qp.getZxid());

Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略相关推荐

  1. 集群没有leader_ZooKeeper 集群中 Leader 与 Follower 的4种数据同步策略

    首先要声明一点,zk集群中,leader服务器有着比较重要的存在,Follower 服务器只是处理非事务性请求,leader服务器主要负责事务性请求,Follower 服务器在遇到事务性请求以后还是会 ...

  2. Apache ZooKeeper - 集群中 Leader 的作用_事务的请求处理与调度分析

    文章目录 事务性请求处理 Leader 事务处理分析 预处理阶段 事务处理阶段 事务执行阶段 响应阶段 源码分析 小结 Leader 服务器在 ZooKeeper 中的作主要是处理事务性的会话请求以及 ...

  3. HDFS High Availability(HA)高可用、单点故障、主备集群、脑裂问题、数据同步问题、HDFS HA解决方案—QJM

    HDFS High Availability(HA)高可用 1.1 High Availability背景知识 1.1.1 单点故障.高可用 单点故障(英语:single point of failu ...

  4. Mysql数据库在多服务器集群的情况下如何保证数据同步?

    数据不同步的异常情况通常出现在,在同一时刻有多个写数据的操作发生.因此要避免数据库的数据不同步这个问题,就要避免同时有多个写数据的操作,同时只能有一个写操作. 这在一台服务器运行的时候似乎是没有问题的 ...

  5. 面试官:说说你对ZooKeeper集群与Leader选举的理解?

    作者:TalkingData 史天舒 来自:TalkingData ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选 ...

  6. ZooKeeper集群与Leader选举

    说说你对ZooKeeper集群与Leader选举的理解? ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分布式 ...

  7. 集群没有leader_面试官问:说说你对ZooKeeper集群与Leader选举的理解?

    ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分布式锁等功能. 高可用 为了保证ZooKeeper的可用性,在 ...

  8. Zookeeper——选举机制原理与Leader和Follower作用

    摘要 本博文主要介绍Zookeeper的选举机制的原理与Zookeeper事务请求处理的原理. 一.zookeeper选举算法原理 Leader 服务器的作用是管理 ZooKeeper 集群中的其他服 ...

  9. Apache ZooKeeper - 集群中 Follow 的作用_非事务请求的处理与 Leader 的选举分析

    文章目录 Pre 非事务性请求处理过程 源码分析 选举过程 在这里插入图片描述 Leader 失效发现 Leader 重新选举 Follow 角色变更 集群同步数据 源码解析 小结 Pre 在 Zoo ...

最新文章

  1. 微服务“大门”如何选择?
  2. R语言空间数据处理(part1)--基础数据操作与处理
  3. 将DataTable 存到一个集合当中
  4. apache spark_Apache Spark软件包,从XML到JSON
  5. android studio电影院选座,8排电影院选座最佳位置
  6. 思博伦Landslide CORE帮助UQ实现自动化的现网测试
  7. 两个重要极限_算法数学基础-概率论最重要两个结论:大数定律及中心极限定理...
  8. docker搭建nginx
  9. bufferreader java_Java - BufferedReader对比FileReader到底哪里进行了优化
  10. COLING 2020 | 字符感知预训练模型CharBERT
  11. Linux ftp命令
  12. 有什么软件可用于Mac系统的硬盘格式转换
  13. latex常用最要快捷键
  14. matlab机器人模型仿真,一知半解|MATLAB机器人建模与仿真控制(1)
  15. php 模拟登录163邮箱,PHP模拟登陆163邮箱发邮件及获取通讯录列表的方
  16. PyTorch——device与cuda.device用法
  17. 【指针】编写并测试一个函数larger_of(),该函数把两个double类型变量的值替 换为较大的值。例如, larger_of(x, y)会把x和y中较大的值重新赋给两个变 量。
  18. FPGA--(基于Quartus的FPAG程序下载与固化教程)VGA显示实验之上板测试
  19. CreateWindow 详解
  20. torch.chunk用法

热门文章

  1. 【javase基础-大杉带你刷好题(上)】
  2. 数据库系统概论第三章学习通作业(建表、查询、修改、删除、视图)
  3. log4j 日志格式详解
  4. 解决stetho第一次连接白屏的问题
  5. GrayLog查询语法
  6. 链接器工具错误错误 LNK2019 无法解析的外部符号
  7. JS的生成器详细使用、生成器结合迭代器使用
  8. Nginx——Session共享
  9. IT技术面试官教你写面试简历
  10. bxSlider轮播图