聊聊分布式架构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  分布式一致性原理与实践 [倪超著]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty核心源码剖析

Netty 线程模型 Netty高并发高性能架构设计精髓 主从Reactor线程模型NIO多路复用非阻塞无锁串行化设计思想支持高性能序列化协议零拷贝(直接内存的使用)ByteBuf内存池设计灵活的TCP参数配置能力并发优化 无锁串行化设计思想 在大多数场景下,并行多线程处理可以提…

安卓使用android studio跨进程通信之AIDL

我写这篇文章不想从最基础的介绍开始,我直接上步骤吧. 1.创建服务端 1.1:创建服务端项目:我的as版本比较高,页面就是这样的 1.2:创建AIDL文件,右键项目,选中aidl aidl名字可以自定义也可以默认 basicTypes是自带的,可以删掉,也可以不删,然后把你自己所需的接口写上去 1.3:创建…

CSS 两栏布局

目录 CSS两栏布局(左列定宽,右列自适应宽) 方法一:浮动margin 方法二:定位margin 方法三:浮动BFC 方法四:Flex布局 方法五:able布局 CSS两栏布局(左列不定宽&#…

uniapp 自定义导航栏

自定义导航栏 修改 pages.json 在 pages.json 中将 navigateionStyle 设为 custom 新建 systemInfo.js systemInfo.js 用来获取当前设备的机型系统信息,放在 common 目录下 /*** 此 js 文件管理关于当前设备的机型系统信息*/ const systemInfo function() {/***…

信息检索与数据挖掘 | 【实验】排名检索模型

文章目录 📚实验内容📚相关概念📚实验步骤🐇分词预处理🐇构建倒排索引表🐇计算query和各个文档的相似度🐇queries预处理及检索函数🔥对输入的文本进行词法分析和标准化处理&#x1f…

从0开始在Vscode中搭建Vue2/3项目详细步骤

1.安装node.js:Node.js下载安装及环境配置教程【超详细】_nodejs下载_WHF__的博客-CSDN博客 node.js自带npm,无需单独安装。 验证: node -v npm -v 2.先简单创建一个空文件夹,vscode进入该文件夹,并打开终端。 3.安装cnpm&…

【Gensim概念】03/3 NLP玩转 word2vec

第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后,可以直接使用它以各种方式查询这些嵌入。有关示例,请参阅模块级别文档字符串。 类型 KeyedVectors 1) add_lifecycle_event(event_name, log_level2…

OpenCV视频车流量识别详解与实践

视频车流量识别基本思想是使用背景消去算法将运动物体从图片中提取出来,消除噪声识别运动物体轮廓,最后,在固定区域统计筛选出来符合条件的轮廓。 基于统计背景模型的视频运动目标检测技术: 背景获取:需要在场景存在…

React 框架

1、React 框架简介 1.1、介绍 CS 与 BS结合:像 React,Vue 此类框架,转移了部分服务器的功能到客户端。将CS 和 BS 加以结合。客户端只用请求一次服务器,服务器就将所有js代码返回给客户端,所有交互类操作都不再依赖服…

禁止拷贝文件到U盘的解决办法

禁止拷贝文件到U盘的解决办法 安企神U盘管理系统下载使用 说到这问题,大多情况下是企业的需求,很多公司电脑中都保存着极为重要的数据,这些数据往往是不能传播的,所以此时就需要禁止拷贝文件到U盘来防止公司数据被泄密。 禁止拷…

python造测试数据存到excel

代码: from ExcelHandler import ExcelHandler from faker import Faker # 导入faker库的Faker方法 # ↓默认为en_US,只有使用了相关语言才能生成相对应的随机数据 fkFaker(locale"zh_CN")def create_date():m int(input(请输入要造的数据条…

自动驾驶的商业应用和市场前景

自动驾驶技术已经成为了交通运输领域的一项重要创新。它不仅在改善交通安全性和效率方面具有巨大潜力,还为各种商业应用提供了新的机会。本文将探讨自动驾驶在交通运输中的潜力,自动驾驶汽车的制造商和技术公司,以及自动驾驶的商业模式和市场…

基于OpenCV批量分片高像素影像

基于OpenCV批量分片高像素影像 为了更加精确的诊断和治疗,医疗影像往往是大像素(1920x1080)或超大像素图像(4k图像4096x2160)。这类图像的尺寸与深度学习实验数据常见尺寸(227x227,或32x32&…

OpenCV实现物体尺寸的测量

一 ,项目分析 物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。 如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。 主要是通过…

我国有多少个港口?

港口是什么? 港口是海洋运输中不可或缺的重要设施之一,是连接陆路和水路运输的重要节点。港口通常是指位于沿海地区的水陆交通枢纽,是船舶停靠、装卸货物、储存物资和维修船只的场所。港口一般由码头、泊位、仓库、货场、客运站等设施组成&a…

数据结构和算法概述

什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话: 数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储…

【网安大模型专题10.19】※论文5:ChatGPT+漏洞定位+补丁生成+补丁验证+APR方法+ChatRepair+不同修复场景+修复效果(韦恩图展示)

Keep the Conversation Going: Fixing 162 out of 337 bugs for $0.42 each using ChatGPT 写在最前面背景介绍自动程序修复流程Process of APR (automated program repair)1、漏洞程序2、漏洞定位模块3、补丁生成4、补丁验证 (可以学习的PPT设计)经典的…

Spring Cloud之服务熔断与降级(Hystrix)

目录 Hystrix 概念 作用 服务降级 简介 使用场景 接口降级 服务端服务降级 1.添加依赖 2.定义接口 3.实现接口 4.Controller类使用 5.启动类添加注释 6.浏览器访问 客户端服务降级 1.添加依赖 2.application.yml 中添加配置 3.定义接口 4.Controller类使用 …

解读意大利葡萄酒分类系统

由于该国众多的产区和复杂的品种,要想真正掌握意大利葡萄酒是相当困难的。仅仅是试图从复杂混乱的葡萄酒标签中辨别信息的想法就足以让许多人焦虑不安。 位于托斯卡纳的基安蒂酒地区,Il Ciliegio生产的葡萄酒标签上包含以下名称之一:基安蒂酒科利塞内西…

通过IP地址可以做什么

通过IP地址可以做很多事情,因为它是互联网通信的基础之一。本文将探讨IP地址的定义、用途以及一些可能的应用。 IP地址的用途 1. 设备标识:IP地址用于标识互联网上的每个设备,这包括计算机、服务器、路由器、智能手机等。它类似于我们日常生…