深入解析 ZooKeeper:分布式协调服务的原理与应用
1.说说 Zookeeper 是什么?
ZooKeeper 是一个开源的分布式协调服务,由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务,例如命名、配置管理、同步(包括锁和选举)、组成员关系等。
ZooKeeper 提供了一个类似文件系统的层次结构数据模型,使用一系列以斜杠(/)分隔的名字来表示节点(称为 znode)。每个 znode 可以存储少量的数据(最多 1MB)以及拥有子节点。客户端可以通过创建、读取、更新或删除这些 znode 来实现各种协调功能。
主要特性包括:
- 一致性:ZooKeeper 确保所有客户端看到相同的数据视图。
- 简单性:API 和编程接口易于使用。
- 高可用性和可靠性:通过复制到多个服务器上来保证服务的可用性和数据的持久性。
- 快速读取:ZooKeeper 被优化为能够快速响应读取请求,这对于许多协调任务来说是非常重要的。
- 原子性:更新要么完全成功,要么完全失败,不会出现部分更新的情况。
- 顺序性:对于来自单个客户端的一系列更新,ZooKeeper 会按照它们发送的顺序进行应用。
ZooKeeper 常用于大型分布式系统中,如 Hadoop 分布式文件系统 (HDFS),Apache Kafka, Apache Storm 等,作为其核心组件之一来帮助管理集群状态和服务发现。
2. ZooKeeper 有哪些应用场景?
ZooKeeper 由于其强大的协调服务特性,被广泛应用于多种分布式系统的场景中。以下是一些常见的应用场景:
命名服务(Name Service):
- 分布式系统中的节点需要一种机制来定位其他的服务或资源。ZooKeeper 可以提供一个集中的位置来注册和查找服务名称。
配置管理(Configuration Management):
- ZooKeeper 可以用来集中存储系统的配置信息,使得所有客户端都可以从中读取最新的配置,并且可以监听配置变化以便实时更新。
集群管理(Group Membership):
- 确定哪些机器是集群的一部分,以及它们的状态(例如在线、离线)。这通常用于负载均衡器来决定如何分配请求。
分布式锁(Distributed Locks):
- ZooKeeper 提供了对分布式锁的支持,允许多个客户端在竞争共享资源时进行协调,确保只有一个客户端能够获得锁并执行特定的操作。
领导者选举(Leader Election):
- 在某些情况下,如主备切换,系统需要选择一个“领导者”节点来执行特殊的任务。ZooKeeper 的临时顺序节点特性可以实现公平的领导者选举算法。
屏障(Barrier):
- 这是一种同步原语,可以让一组进程等待直到所有成员都到达某个点,然后一起继续前进。这对于分阶段的任务非常有用。
队列管理(Queue Management):
- 实现两种类型的队列:FIFO 队列(先进先出)和优先级队列。通过创建持久性或临时顺序节点来组织队列。
事件通知(Event Notification):
- ZooKeeper 允许客户端订阅数据变更的通知,当所监视的数据发生变化时,会触发相应的回调函数。
服务发现(Service Discovery):
- 应用程序可以通过 ZooKeeper 发现可用的服务实例,这有助于构建动态的服务网格和服务路由逻辑。
这些只是 ZooKeeper 可能应用的一些领域;实际上,任何需要跨多个节点协调状态的应用程序都可以考虑使用 ZooKeeper 来简化开发和维护工作。随着微服务架构和云原生应用的发展,ZooKeeper 仍然是一个重要的工具,尽管有一些替代品如 etcd 和 Consul 也在这一领域提供了相似的功能。
3.说说Zookeeper的工作原理?
ZooKeeper 的工作原理基于一个叫做 ZAB(ZooKeeper Atomic Broadcast)的协议,这是一个为分布式系统设计的原子消息广播协议。它的工作原理可以分为以下几个关键方面:
1. 集群结构
ZooKeeper 是以集群的形式运行的,通常由奇数个节点组成(如3、5或7),以确保能够达成多数派共识。每个 ZooKeeper 实例被称为一个服务器(Server)。在集群中,有一个领导者(Leader)和若干跟随者(Follower)。领导者负责处理所有的写操作,并协调跟随者的活动;而跟随者则处理读操作,并参与投票来选举新的领导者。
2. 领导者选举
当集群启动或者领导者失效时,会触发一次领导者选举过程。每个服务器都会提议自己作为领导者,然后通过一轮或多轮投票选出得票最多的服务器成为新的领导者。一旦选举完成,领导者就会开始接收客户端请求并协调集群中的其他服务器。
3. 数据模型与层次结构
ZooKeeper 提供了一个类似文件系统的数据模型,使用路径来表示不同的节点(称为 znode)。znode 可以包含数据以及拥有子节点。这个层次结构允许应用程序构建复杂的状态信息树形图。每个 znode 上的数据是原子性的,即要么全部读取成功,要么全部失败。
4. 写操作的一致性
对于写入请求,它们首先会被发送给领导者。领导者将这些更新提案转发给所有跟随者,等待大多数跟随者确认后才会应用更改。这保证了即使部分服务器故障,数据仍然保持一致性和持久性。如果领导者在写入过程中失败,则会触发新一轮的领导者选举。
5. 读操作的高效性
读操作可以直接由任意跟随者处理,不需要经过领导者,这样可以提高读取性能。由于数据在集群内被同步复制,因此跟随者持有的数据视图是最新且一致的。
6. 临时节点和监视机制
ZooKeeper 支持创建临时节点(ephemeral node),这类节点在其创建者断开连接后自动删除。此外,客户端可以设置监视器(Watcher)来监听特定 znode 的变化事件,比如数据更新、子节点添加等。当有变化发生时,ZooKeeper 会通知相应的客户端。
7. 版本控制
为了防止并发修改冲突,ZooKeeper 为每个 znode 维护了一个版本号。每次对 znode 进行更新时,版本号都会增加。客户端可以在执行更新前检查版本号,以确保他们正在操作的是最新的数据副本。
通过上述机制,ZooKeeper 能够提供高可用、强一致性的服务,适用于各种需要分布式协调的应用场景。
4.请描述一下ZooKeeper的通知机制是什么?
ZooKeeper 的通知机制是通过 Watcher(监视器)实现的,这是一种事件驱动的通知方式,允许客户端监听 ZooKeeper 中的数据节点(znode)的变化。当指定的 znode 发生了特定类型的变更时,ZooKeeper 会触发相应的事件,并向注册了该事件的客户端发送通知。
Watcher 特性
- 一次性触发:每个 Watcher 是一次性的,即一旦被触发后就会自动移除。如果想要持续接收某个 znode 的变化通知,客户端需要在每次收到通知后重新设置 Watcher。
- 异步通知:Watcher 的通知是非阻塞的,它们会在后台线程中处理,因此不会影响主线程的执行流程。这意味着应用程序可以在不影响性能的情况下响应事件。
- 轻量级:Watchers 设计为轻量级组件,旨在提供快速、简单的通知机制。由于它们不携带大量数据,所以非常适合用于状态变化的即时反馈。
- 类型多样:可以为不同的操作和事件设置 Watcher,例如节点创建、节点删除、节点数据更改以及子节点列表变动等。
Watcher 的使用场景
- 读取数据时设置 Watcher:当你调用 getData() 或 getChildren() 方法来获取 znode 的内容或子节点列表时,你可以同时设置一个 Watcher 来监控这些资源的变化。
- 节点创建/删除:可以通过设置 Watcher 来监听某个路径下是否新增或移除了 znode。
- 子节点变更:对于有子节点的父节点,可以设置 Watcher 来跟踪其子节点集合的变化。
Watcher 的生命周期
- 注册:当客户端首次连接到 ZooKeeper 或者在执行某些 API 调用(如 getData() 或 exists())时,可以注册 Watcher。
- 触发:当所监视的条件发生变化时,ZooKeeper 服务器会向客户端发送一个事件通知。这个过程是异步完成的,通常是在客户端的回调函数中处理。
- 注销:一旦 Watcher 被触发,它将从 ZooKeeper 系统中移除。若想继续接收后续事件,必须再次注册相同的 Watcher。
注意事项
- 网络分区问题:在网络分区的情况下,可能会导致部分客户端无法接收到通知。这是由于 ZooKeeper 遵循 Paxos/ZAB 协议的一致性保证,在网络分裂期间,只有包含大多数服务器的分区能够继续接受写入并发送通知。
- 重连后的 Watcher 处理:如果客户端与 ZooKeeper 断开连接后又重新连接,之前注册的所有 Watcher 将失效。因此,开发者需要考虑如何在客户端恢复连接后重新设置必要的 Watcher。
总之,Watcher 提供了一种灵活且高效的方法来监控 ZooKeeper 中的状态变化,使得分布式系统中的各个组件能够及时响应环境的动态变化。
5.Zookeeper 对节点的 watch 监听通知是永久的吗?
ZooKeeper 对节点的 Watch(监视)监听通知并不是永久的。每个 Watcher 是一次性触发的,这意味着一旦被激活或触发后,它就会自动移除。如果客户端希望持续接收到某个特定事件的通知,那么就需要在每次收到通知之后重新设置 Watcher。
一次性触发
- 单次触发:当一个 Watcher 被设置在一个 znode 上,并且该 znode 发生了所监视的事件(例如数据变更、子节点增删等),Watcher 将会触发一次。一旦触发,这个 Watcher 就会被 ZooKeeper 系统自动删除,不会再次触发。
- 重新设置:为了继续接收同一 znode 的后续变化通知,应用程序必须在处理完当前的 Watcher 通知后,显式地再次调用相关 API 方法来重新注册一个新的 Watcher。
例子
假设你有一个客户端程序定期检查某个配置 znode 的内容是否发生变化。你需要在每次读取配置时设置 Watcher:
Stat stat = new Stat();
byte[] data = zookeeper.getData("/config", true, stat); // 设置 watcher
// 当"/config" znode的数据发生变化时,会触发watcher并通知客户端。
在这个例子中,true 参数表示为这次 getData() 操作设置一个 Watcher。当 /config znode 的数据发生变化时,Watcher 将被触发,并且客户端将收到通知。然而,这之后如果还想继续监控该节点的变化,就必须在处理完这次通知后再重新设置 Watcher。
断开连接后的处理
另外需要注意的是,如果客户端与 ZooKeeper 服务器之间的连接断开了,所有之前设置的 Watchers 都将失效。因此,在客户端重新连接到 ZooKeeper 后,应该考虑重新设置那些重要的 Watchers。
综上所述,ZooKeeper 的 Watcher 机制设计为轻量级和一次性的,以避免长时间持有不必要的状态信息,并确保系统的高效性和稳定性。对于需要长期监控的需求,开发者应实现适当的逻辑来管理 Watcher 的创建和重置。
相关文章:
深入解析 ZooKeeper:分布式协调服务的原理与应用
1.说说 Zookeeper 是什么? ZooKeeper 是一个开源的分布式协调服务,由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务,例如命名、配置…...

