聊聊分布式架构10——Zookeeper入门详解

目录

01ZooKeeper的ZAB协议

ZAB协议概念

ZAB协议基本模式

消息广播

崩溃恢复

选举出新的Leader服务器

数据同步

02Zookeeper的核心

ZooKeeper 的核心特点

ZooKeeper 的核心组件

选举算法概述

服务器启动时的Leader选举

服务器运行期间的Leader选举

03ZooKeeper的简单使用

04ZooKeeper的应用场景



01ZooKeeper的ZAB协议

在解决一致性方面,Zookeeper并没有直接采用Paxos算法,而是采用了一种被称为ZAB(ZooKeeper Atomic Broadcast)的一致性协议。

ZAB协议概念

ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。基于该协议,Zookeeper实现了一种主备模式的系统架构来维持集群中各副本之间数据的一致性。

ZAB协议的核心是定义了事务请求的处理方式:

所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而余下的其他服务器则成为Follower服务器。Leader服务器负责将一个客户端事务请求转换为一个事务Proposal(提议),并将该Proposal分发给集群中的所有Follower服务器。之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确的反馈后,那么Leader就会再次向所有的Follower服务器发布Commit信息,要求将前一个Proposal进行提交。

ZAB协议基本模式

ZAB 协议包括两种基本模式:消息广播和崩溃恢复。

  1. 消息广播:这是 ZAB 协议的基本模式之一,用于确保 ZooKeeper 集群中的所有节点都接收到相同的消息。在这种模式下,ZooKeeper 集群中的 leader 节点负责将客户端请求转化为一系列的消息,然后将这些消息广播给所有的 follower 节点。每个 follower 节点接收到消息后,会将消息写入本地的事务日志。一旦超过半数的节点确认接收了消息,leader 就可以提交这些消息,并将其应用到自己的状态机上,从而达到状态一致性。这确保了 ZooKeeper 的一致性和可靠性。

  2. 崩溃恢复:是 ZAB 协议的另一种基本模式,用于选择 ZooKeeper 集群中的 leader 节点。在一个 ZooKeeper 集群中,只有一个节点充当 leader,负责处理客户端请求并维护共享状态。如果当前的 leader 节点出现故障,集群需要选举一个新的 leader。ZAB 协议中的选举是基于消息广播的,节点会争相发送选举消息,然后根据规则选择新的 leader。选举过程确保了只有一个节点成为 leader,从而维持了一致性。

消息广播

ZAB的消息广播类似于二阶段提交。不同之处是ZAB协议移除了中断逻辑——Follower服务器要么Ack给Leader,要么抛弃Leader。当过半的Follower服务器反馈Ack之后就开始提交事务Proposal,而不需要等待集群中所有的Follower服务器都反馈响应。

  • 消息广播是基于具有FIFO特性的TCP协议通信的,所以能很容易地保证消息广播过程中消息接收与发送的顺序性。

  • 整个消息广播过程中,leader服务器会为每一个事务请求生成一个Proposal来进行广播,并且在广播事务Proposal之前,Leader服务器会为这个事务分配一个全局单调递增的唯一ID,称之为事务ID(即ZXID)。而且每一个事务Proposal严格按照其ZXID的先后顺序进行排序和处理。

  • 消息广播过程中,Leader服务器会为每一个Follower服务器各自分配一个单独的队列,将需要广播的事务Proposal一次放入队列中,根据FIFO的策略发送。每一个Follower服务器在接收到这个事务Proposal之后,都会首先将其以事务日志的形式写入本地磁盘,在成功写入后反馈给Leader服务器一个Ack响应。服务器收到过半的Follower的Ack响应后,就会广播一个Commit消息给所有的服务器以通知其进行事务提交,同时Leader完成自身的事务提交,每一个Follower服务器收到Commit消息后,完成自身事务的提交。

需要注意的是:Leader服务器可以处理事务请求(包括创建、更新和删除节点等需要保证强一致性的操作)和非事务请求,Follower服务器只能处理非事务请求,如果Follower收到事务请求会转交给Leader服务器。

崩溃恢复

简化的二阶段提交模型是无法处理Leader崩溃带来的数据不一致问题。一旦Leader服务器出现崩溃,或者由于网络导致Leader服务器失去了过半Follower的联系,就会进入崩溃恢复模式。

崩溃恢复状态下,ZAB协议有两件事要做:

  • 选举出新的Leader服务器

  • 数据同步

选举出新的Leader服务器

