Zookeeper 核心知识深度解析:从选主到部署

1.请简述Zookeeper的选主流程

Zookeeper 是一个用于维护配置信息、命名、提供分布式同步和组服务的工具。它在分布式系统中提供了强一致性,这得益于它的内部实现机制,其中包括选主流程(Leader Election)。以下是 Zookeeper 的选主流程简述:

  1. 初始化阶段

    • 当 Zookeeper 集群启动时,所有的服务器都处于 LOOKING 状态,意味着它们正在寻找一个领导者。
  2. 投票过程

    • 每个服务器都会创建一个选举对象,这个对象包含了服务器ID(myid)和ZXID(事务ID),其中服务器ID是唯一的,而ZXID表示该服务器所处理的最新事务的ID。
    • 每个服务器会向集群中的其他服务器发送自己的选举对象,同时接收来自其他服务器的选举对象。
    • 在收到其他服务器的选举对象后,每个服务器会比较自己和接收到的选举对象的 ZXID。如果接收到的对象的 ZXID 更大,则认为那个对象更适合作为领导者;如果 ZXID 相同,则比较服务器 ID,较大的服务器 ID 更有优势。
  3. 确定领导者

    • 经过一轮或多轮投票之后,当某个服务器获得了超过半数的票数时,它就被选为了领导者(Leader)。
    • 如果没有服务器获得超过半数的票数,则会进入新一轮的投票,直到选出领导者。
  4. 确认领导者

    • 一旦有一个服务器被选为领导者,其他服务器就会转换为跟随者(Follower)状态,并开始与领导者同步数据。
    • 跟随者会向领导者发送心跳包以保持连接,确保领导者知晓它们的状态。
  5. 结束选主

    • 当领导者和所有跟随者完成数据同步,并且领导者已经成功地与超过半数的跟随者建立了连接,那么选主过程就结束了。
    • 此后,领导者负责处理所有的写操作,并将变更广播给跟随者,以保证集群的一致性。
  6. 故障转移

    • 如果领导者发生故障或离线,Zookeeper 集群将会检测到这一点,并触发新的选主流程来选择一个新的领导者。

Zookeeper 使用的是一个被称为“Fast Leader Election”(简称 FLE)的算法来执行上述流程。这个算法设计得非常高效,可以快速选出领导者,从而最小化了分布式系统的停机时间。

2.为什么Zookeeper集群的数目,一般为奇数个?

Zookeeper 集群的节点数一般推荐配置为奇数个,主要是为了提高系统的容错能力和决策效率,具体原因如下:

  1. 多数原则(Majority Voting)

    • Zookeeper 使用一种称为 Paxos 或 ZAB (ZooKeeper Atomic Broadcast) 的一致性算法来保证分布式系统中数据的一致性。在这种算法中,对于任何提议(例如选主、写操作等),需要集群中超过半数的节点同意才能成功。
    • 如果集群中有 N 个节点,那么需要至少 (N/2 + 1) 个节点达成一致才能做出决定。当 N 是奇数时,(N/2 + 1) 是一个整数,而如果 N 是偶数,则 (N/2 + 1) 向上取整后会是下一个整数。
  2. 优化决策效率

    • 假设我们有一个由 4 个节点组成的集群,要达成多数同意就需要 3 个节点参与。如果我们有一个由 5 个节点组成的集群,同样也需要 3 个节点达成一致。因此,在这两个例子中,增加到 5 个节点并没有增加所需的多数数量,但提高了系统的容错能力——即可以容忍更多节点失败。
    • 然而,与拥有 4 个节点的集群相比,5 个节点的集群可以在其中一个节点失败的情况下仍然保持运作,并且在投票过程中只需要联系其他 4 个中的任意 2 个节点即可达成多数意见,这在理论上减少了延迟。
  3. 提升容错能力

    • 拥有奇数个节点可以更好地处理节点故障。例如,在一个 3 节点的集群中,即使有一个节点不可用,剩下的两个节点仍然可以构成多数并继续提供服务。而在 4 节点的集群中,如果一个节点失败,剩下 3 个节点仍然需要 2 个节点来形成多数,但这实际上和 3 节点集群的效果相同,同时增加了复杂性和成本,却没有显著提高容错性。

