聊聊分布式架构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 协议包括两种基本模式:消息广播和崩溃恢复。
-
消息广播:这是 ZAB 协议的基本模式之一,用于确保 ZooKeeper 集群中的所有节点都接收到相同的消息。在这种模式下,ZooKeeper 集群中的 leader 节点负责将客户端请求转化为一系列的消息,然后将这些消息广播给所有的 follower 节点。每个 follower 节点接收到消息后,会将消息写入本地的事务日志。一旦超过半数的节点确认接收了消息,leader 就可以提交这些消息,并将其应用到自己的状态机上,从而达到状态一致性。这确保了 ZooKeeper 的一致性和可靠性。
-
崩溃恢复:是 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协议中,崩溃恢复模式可能出现的两个数据不一致的隐患场景:
-
服务器Leader在确认半数通过后完成了进行自身事务的提交,但是发送Commit告知Follower进行事务提交的瞬间异常,这是第一个需要保证的特性:确保在Leader服务器提交过的事务最终被所有服务器都提交。
-
ZAB协议规定:如果一个Proposal事务在一台机器上被处理成功,那么应该在所有的机器上都被处理成功,哪怕机器出现故障崩溃。(所以在过半确认过程中数据会被强制一致的)基于这个特性,如果Leader节点在提出了某个Proposal事务之后就崩了,没有告知到Follower进行本地提交,等崩溃恢复了,原本的Leader保留了提出这个Proposal的状态,此时应该直接丢弃而不是强制同步。这是第二个需要保证的特性:确保丢弃那些只在Leader服务器上被提出的事务。
结合这两种情况,ZAB协议设计的选举算法就必须要满足:能够确保提交已经被Leader提交的事务Proposal,同时丢弃已经被跳过的事务Proposal。
ZAB协议的Leader选举方案就是:拥有最大ZXID的Follower服务器作为新的Leader服务器。为什么呢?
-
在消息广播的过程中,Leader服务器进行自身事务的提交前提是收到了半数的Follower服务器的Ack响应,那么此时必然有Follower服务器的事务日志中保存了所有的proposal状态,包含Leader异常时提交的那份。
-
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 的核心特点
-
分布式文件系统:ZooKeeper 维护一个分层的命名空间,类似于文件系统目录结构,它可以用于存储配置信息和分布式数据。
-
一致性:ZooKeeper 提供了强一致性的数据模型,即一旦数据被写入,所有客户端都能读取到最新的数据,从而确保数据的一致性。
-
高可用性:ZooKeeper 以多数节点的方式运行,即在集群中的节点数必须超过半数,以确保高可用性。如果一些节点失效,ZooKeeper 仍然能够提供服务。
-
快速通知:ZooKeeper 允许客户端监听节点数据的变化,一旦节点数据发生变化,相关的客户端将得到通知。
-
顺序一致性:ZooKeeper 允许客户端按照顺序创建节点,并提供了有序性保证,这在分布式锁服务中非常有用。
ZooKeeper 的核心组件
-
集群:ZooKeeper 集群由多个节点组成,这些节点分布在不同的机器上,它们协同工作以提供服务。典型的 ZooKeeper 集群包括奇数个节点,通常是 3、5 或 7 个节点,以确保多数节点可用。
-
ZNode:ZNode 是 ZooKeeper 命名空间的基本单元,类似于文件系统中的目录或文件。每个 ZNode 可以包含数据,并具有一个路径名称。
-
会话:ZooKeeper 客户端与 ZooKeeper 服务器之间建立会话,会话是客户端与服务器之间的状态会话,用于保持连接和跟踪会话的生命周期。
-
Watch:客户端可以在 ZNode 上设置 Watch,以便在 ZNode 数据发生变化时获得通知。
-
选举算法: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 的一些典型应用场景:
-
分布式配置管理:ZooKeeper 可用于存储和管理应用程序的配置信息。各个分布式节点可以监听配置节点,当配置发生变化时,节点能够及时获取最新的配置,实现动态配置管理。
-
分布式锁服务:ZooKeeper 提供了分布式锁服务,允许多个节点协同竞争获取锁。这对于协调分布式系统中的操作非常有用,确保只有一个节点能够执行关键操作。
-
分布式一致性:ZooKeeper 可以用于协调多个节点以达成一致的决策。它确保在分布式系统中节点的状态和数据是一致的,从而提供强一致性的数据存储。
-
服务发现:ZooKeeper 可用于注册和发现分布式系统中的服务。各个服务可以在 ZooKeeper 上注册自己的地址和状态,其他节点可以查询这些信息以发现可用的服务。
-
领导者选举:ZooKeeper 通常用于选举分布式系统中的领导者节点。它确保只有一个节点成为领导者,从而协调系统的操作。
-
分布式任务队列:ZooKeeper 可用于创建分布式任务队列,多个节点可以将任务推送到队列中,然后从队列中获取任务进行处理。
-
分布式协同协作:ZooKeeper 提供了分布式协调服务,可以用于构建分布式应用程序,确保多个节点协同协作并实现一致性。
-
分布式文件系统:虽然 ZooKeeper 不是一个文件系统,但它可以用于管理分布式系统中的文件和配置信息,作为分布式文件系统的一部分。
参考资料:从Paxos到Zookeeper 分布式一致性原理与实践 [倪超著]
相关文章:

聊聊分布式架构10——Zookeeper入门详解
目录 01ZooKeeper的ZAB协议 ZAB协议概念 ZAB协议基本模式 消息广播 崩溃恢复 选举出新的Leader服务器 数据同步 02Zookeeper的核心 ZooKeeper 的核心特点 ZooKeeper 的核心组件 选举算法概述 服务器启动时的Leader选举 服务器运行期间的Leader选举 03ZooKeeper的…...

springmvc视图格式——模板引擎freemarker输出HTML文本
目录 1. freemarker 介绍创建测试工程2.2.2) 配置文件2.2.3) 创建模型类2.2.4) 创建模板2.2.5) 创建controller2.2.6) 创建启动类2.2.7) 测试 2.3) freemarker基础2.3.1) 基础语法种类2.3.2) 集合指令(List和Map)2.3.3) if指令2.3.4) 运算符2.3.5) 空值处…...

用长tree方式做等长线
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: 用set_data_check的方式做等长线 前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。 1)写一个sdc,把等长线的起点设置成clock source,用于创建create_…...

C# out参数out多个参数
文章目录 C# out参数out多个参数背景说明作用方法定义调用方法测试结果注意 C# out参数out多个参数 背景说明 一个方法返回多个相同数据类型的变量,可以采用数据的方式; 我需要返回多个不同数据类型的方法,在这里采用out多个参数的方式。 …...
选择Android还是IOS?我终于明白了!
选择Android还是iOS,取决于个人的喜好和需求。以下是一些可能帮助您做出决策的考虑因素: 用户界面和易用性: iOS系统的界面比Android更加简单、易用,而且应用程序布局更加一致,可以更快地学会如何使用。Android系统除了…...

uniapp高德地图ios 使用uni.chooseLocation选取位置显示没有搜索到相关数据
uniapp云打包后,高德地图ios选取位置显示“ 对不起,没有搜索到相关数据” 详细问题描述 废话不多说,直接上图 解决方案 1.打开高德地图开发平台 2.重新创建key 3.获取云打包时的ios报名作为安全码 4.使用生成的高德key更改manifest.json里…...