整个崩溃过程结束后,需要选举出新的Leader服务器,而且还得让其他服务器感知到选举产生的新Leader服务器。

在ZAB协议中,崩溃恢复模式可能出现的两个数据不一致的隐患场景:

  1. 服务器Leader在确认半数通过后完成了进行自身事务的提交,但是发送Commit告知Follower进行事务提交的瞬间异常,这是第一个需要保证的特性:确保在Leader服务器提交过的事务最终被所有服务器都提交。

  2. ZAB协议规定:如果一个Proposal事务在一台机器上被处理成功,那么应该在所有的机器上都被处理成功,哪怕机器出现故障崩溃。(所以在过半确认过程中数据会被强制一致的)基于这个特性,如果Leader节点在提出了某个Proposal事务之后就崩了,没有告知到Follower进行本地提交,等崩溃恢复了,原本的Leader保留了提出这个Proposal的状态,此时应该直接丢弃而不是强制同步。这是第二个需要保证的特性:确保丢弃那些只在Leader服务器上被提出的事务。

结合这两种情况,ZAB协议设计的选举算法就必须要满足:能够确保提交已经被Leader提交的事务Proposal,同时丢弃已经被跳过的事务Proposal。

ZAB协议的Leader选举方案就是:拥有最大ZXID的Follower服务器作为新的Leader服务器。为什么呢?

  1. 在消息广播的过程中,Leader服务器进行自身事务的提交前提是收到了半数的Follower服务器的Ack响应,那么此时必然有Follower服务器的事务日志中保存了所有的proposal状态,包含Leader异常时提交的那份。

  2. Follower自身ZXID是64位,高32位是epoch编号,低32位是消息计数器,每接收到1条消息+1,新Leader选举后epoch会+1,消息计数器置为0。设计的好处在于,旧的Leader作为Follower接入时,它的ZXID是肯定小于新Leader的,而且新Leader会让它将所有的拥有旧的epoch号的未被Commit的proposal清除。

至此,就保证了崩溃恢复后数据的一致性。

数据同步

在选出新的Leader服务器后,需要开始数据同步。Leader服务器会为每一个Follower服务器准备一个队列,将那些没有被同步的事务以Proposal消息的形式逐个发给Follower服务器,在Follower服务器将所有未同步的proposal事务从Leader服务器上同步并成功应用到本地数据库中后,Leader服务器会将该Follower服务器加入真正可用的Follower列表中,然后开始之后的正常流程。

02Zookeeper的核心

ZooKeeper是一个开源的分布式协调服务,用于构建分布式应用和分布式系统。它提供了一个高度可靠的分布式协调基础设施,帮助应用程序在分布式环境中协同工作。ZooKeeper 通常用于解决分布式系统中的一致性、配置管理、锁服务、命名服务等问题。

ZooKeeper 的核心特点
  1. 分布式文件系统:ZooKeeper 维护一个分层的命名空间,类似于文件系统目录结构,它可以用于存储配置信息和分布式数据。

  2. 一致性:ZooKeeper 提供了强一致性的数据模型,即一旦数据被写入,所有客户端都能读取到最新的数据,从而确保数据的一致性。

  3. 高可用性:ZooKeeper 以多数节点的方式运行,即在集群中的节点数必须超过半数,以确保高可用性。如果一些节点失效,ZooKeeper 仍然能够提供服务。

  4. 快速通知:ZooKeeper 允许客户端监听节点数据的变化,一旦节点数据发生变化,相关的客户端将得到通知。

  5. 顺序一致性:ZooKeeper 允许客户端按照顺序创建节点,并提供了有序性保证,这在分布式锁服务中非常有用。

ZooKeeper 的核心组件
  1. 集群:ZooKeeper 集群由多个节点组成,这些节点分布在不同的机器上,它们协同工作以提供服务。典型的 ZooKeeper 集群包括奇数个节点,通常是 3、5 或 7 个节点,以确保多数节点可用。

  2. ZNode:ZNode 是 ZooKeeper 命名空间的基本单元,类似于文件系统中的目录或文件。每个 ZNode 可以包含数据,并具有一个路径名称。

  3. 会话:ZooKeeper 客户端与 ZooKeeper 服务器之间建立会话,会话是客户端与服务器之间的状态会话,用于保持连接和跟踪会话的生命周期。

  4. Watch:客户端可以在 ZNode 上设置 Watch,以便在 ZNode 数据发生变化时获得通知。

  5. 选举算法:ZooKeeper 使用选举算法来选举 leader 节点,leader 负责协调事务和保持一致性。