综上所述,使用奇数个节点可以确保 Zookeeper 集群能够在尽可能少的节点数量下获得最佳的容错性能和决策效率。通常推荐的最小集群大小是 3 个节点,这样可以在一个节点失败时仍能正常工作;更大的生产环境可能会选择 5 或 7 个节点以进一步提高可用性和稳定性。

3.知道Zookeeper监听器的原理吗?

Zookeeper 的监听器(Watcher)机制是其核心特性之一,它允许客户端在某些事件发生时得到通知。这些事件可以是关于 Zookeeper 节点(znode)的数据变化、子节点列表的变化等。下面是 Zookeeper 监听器的原理概述:

  1. 注册监听

    • 当客户端对某个 znode 进行读取操作(如 getDatagetChildren 等)时,它可以同时注册一个监听器。这个监听器是一个回调函数,在指定的事件发生时会被触发。
  2. 事件触发

    • 一旦被监控的 znode 发生了特定类型的变更(例如数据更新、子节点添加或删除),Zookeeper 服务器就会向所有对该 znode 注册了相应类型监听器的客户端发送一个事件通知。
  3. 单次触发

    • 每个监听器是一次性的,也就是说,当监听器触发后,它将自动失效。如果客户端希望继续接收该 znode 的变更通知,则需要重新注册监听器。
  4. 异步通知

    • 监听器事件的通知是异步发生的,即它们不会阻塞客户端正在进行的操作。当事件触发时,Zookeeper 会通过客户端的连接发送一个轻量级的消息给客户端,然后由客户端决定如何处理这个事件。
  5. 事件类型

    • Zookeeper 支持多种类型的监听器事件,包括但不限于:节点创建(Created)、节点删除(Deleted)、节点数据变更(Changed)和子节点列表变更(Child)。
  6. 持久化与临时监听器

    • 对于 exists 请求,监听器可以设置为持久化的,意味着即使当前节点不存在,如果之后创建了该节点,监听器也会被触发。
    • 对于 getDatagetChildren,监听器是非持久化的,只有在节点存在的情况下才会生效,并且一旦触发就会失效。
  7. 连接状态变化监听

    • 客户端还可以注册监听器来监听自身与 Zookeeper 服务器之间的连接状态变化,比如连接建立、断开或者重连等。
  8. 监听器的局限性

    • 由于监听器是一次性的并且依赖于客户端与服务器之间的连接,因此在网络不稳定或高延迟环境中可能会出现丢失监听器通知的情况。
    • 此外,监听器只能告知发生了什么类型的事件,但不会提供事件的具体内容,客户端需要再次发起请求获取最新的数据。
  9. 最佳实践

    • 在设计系统时,应该考虑到监听器的一次性和潜在的丢失问题,确保业务逻辑能够正确处理这些情况。此外,应避免在监听器回调中执行耗时操作,以免影响其他监听器的通知响应速度。

通过使用监听器,Zookeeper 提供了一种高效的方式让分布式系统的组件之间保持同步并及时响应配置或状态的变化。然而,开发者应当谨慎使用监听器,以避免因过度使用而导致性能下降或其他问题。

4.说说Zookeeper中的ACL 权限控制机制

Zookeeper 提供了一套基于访问控制列表(ACL, Access Control List)的权限控制机制,用于保护节点(znode)的安全。ACL 机制允许管理员为每个 znode 设置特定的用户或身份验证方式,并赋予这些用户不同的权限级别。以下是 Zookeeper 中 ACL 权限控制机制的主要方面:

ACL 组成