【Rust自学】11.10. 集成测试
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也…...
对当前日期进行按年、按月、按日的取值
对当前日期进行按年、按月、按日的取值。 其规则为: 按年 为当前日期到来年同一日期的前一天(2024-12-01到2025-11-30)。 按月 为当前日期到下个月的同一日期的前一天 (2024-12-01 到 2024-12-31)。 按日 为当前日…...

【Rust自学】12.2. 读取文件
12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...

C++内存泄露排查
内存泄漏是指程序动态分配的内存未能及时释放,导致系统内存逐渐耗尽,最终可能造成程序崩溃或性能下降。在C中,内存泄漏通常发生在使用new或malloc等分配内存的操作时,但没有正确地使用delete或free来释放这块内存。 在日常开发过程…...
Http 响应状态码 前后端联调
http 响应状态码 :是服务器在处理HTTP请求时返回的状态信息,用于表示请求的处理结果 1xx : 信息性状态码 100 Continue: 服务器已收到请求头部,客户端应继续发送请求体。 101 Switching Protocols : 切换协议。服务器已理解客户端的请求&a…...
48_Lua错误处理
在编写Lua应用时,都可能会遇到不可预见的错误,而错误处理是确保程序稳定性和健壮性的关键环节。有效的错误处理不仅能防止程序崩溃,还能提供有用的反馈信息给开发者或最终用户,从而提高应用程序的质量。本文将详细介绍Lua中的错误处理机制。 1.错误类型 Lua中的错误类型主…...