Python绘制论文中的图形
一、条形图 使用场景:对多个实验方法的性能进行比较。代码: #条形图 import matplotlib.pyplot as plt import numpy as np#实验数据,每一行代表一个method,每一列代表一个性能指标 dataacc [[0.9504, 0.9315, 0.9420, 0.9409]…...
flutter复制口令返回app监听粘贴板
overridevoid didChangeAppLifecycleState(AppLifecycleState state) {switch (state) {case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。break;case AppLifecycleState.resumed: //从后台切换前台,界面可见handle();b…...

学习pytorch14 损失函数与反向传播
神经网络-损失函数与反向传播 官网损失函数L1Loss MAE 平均MSELoss 平方差CROSSENTROPYLOSS 交叉熵损失注意code 反向传播在debug中的显示code B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/nn.html#loss-functions 损失函数 L1Loss MAE 平均 import to…...

windows平台下Qt Creator的下载与安装流程
下载 下载地址:https://download.qt.io/archive/ 下载界面 进入qt或者qtcreator都可以 版本选择 这里我选择进入qt进行下载,进入之后有多个版本可以选择。 注意:从Qt5.15版本开始,Qt公司不在提供开源离线安装程序,此…...

在 Python 中使用 Pillow 进行图像处理【3/4】
第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg,您可以从本教程链接的存储库中下载该文件: 该二值图像的左侧显示黑色背景上的白点,而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用…...
【Java】迭代器的next方法
Collection 集合的遍历 概述:Iteration:迭代器,集合的专用遍历方式 Iterator<E> Iterator() 返回在此 collection 的元素上进行迭代的迭代器boolean hasNext() 如果返回仍有元素可以迭代,则返回 trueE next() 返回迭代的下一…...

java智慧工地云平台源码,以物联网、移动互联网技术为基础,结合大数据、云计算等,实现工程管理绿色化、数字化、精细化、智能化的效果
智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,围绕人、机、料、法、环等各方面关键因素,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式,智…...

Unity 通过jar包形式接入讯飞星火SDK
最近工作上遇到了要接入gpt相关内容的需求,简单实现了一个安卓端接入讯飞星火的UnitySDK。 或者也可以接入WebSocket接口的。本文只讲安卓实现 我使用的Unity版本为2021.3.27f1c2 Android版本为4.2.2 1.下载SDK 登陆讯飞开放平台下载如图所示SDK 2.新建安卓工程…...

python轻量规则引擎rule-engine入门与应用实践
rule-engine是一种轻量级、可选类型的表达式语言,具有用于匹配任意 Python 对象的自定义语法,使用python语言开发。 规则引擎表达式用自己的语言编写,在 Python 中定义为字符串。其语法与 Python 最相似,但也受到 Ruby 的一些启发…...
栓Q八股文: C++ 14/17 新特性
C 14 翻译: 【翻译】C14的新特性简介-腾讯云开发者社区-腾讯云 C 17翻译:【翻译】C17的新特性简介-腾讯云开发者社区-腾讯云 原理:C Lambda 原理和编译器实现_clamda实现原理-CSDN博客...

虚拟世界游戏定制开发:创造独一无二的虚拟体验
在游戏开发领域,虚拟世界游戏定制开发是一项引人注目的任务,旨在满足客户独特的需求和愿景,创造一个完全个性化的虚拟世界游戏。这种类型的游戏开发需要专业的技能、深刻的游戏开发知识和密切的与客户合作,以确保游戏满足客户的期…...

Tomcat及jdk安装下载及环境配置(超超超详解)
我是看了两篇博客安装配置好的 jdk 最详细jdk安装以及配置环境(保姆级教程)_安装jdk需要配置环境变量吗-CSDN博客 tomcat Tomcat的下载安装与配置及常见问题处理【Win11】 - 鞠雨童 - 博客园 (cnblogs.com) 本篇文章是我解决了很多朋友的tomcat配置问题总…...

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明
基本介绍 极限投屏是一款批量投屏管理安卓设备的软件,是QtScrcpy作者基于QtScrcpyCore开发,主要功能有: 设备投屏&控制:单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…...

C++:二叉搜索树的原理和模拟实现
文章目录 二叉搜索树二叉搜索树的基本实现原理 二叉搜索树的实现非递归版本的实现递归版本的实现 二叉搜索树 二叉搜索树也叫做二叉排序树,可以是空树,也可以是满足一些要求的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...