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

news2024/11/17 13:31:18

目录

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.coloradmin.cn/o/1118687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PT100温度传感器

热电阻是中低温区﹡常用的一种温度检测器。它的主要特点是测量精度高,性能稳定。其中铂热电阻的测量精确度是﹡高的,它不仅广泛应用于工业测温,而且被制成标准的基准仪。金属热电阻的感温元件有石英套管十字骨架结构&…

智能洗地机哪个牌子好用?智能洗地机品牌排行榜

为了偷懒人类发明了扫把、拖把等手动清洁工具,随着技术的进步出现了吸尘器、扫地机器人等等智能产品,近几年洗地机又以快速、直接、高效对市场进行了“颠覆”,如何快速在洗地机市场中挑选到适合自己的智能洗地机呢,我们一起来看看…

2023-10-18 LeetCode每日一题(执行 K 次操作后的最大分数)

2023-10-18每日一题 一、题目编号 2530. 执行 K 次操作后的最大分数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的…

node快速搭建一个学习资料共享平台

概述 本文要实现的功能比较简单&#xff1a;1、将想要共享的文件分文件夹的组织起来&#xff1b;2、别人可以通过界面进行搜索&#xff1b;3、可以在线预览或下载文件。基于这样的需求&#xff0c;本文分享通过node如何实现这样的功能。 实现效果 实现 1. node端服务 node端…

QT 操作Windows系统服务

Windows服务是在Windows操作系统上运行的后台应用程序&#xff0c;它们在系统启动时自动启动&#xff0c;并在后台持续运行&#xff0c;不需要用户交互。Windows服务的作用包括但不限于以下几个方面&#xff1a;1. 提供系统功能&#xff1a;许多Windows服务提供了系统级的功能和…

【Java题】实现继承和多态的例子

一&#xff1a;题目 1.员工类Employee&#xff1a; &#xff08;1&#xff09;私有成员变量&#xff1a;姓名&#xff0c;年龄&#xff0c;工资 &#xff08;2&#xff09;提供无参&#xff0c;有参构造 &#xff08;3&#xff09;成员方法&#xff1a;work()方法——员工工作 …

【算法|动态规划No.28】leetcode1312. 让字符串成为回文串的最少插入次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

lv8 嵌入式开发-网络编程开发 19 原始套接字

目录 1 链路层原始套接字用法 1.1 利用原始套接字实现类似wireshark的功能 1.2 利用原始套接字实现ping命令 2 网络层原始套接字用法 2.1 TCP原始套接字用法 1 链路层原始套接字用法 Linux中的原始套接字&#xff08;Raw Socket&#xff09;是一种高级套接字类型&#xff…

YOLOv5涨点必备!改进损失函数EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

目录 一&#xff0c;改进损失函数的作用 二&#xff0c;具体实现 一&#xff0c;改进损失函数的作用 YOLOv5损失函数的作用是衡量预测框与真实框之间的差异&#xff0c;并根据这些差异来更新模型的参数。它帮助模型学习如何准确地检测和定位目标物体&#xff0c;从而提高检测…

【分类讨论】CF1747D

Problem - D - Codeforces 题意 思路 一看这个做法一定就是分类讨论 先判无解 显然&#xff0c;如果区间异或和不是0一定无解 如果区间内全是0&#xff0c;答案一定是0 之后怎么讨论 注意到需要讨论区间长度 如果长度是奇数&#xff0c;那么直接操作即可&#xff0c;答…

【PyTorch】深度学习实践 1. Overview

目录 人工智能概述 课程前置知识 人工智能 问题分类 推理类 预测类 算法分类 传统算法与智能算法 人工智能领域细分 学习系统的发展 基于规则的系统 经典机器学习算法 表示学习方法 维度诅咒 说明 解决方法 第一代 第二代&#xff08;深度学习&#xff09; 传统…

数据结构: 红黑树

目录​​​​​​​ 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色&#xff0c;将其都改为黑色即可,然后向上调整 2.如果p红&#xff08;u黑/u不在&#xff09;&#xff0c;这时候左子树两红&#xff0c;于是给右子树一个红&#xff08;旋转变色&#xff09; 2.1…

华为ICT——第四章深度学习和积卷神经

接第三章的末尾&#xff1a; 目录 接第三章的末尾&#xff1a; 1&#xff1a;自适应阈值分割&#xff1a; 2&#xff1a;形态处理&#xff1a; 4&#xff1a;膨胀&#xff1a; 5&#xff1a;腐蚀 6&#xff1a;开运算 7&#xff1a;闭运算 8&#xff1a;特征描述子 9&#xf…

看《软能力》的读后感

最近在图书大夏看了一本书的一部分&#xff0c;书名是《软能力》。本人看到了几个有意思的观点。一是接一些兼职项目。 二是分享自己的技术&#xff0c;让同事能干自己的工作&#xff0c;让自己的工作变得别人也能干&#xff0c;才有机会让自己的职位提升。 三是让手动操作变…

Linux实战——网络连接模式的三种模式

Linux可以分为三种网络模式&#xff1a; 桥接模式 &#xff08;vmnet0) 仅主机模式 (vmnet1) NAT模式 (vmnet8) 当我们下载了vmware之后&#xff0c;在电脑会出现两个虚拟网卡&#xff0c;VMware Network Adapter VMnet1、VMware Network Adapter VMnet8。 可以通过查找 控…

巡检管理系统哪一款简单实用?如何解决传统巡检难题,实现高效监管?

在电力、燃气、水务等公共服务领域&#xff0c;线路巡检工作是保障公众安全、避免事故发生的重要环节。然而&#xff0c;传统的巡检方式存在一些显著的问题&#xff0c;可能会对公共安全和稳定运行产生不利的影响。为了解决这些问题&#xff0c;需要一种能够实现高效、精准的线…

多线程环境下如何安全的使用线性表, 队列, 哈希表

小王学习录 今日鸡汤安全使用ArrayList安全使用队列安全使用HashMap 今日鸡汤 安全使用ArrayList 使用synchronized锁或者reentrantLock锁使用CopyOnWriteArrayList(COW写时拷贝)类来代替ArrayList类. 多个线程对CopyOnWriteArrayList里面的ArrayList进行读操作, 不会发生线程…

原子核内的相互作用

原子核内的相互作用 氘核基态 和态的混合 核子-核子散射 低能核子-核子散射 n-p散射&#xff1a;只有核力 p-p散射&#xff1a;较复杂 n-n散射&#xff1a;n-n散射没有直接实验 低能 p-p 散射和核力的电荷无关性 高能核子-核子散射 核力的主要性质 核力主要性质 核力是短程力…

Qt第六十五章:自定义菜单栏的隐藏、弹出

目录 一、效果图 二、qtDesigner 三、ui文件如下&#xff1a; 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…