shell脚本回顾1
1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 一、 ll /tmp/size.log &>/dev/null if [ $? -eq 0 ];then cat /tmp/size.log else touch /tmp/size.log echo date > /tmp/size.log fi二、 if …...

【3】管理无线控制器
1.概述 本文主要介绍AireOS WLC的管理。WLC的管理可以通过CLI和GUI两种方式,而CLI主要分为console接入、telnet以及SSH的登录管理;GUI的管理分为HTTP和HTTPS。 2.CLI的管理 通过console实现的CLI管理这里就单独进行说明了,只要能找到设备的console接口,通过一般的RJ45接…...

SOME/IP 协议详解——服务发现
文章目录 1. Introduction (引言)2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General(概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项(Co…...

Flutter:封装ActionSheet 操作菜单
演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …...

力扣 全排列
回溯经典例题。 题目 通过回溯生成所有可能的排列。每次递归时,选择一个数字,直到选满所有数字,然后记录当前排列,回到上层时移除最后选的数字并继续选择其他未选的数字。每次递归时,在 path 中添加一个新的数字&…...
Golang 设计模式
文章目录 创建型模式简单工厂模式图形接口具体图形类:圆形具体图形类:矩形工厂类定义使用简单工厂模式 抽象工厂模式1. 定义产品接口2. 定义具体产品实现类3. 定义抽象工厂接口4. 定义具体工厂实现类5. 使用抽象工厂创建对象并使用产品 创建者模式1. 定义…...

Matlab 具有周期性分布的死角孔的饱和空气多孔材料的声学特性
本文对直主孔含侧空腔(死角)的饱和空气多孔介质中的声传播进行了理论和数值研究。侧腔位于沿每个主孔周期性间隔的“节点”上。研究了侧向空腔分布中周期性的影响,并单独考虑了紧间隔死角的低频极限。结果表明,吸附系数和透射损失…...
maven 项目怎么指定打包后名字
在 Spring Boot 的 Maven 项目中,你可以通过配置 pom.xml 文件来指定打包后的文件名。具体步骤如下: 打开 pom.xml 文件:找到你的项目根目录下的 pom.xml 文件。 配置 finalName 属性:在 标签下,添加 属性来指定打包后…...

Java Web开发进阶——Spring Boot与Thymeleaf模板引擎
Thymeleaf 是一个现代化的、功能强大的 Java 模板引擎,常用于生成 Web 应用程序的视图。它与 Spring Boot 的集成十分方便,并且提供了丰富的功能,能够帮助开发者实现动态渲染数据、处理表单、页面控制等操作。下面,我们将详细探讨…...

论文笔记(四十七)Diffusion policy: Visuomotor policy learning via action diffusion(下)
Diffusion policy: Visuomotor policy learning via action diffusion(下) 文章概括5. 评估5.1 模拟环境和数据集5.2 评估方法论5.3 关键发现5.4 消融研究 6 真实世界评估6.1 真实世界Push-T任务6.2 杯子翻转任务6.3 酱汁倒入和涂抹任务 7. 实际双臂任务…...

开始使用Panuon开源界面库环境配置并手写VS2019高仿界面
1. Panuon环境配置 1.1. 通过Nuget 安装 Panuon.WPF.UI1.2. xaml引用命名空间1.3. using Panuon.WPF.UI; 2. VS2019 view 2.1. 设置窗体尺寸和title2.2. 添加静态资源 2.2.1. 什么是静态资源 2.3. 主Grid 2.3.1. 盒子模型2.3.2. 嵌套布局 3. 总结 1. Panuon环境配置 1.1. 通…...

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索
摘要:随着互联网技术的不断进步和电商行业的快速发展,传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生,通过精准定位、用户细分以及深度社交传播策略,实现了用户群体的快速裂变与高效营…...

WPS计算机二级•表格函数计算
听说这里是目录哦 函数基础知识 相对绝对混合引用🌪️相对引用绝对引用混合引用 常用求和函数 SUM函数🌦️语法说明 函数快速求 平均数最值⚡平均数最值 实用统计函数 实现高效统计🌀COUNTCOUNTIF 实用文本函数 高效整理数据🌈RIG…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...