选举算法概述

分两种情况拆解下选举算法:服务器启动时的Leader选举和服务器运行期间的Leader选举。

服务器启动时的Leader选举

假设在集群中,有3台服务器已经可以互相通信,它们需要选出一个Leader服务器。有一个前提条件,它们拥有一个myid的属性,server1的myid是1,server2的myid是2,server3的myid是3。

1.每个server会发出一个投票

例如server1以(myid,zxid)格式发送给其他服务器投票的数据(1,0),server2发送的(2,0)。

2.接收来自每个服务器的投票

每个服务器都会收到其他服务器的投票,首先验证有效性,其次是否本轮投票、是否来自Looking状态的服务器。

3.处理投票

每个服务器根据规则处理收到的投票,规则如下:

  • 优先zxid。zxid大的优先作为Leader。

  • zxid相同,myid大的作为Leader。

那么,3台服务器的zxid都为0,就会比较myid。server1和server2根据规则会修改自身投票为(3,0)。然后重新向其他服务器发送投票。server3不用修改,只是再发送一次。

4.统计投票

每次投票,服务器都会统计所有投票判断是否产生了Leader,这里还是使用的过半概念:当有一半的服务器收到相同的投票时候,就认为已经选出了Leader。

5.改变服务器状态

一旦确定了Leader,服务器就会变更自己的状态:Follower会变更为FOLLOWING,Leader会变更为LEADING。

服务器运行期间的Leader选举

当Leader服务器挂掉的时候,就会进行新一轮的Leader选举。

1.变更状态

非Observer服务器会将自己的服务器状态变更为LOOKING,开始选举流程。(Observer服务器不参与选举也不投票)

2.每个server发出一个投票

与启动期间不同的是,运行期间的服务器可能有不同的zxid。例如server的投票(1,1112),server3的投票(3,1113)。

3.接收各个服务器的投票

4.处理投票,显然server3的zxid大,server3会成为Leader。

5.统计投票

6.改变服务器状态

03ZooKeeper的简单使用

可以参考这篇博客:http://t.csdnimg.cn/N6yyU

04ZooKeeper的应用场景

Apache ZooKeeper 在分布式系统中有多种典型应用场景,它提供了高度可靠的分布式协调服务,用于解决各种分布式系统的共识、配置管理和协同协作问题。以下是 ZooKeeper 的一些典型应用场景:

  1. 分布式配置管理:ZooKeeper 可用于存储和管理应用程序的配置信息。各个分布式节点可以监听配置节点,当配置发生变化时,节点能够及时获取最新的配置,实现动态配置管理。

  2. 分布式锁服务:ZooKeeper 提供了分布式锁服务,允许多个节点协同竞争获取锁。这对于协调分布式系统中的操作非常有用,确保只有一个节点能够执行关键操作。

  3. 分布式一致性:ZooKeeper 可以用于协调多个节点以达成一致的决策。它确保在分布式系统中节点的状态和数据是一致的,从而提供强一致性的数据存储。

  4. 服务发现:ZooKeeper 可用于注册和发现分布式系统中的服务。各个服务可以在 ZooKeeper 上注册自己的地址和状态,其他节点可以查询这些信息以发现可用的服务。

  5. 领导者选举:ZooKeeper 通常用于选举分布式系统中的领导者节点。它确保只有一个节点成为领导者,从而协调系统的操作。

  6. 分布式任务队列:ZooKeeper 可用于创建分布式任务队列,多个节点可以将任务推送到队列中,然后从队列中获取任务进行处理。

  7. 分布式协同协作:ZooKeeper 提供了分布式协调服务,可以用于构建分布式应用程序,确保多个节点协同协作并实现一致性。

  8. 分布式文件系统:虽然 ZooKeeper 不是一个文件系统,但它可以用于管理分布式系统中的文件和配置信息,作为分布式文件系统的一部分。

参考资料:从Paxos到Zookeeper  分布式一致性原理与实践 [倪超著]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/167174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue+nestjs】qq第三方授权登录【超详细】

项目场景: 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 1.在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.如果你想本地调试,回调到你的线上地址。你可以在本…

面试算法31:最近最少使用缓存

题目 请设计实现一个最近最少使用(Least Recently Used,LRU)缓存,要求如下两个操作的时间复杂度都是O(1)。 get(key):如果缓存中存在键key,则返回它对应的值…