ACL 是由一对元素组成的:身份认证标识(scheme:credential)和权限(perms)。其中:

  • Scheme 定义了身份验证的方式,比如 worldauthdigestip 等。
  • Credential 是与 scheme 相关的身份验证信息。例如,在 digest scheme 下,它是一个用户名和密码的哈希值;在 ip scheme 下,它是一个 IP 地址。

权限类型

对于每个 znode,可以设置以下几种权限:

  • CREATE ©: 允许创建子节点。
  • READ ®: 允许读取节点数据和列出其子节点。
  • WRITE (W): 允许设置节点数据。
  • DELETE (D): 允许删除子节点。
  • ADMIN (A): 允许设置权限(即更改该节点的 ACL)。

常见的 Scheme 类型

  1. world:

    • 只有一个通配符身份 "world:anyone",它代表所有用户,通常用来开放或关闭对某个 znode 的访问。
  2. auth:

    • 匹配任何通过身份验证的客户端,而不考虑具体的 scheme 和 credential。
  3. digest:

    • 使用用户名和密码进行身份验证,格式为 username:password,实际存储的是 SHA-1 哈希值。
  4. ip:

    • 根据客户端的 IP 地址进行匹配,适用于限制特定 IP 或 IP 段的访问。
  5. super:

    • 超级用户模式,通常用在配置文件中指定,具有对所有 znode 的完全访问权限。

设置 ACL

可以通过 Zookeeper API 或命令行工具来设置 znode 的 ACL。例如,使用 CLI 工具可以如下设置:

set_acl /path/to/node "digest:username:password" cdrwa

这行命令将为 /path/to/node 设置一个 digest 方式的身份验证,并赋予所有权限(create, delete, read, write, admin)。

ACL 的继承性

需要注意的是,ACL 不会自动从父节点传递给子节点。每个 znode 都有自己的 ACL,必须单独设置。如果希望多个 znode 共享相同的 ACL,需要手动为每个 znode 设置。

总结

Zookeeper 的 ACL 机制提供了细粒度的权限控制,确保只有授权的客户端才能执行特定的操作。正确配置 ACL 对于保护敏感数据和确保分布式系统的安全至关重要。管理员应当根据实际需求谨慎地设置 ACL,以平衡安全性和易用性。

5.Zookeeper 有哪几种部署模式?

Zookeeper 支持多种部署模式,以适应不同的应用场景和需求。以下是 Zookeeper 的主要部署模式:

1. 单机模式(Standalone Mode)

  • 描述:这是最简单的部署方式,Zookeeper 运行在单个服务器上。
  • 适用场景:适用于开发环境或测试环境,因为在这种模式下没有冗余,一旦该服务器发生故障,服务就会中断。
  • 配置:只需启动一个 Zookeeper 实例。

2. 集群模式(Replicated/Ensemble Mode)

  • 描述:集群模式也被称为 Ensemble 模式,它由多个 Zookeeper 服务器组成,通常建议至少三个节点,以确保即使有一个节点失效,系统仍然可以正常工作。
  • 适用场景:适用于生产环境中,提供了高可用性和容错性。集群中的所有服务器都保存着相同的数据副本,并通过选主协议来保证数据的一致性。
  • 配置:每个服务器都需要配置 myid 文件来标识自身的身份,并且需要在 zoo.cfg 配置文件中指定其他集群成员的信息。

3. 观察者模式(Observer Mode)

  • 描述:观察者模式是集群模式的一种扩展,其中包含了一类特殊的节点——观察者(Observer)。观察者参与读取请求的处理,但不参与写入操作的投票过程,也不参与领导者的选举。
  • 适用场景:当需要增加系统的读取能力而不想影响到写入性能时,可以添加观察者节点。这种方式可以在不影响一致性的情况下提升系统的扩展性。
  • 配置:观察者节点的配置与普通集群成员类似,但在 zoo.cfg 中需额外设置 observer 参数。

4. 不对称集群模式(Unsymmetric Ensemble Mode)

  • 描述:这是一种较为少见的部署模式,其中集群成员分为两类:全权成员(Full Participants)和轻量级成员(Lightweight Participants)。轻量级成员不会参与领导者选举和写操作的共识过程,但是它们会同步数据并能够响应客户端的读请求。
  • 适用场景:这种模式可以用来提高集群的读性能,同时减少写入延迟。然而,它要求更复杂的配置并且不是所有版本的 Zookeeper 都支持。
  • 配置:需要特别的配置来区分不同类型的成员,并确保轻量级成员正确地加入集群。

总结

选择合适的 Zookeeper 部署模式取决于具体的业务需求、性能考虑以及可用性要求。对于大多数生产环境而言,集群模式是最常用的选择,因为它提供了良好的容错性和高可用性。而在某些特定情况下,如需要额外的读取负载分担,可以考虑使用观察者模式或者不对称集群模式。

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

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

相关文章

从0开始学习搭网站第二天

前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1:下载nacos 地址:https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务,新建数据库:nacos_yh 4:解压下载的nacos_server 进入conf目录 5:mysql运行sql脚本变得到下面的表 6&a…

Spring MVC流程一张图理解

由于现在项目中大部分都是使用springboot了,但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…

数据分析如何正确使用ChatGPT进行辅助?

目录 1.数据介绍 2.特征工程 3.EDA分析 4.数据相关性分析 5.分析总结 一篇优秀的学术论文,肯定有新颖、适当的论证视角,选择恰当的研究方法,搭建逻辑严密、平衡的论证框架,把有力的数据分析紧密结合起来,这样一篇…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的,用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此,如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用,那…

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂,在苦难中萃取的坚韧才值得珍视; 痛苦同样不必美化,从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角, 但每个人又都是自己生活剧本里的英雄。滑雪,是姿态优雅的“贴地飞行”,也有着成…

openplant实时数据库(二次开发)

资源地址 我的网盘〉软件>数据库>openplant>openplant实时数据库(二次开发)

SpringBoot链接Kafka

一、SpringBoot生产者 (1)修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…

Win11下python 调用C++动态链接库dll

这里写自定义目录标题 Win11下python 调用C动态链接库dll环境修改C语言代码Visual Studio 2019生成dllPython 加载DLLpython 数据类型适配python调用函数 Win11下python 调用C动态链接库dll 在一些耗时的函数上考虑使用C进行加速,涉及把cpp文件转为dll,…

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源: 论文链接:https://arxiv.org/pdf/2501.06252 代码链接:SakanaAI/self-adaptive-llms 论文发布时间:2025年1月14日 二、论文概述: 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

CSRF(跨站请求伪造)深度解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具,可以根据dockerfile自动化的部署docker容器。是yaml文件格式,注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f:指定文件,up&…

QNAP 上常用的几款软件

当我们谈到 NAS(Network Attached Storage)时,QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态,已成为很多家庭及中小型企业的首选。除了存储本身,QNAP 提供的各种官方软件和应用,也为用户带…

Jmeter进行http接口并发测试

目录: 1、Jmeter设置(1)设置请求并发数(2)设置请求地址以及参数(3)添加结果数 2、启动看结果 1、Jmeter设置 (1)设置请求并发数 (2)设置请求地址…

9,STL——vector类

一、vector类的介绍和使用 1,了解vector vector类的官方介绍https://cplusplus.com/reference/vector/vector/ 使用STL的三个境界:能用,明理,能扩展 1). vector是表示可变大小数组的序列容器。 2). 就像数组一样,…

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列,故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息 Kafka生产者——向Kafka写入数据 不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写…

python识别图片中指定颜色的图案并保存为图片

示例代码: def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…

golang 环境变量配置

一、GoLand显示环境如下 修改环境变量 新建系统变量 GOROOT: D:\ENSPACE\golandsdk\1.23.1\go1.23.1新建系统变量 GOPATH:工作目录(在下面目录下新建目录:src,项目工程目录都要建在src下如:demo1 demo2) D…

当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限

在自动化控制技术日新月异的当下,Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议,而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…