基于Django与深度学习的股票预测系统 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于Django与深度学习的股票预测系统 ** 该项目较为新颖,适合作为竞赛课题方向&#xff…

Redis基本命令和常用数据类型

文章目录 前言一、Redis简介二、基本操作1.赋值2.取值3.切换数据库4.查看数据库所有键(key)5.查看键值类型6.移动键值到其他数据库7.设置键值生存时间(两种)8.查看键值生存时间9.查看当前数据库大小10.判断键是否存在11.清空当前数…

基于ResNet34的花朵分类

一.数据集准备 新建一个项目文件夹ResNet,并在里面建立data_set文件夹用来保存数据集,在data_set文件夹下创建新文件夹"flower_data",点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/example_i…

英语什么时候加s和es

名词变复数一般情况下加s,以s,x,ch,sh结尾加es。一个名词如果表示一个或一样东西,它取单数形式,如果表示两个或更多的这类东西,则需要用名词复数形式。 1 以s,x,sh,ch结尾的词,加es。 2 以辅音字母(除a/e/…

钢铁异常分类 few-shot 问题 小陈读paper 钢铁2

很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习, 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…

C++11——lambda表达式

文章目录 1. C98对自定义类型的排序2. lambda表达式语法2.1 捕捉列表 3. lambda底层原理 1. C98对自定义类型的排序 在C98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序 struct Student {Student(string name, long id…

计算机算法分析与设计(16)---Dijkstra算法(含C++代码)

文章目录 一、知识概述1.1 算法描述1.2 例题分析 二、代码编写 一、知识概述 1.1 算法描述 1.2 例题分析 二、代码编写 输入:  第一行:图的顶点数n  第二行:图的边数k  第三行:算法起点begin,算法终点end  接下来…

物联网AI MicroPython传感器学习 之 RTC时钟模块

学物联网,来万物简单IoT物联网!! 一、产品简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数…

Tomcat启动控制台乱码问题

修改Tomcat/conf/logging.properties

微信小程序中如何使用fontawesome6的免费图标

一、官网下载fontawesome6 Download Font Awesome Free or Pro | Font Awesome 二、使用transfer编码成Base64 transfer打开官网:Online font-face generator — Transfonter 首先先把刚刚下载的fontawesome6解压,将文件夹中的字体上传(点…

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型 SKRR这是Gustau Camps-Valls等人在“用深度结构核回归检索物理参数”中提出的结构核岭回归(SKRR)方法。 参考文献: Camps-Valls,Retrieval of Physical Pa…

[C++] C++入门

☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C和Linux 🌼博客专栏:C入门 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 …

JUC并发编程笔记2

省流: 自己笔记,划走~~~~ 缓存更新策略

【数据科学赛】2023全球智能汽车AI挑战赛 #¥95000 #LLM文档问答 #视频理解

CompHub[1] 最新的比赛会第一时间在群里通知,欢迎加群交流比赛经验!(公众号回复“加群”即可) 以下内容由AI辅助生成,可能存在错误,可进入比赛主页[2]查看更多(文末阅读原文) 比赛主办方 吉利汽车集团、阿…

2008-2021年上市公司实体企业金融化程度测算数据(原始数据+stata代码)

2008-2021年上市公司实体企业金融化程度测算(原始数据stata代码) 1、时间:2008-2021年 2、指标:股票代码、年份、交易性金融资产、衍生金融资产、发放贷款及垫款净额、可供出售金融资产净额、持有至到期投资净额、长期债权投资净…

Golang数组:全面指南与实际示例

揭示Golang数组的威力:从基础到高级技巧 Golang数组是数据存储的基本构建块,为开发人员提供了多种可能性。在这篇正式的博客文章中,我们将探讨Golang数组,从基础知识到高级技巧。通过实际示例和正式的语气,我们将揭示…

react 学习 —— 16、使用 ref 操作 DOM

什么时候使用 ref 操作 DOM? 有时你可能需要访问由 React 管理的 DOM 元素 —— 例如,让一个节点获得焦点、滚动到它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情,所以你需要一个指向 DOM 节点的 ref 来实现。 怎么使用 r…

vue3实现在element Dialog 对话框中预览pdf文件

最近有一个需求就是点击按钮在弹框中去预览pdf文件,于是发现了一个HTML中比较重要的标签:embed,前面说的需求就可以用这个标签来实现,一起来学习一下吧。 embed标签是HTML中的一个非常重要的标签,它可以在你的网页上插…