【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》

news2024/10/20 3:07:57

**《ZooKeeper 深度探秘:分布式协调的强大利器》 **

摘要:本文将深入详解 ZooKeeper,涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值,为构建高可靠、高性能的分布式系统提供有力支持。

关键词:ZooKeeper、分布式锁、负载均衡、ZAB 协议、角色构成

一、ZooKeeper 简介

  1. ZooKeeper 是什么
    ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会提供。它为分布式应用提供一致性服务,广泛的功能包括配置管理、分布式锁、集群管理等。

  2. 设计目标
    ZooKeeper 的设计目标是提供高可用的、高性能的、可靠的存储服务,以支持分布式应用的一致性协调。

二、ZooKeeper 的工作原理和算法

  1. 数据模型
    ZooKeeper 使用一个层次化的命名空间,类似于文件系统,每个节点称为 znode。znode 可以存储数据,并且可以有子节点。
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

public class ZooKeeperExample {
    private static final String CONNECTION_STRING = "localhost:2181";
    private static final int SESSION_TIMEOUT = 5000;

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        CountDownLatch latch = new CountDownLatch(1);
        ZooKeeper zk = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getState() == Event.KeeperState.SyncConnected) {
                    latch.countDown();
                }
            }
        });
        latch.await();
        // 可以在这里进行对 znode 的操作
        zk.close();
    }
}
  1. 节点类型
    ZooKeeper 有四种类型的 znode:
节点类型描述
PERSISTENT持久节点,客户端断开连接后仍然存在。
EPHEMERAL临时节点,客户端会话结束时被删除。
PERSISTENT_SEQUENTIAL持久顺序节点,创建时自动生成序列号。
EPHEMERAL_SEQUENTIAL临时顺序节点,客户端会话结束时被删除,并包含序列号。
  1. Watcher 机制
    ZooKeeper 允许客户端在 znode 上注册 Watcher,当 znode 发生变化时,如数据变更或子节点变化,ZooKeeper 会通知所有注册了 Watcher 的客户端。

  2. ACL 权限控制
    ZooKeeper 提供了访问控制,类似于 UNIX 文件系统的权限控制。

  3. Leader 选举
    ZooKeeper 集群中的节点分为领导者(Leader)和跟随者(Follower)。Leader 负责处理客户端请求,Follower 则接收客户端请求并转发给 Leader。Leader 选举是 ZooKeeper 运行的基础。

  4. ZAB 协议
    ZooKeeper 使用 ZAB(ZooKeeper Atomic Broadcast)协议来保证数据的一致性。ZAB 有两种模式:恢复模式和广播模式。

    • 恢复模式:这个阶段发生在服务启动或当前领导者崩溃后。目的是选举出一个新的领导者,并确保所有服务器与新的领导者的数据状态同步。在恢复模式下,集群不能处理客户端的事务请求,直到选出新的领导者并且集群状态同步完成。
    • 广播模式:这个阶段在领导者被选举出来,并且大多数服务器与领导者完成状态同步后开始。领导者开始接收并广播来自客户端的事务请求到所有服务器。所有非领导者服务器接收并处理这些事务,然后将结果返回给领导者。领导者确保所有事务按照顺序被处理,并保持集群中的数据一致性。
  5. 事务 ID(ZXID)
    ZooKeeper 使用递增的事务 ID 来标识操作,确保操作的顺序性和一致性。

三、ZooKeeper 的应用场景

  1. 配置管理
    作为配置中心,统一管理集群中所有节点的配置信息,支持动态更新和实时通知。

  2. 服务注册与发现
    作为服务注册中心,服务提供者注册服务地址,服务消费者查询并调用服务。

  3. 负载均衡
    通过 ZooKeeper 的临时顺序节点实现客户端的负载均衡。

    • 服务注册:每个服务提供者在启动时,会在 ZooKeeper 上的指定节点下创建一个临时顺序节点。
    • 节点特性:临时节点如果服务提供者实例崩溃或与 ZooKeeper 失去连接,ZooKeeper 会自动删除该节点;顺序节点每个节点会被分配一个唯一的序列号,保证节点创建的全局顺序性。
    • 服务列表获取:客户端通过查询指定节点来获取所有子节点,这些子节点代表了当前可用的服务提供者。
    • 负载均衡策略:常见的策略包括轮询、随机、最少连接等。
    • 服务选择:客户端根据选择的策略,通过子节点的序列号来确定具体连接到哪个服务提供者。
    • 服务调用:客户端与选定的服务提供者建立连接并调用服务。
    • 动态更新:当有新的服务提供者加入或现有服务提供者下线时,ZooKeeper 的 Watcher 机制可以通知客户端服务列表的变化。
    • 容错处理:如果客户端正在使用的服务提供者突然下线,由于 ZooKeeper 会删除对应的临时节点,客户端可以通过 Watcher 获得通知,并重新选择其他服务提供者。
  4. 集群管理
    监控集群中机器的状态,实现机器上下线感知。

  5. Master 选举
    在多个服务实例中选举出一个 Master 节点来处理特定任务。

  6. 分布式锁
    利用 ZooKeeper 的临时节点和顺序节点实现分布式锁,保证资源的互斥访问。

    • 创建临时顺序节点:当一个客户端需要获取分布式锁时,它会向 ZooKeeper 的指定路径创建一个临时顺序节点。ZooKeeper 会为这个节点分配一个全局唯一的序列号。
    • 获取子节点列表:客户端获取该路径下所有子节点的列表,并检查自己创建的节点是否是所有临时顺序节点中序号最小的一个。
    • 判断是否获取锁:如果是,客户端成功获取锁,可以执行相应的业务逻辑;如果不是,客户端需要找到比自己序号小 1 的节点,并在该节点上注册一个 Watcher,用于监听节点的变化。
    • 等待锁释放:如果客户端没有获取到锁,它会等待 Watcher 触发。当前面的节点被删除时,Watcher 会被触发,客户端会收到通知。
    • 重试获取锁:一旦 Watcher 被触发,客户端需要重新执行步骤 2 和步骤 3,以判断自己是否能够获取锁。
    • 执行业务逻辑:当客户端成功获取锁后,它就可以执行需要互斥访问的业务逻辑。
    • 释放锁:业务逻辑执行完成后,客户端需要主动删除自己创建的临时顺序节点,以释放锁。
  7. 分布式队列
    使用 ZooKeeper 的顺序节点来实现按顺序处理的队列。

四、ZooKeeper 的角色构成

  1. 领导者(Leader)
    • 负责进行投票的发起和决议,更新系统状态。
    • 处理所有事务请求,并将事务日志分发给跟随者(Follower)。
    • 负责集群中数据的更新和同步。
  2. 跟随者(Follower)
    • 接受客户端请求,如果是读请求则可以自己处理,如果是写请求则要转发给领导者。在选主过程中参与投票。
    • 接收来自领导者的事务日志并更新到自己的状态中。
  3. 观察者(Observer)
    • 可以接受客户端连接,处理读请求,并将写请求转发给领导者,但观察者不参与投票过程。
    • 只同步领导者的状态,不参与选举过程。
    • 目的是扩展系统,提高读取速度,不增加选举时的延迟。
  4. 客户端(Client)
    • 请求发起方,可以连接到集群中的任何角色(领导者或跟随者),发送读写请求。

五、Observer 观察者的作用

  1. 不参与投票
    Observer 不参与 ZooKeeper 的写操作的投票过程。在 ZooKeeper 中,写操作需要通过一个称为“ZAB”(ZooKeeper Atomic Broadcast)协议的一致性协议来确保所有服务器的数据一致性。Observer 不参与这个协议的投票过程,因此不会影响写操作的决策。

  2. 只读服务
    Observer 主要用于提供只读服务。它们可以接收客户端的读取请求,并返回数据。由于 Observer 不参与写操作,它们可以减轻主服务器(Leader)和从服务器(Follower)的负载,提高读取操作的性能。

  3. 扩展读能力
    在分布式系统中,读取操作通常比写入操作要频繁得多。通过添加 Observer 节点,ZooKeeper 可以扩展其读取能力,从而提高系统的整体吞吐量。

  4. 不影响写性能
    由于 Observer 不参与写操作的投票,它们不会影响 ZooKeeper 写操作的性能。这意味着即使 Observer 节点很多,也不会降低 ZooKeeper 处理写请求的能力。

  5. 适用于读多写少的场景
    Observer 特别适用于那些读取操作远多于写入操作的场景。例如,在配置管理系统中,配置信息可能很少改变,但是会被大量服务频繁读取。

  6. 提高可用性
    Observer 节点可以分布在不同的服务器或数据中心,这有助于提高 ZooKeeper 服务的可用性和容错能力。

  7. 简化部署
    在某些情况下,Observer 可以简化 ZooKeeper 集群的部署和管理,因为它们不需要参与写操作的一致性协议,因此在配置和同步方面可能更加简单。

内容详情
ZooKeeper 简介开源分布式协调服务,提供一致性服务,设计目标是高可用、高性能、可靠存储服务
工作原理和算法数据模型为层次化命名空间,有四种节点类型,Watcher 机制、ACL 权限控制、Leader 选举、ZAB 协议、事务 ID
应用场景配置管理、服务注册与发现、负载均衡、集群管理、Master 选举、分布式锁、分布式队列
角色构成领导者、跟随者、观察者、客户端,各有不同职责
Observer 作用不参与投票、提供只读服务、扩展读能力、不影响写性能、适用于读多写少场景、提高可用性、简化部署

嘿,亲爱的读者们!相信你们在阅读完这篇文章后,对 ZooKeeper 有了更深入的了解。如果你们有任何独特的见解、经验或者问题,欢迎在评论区分享哦!让我们一起交流学习,共同进步,把 ZooKeeper 运用得更加得心应手!😎

以下是文章内容的横向 Mermaid 思维导图:

ZooKeeper 深度探秘
ZooKeeper 简介
ZooKeeper 工作原理和算法
ZooKeeper 应用场景
ZooKeeper 角色构成
Observer 作用
ZooKeeper 是什么
设计目标
数据模型
节点类型
Watcher 机制
ACL 权限控制
Leader 选举
ZAB 协议
事务 ID
配置管理
服务注册与发现
负载均衡
集群管理
Master 选举
分布式锁
分布式队列
领导者
跟随者
观察者
客户端
不参与投票
只读服务
扩展读能力
不影响写性能
适用于读多写少场景
提高可用性
简化部署

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

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

相关文章

模电基础(放大电路的频率响应+multisim)

目录 1.频率响应的基本概念 1.1频率响应的基本概念 1.1.1高通滤波器 1.1.2低通滤波器 1.1.3波特图 1.1.4multisim仿真 1.2晶体管高效等效模型 1.2.1晶体管的混合π模型 1.2.2晶体管电流放大倍数的频率响应 ​1.3单管放大电路的频率响应 1.3.1单管共射放大电路的频率响…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中,了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络(如互联网)的关键节点,它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

vue综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南(二) 目录 21、介绍虚拟DOM 22、vue生命周期的理解 23、vue父组件向子组件传递数据…

sql高级

数据库的范式 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。 范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。实际上&#xff0c;数据库范式…

基于SSM+微信小程序的打印室预约管理系统(打印2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的打印室预约管理系统实现了管理员和用户两个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;附近打印店管理&#xff0c;文件打印管理&#xff0c;当…

iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

Yocto - 使用Yocto开发嵌入式Linux系统_10 使用Yocto项目进行开发

Developing with the Yocto Project 在本书中&#xff0c;我们一直将 Poky 用作构建工具。换句话说&#xff0c;我们将其用作设计和生成镜像的工具&#xff0c;将镜像交付到产品。 So far in this book, we have used Poky as a build tool. In other words, we have used it a…

Nature 正刊丨核糖体如何塑造蛋白质折叠

01摘要 涉及人工智能的方法彻底改变了从氨基酸序列预测蛋白质结构的能力。然而&#xff0c;这些结构通过在细胞内折叠形成的过程仍然大多难以捉摸——尽管正确折叠对蛋白质功能的重要性&#xff0c;以及折叠失败与许多毁灭性疾病之间的联系。大多数蛋白质只有在核糖体&#xf…

鸿蒙网络编程系列23-实现一个基于鸿蒙API的HTTP服务器

1. 鸿蒙HTTP服务器可行性分析 看到这个题目&#xff0c;可能有的小伙伴会有一些疑问&#xff1a; “鸿蒙API从9到12我都翻烂了&#xff0c;也没见提供HTTP服务器的接口啊” “我BUG写得少&#xff0c;你可不要骗我” 的确&#xff0c;目前的鸿蒙API没有提供HTTP服务端的实现…

【每日一题】【算法双周赛】【第 20 场 小白入门赛评价/分享】赛后另类AI写题分析分享

第 20 场 小白入门赛 1. 四个亲戚【算法赛】2. 黛玉泡茶【算法赛】AI分析具体实现代码解析复杂度分析示例运行 结果二 3. 宝玉请安【算法赛】AI分析问题分析路径计算代码实现代码解析示例运行复杂度分析 结果&#xff1a; 交上去 4. 贾母祝寿【算法赛】AI分析问题分析实现步骤代…

【日志】关于多益网申

2024.10.19 早先听闻多益的测试题非常抽象&#xff0c;凡是测过的人都说太抽象了&#xff0c;我还以为他考我各种算法或者编程语言呢。我今天也去做了一下&#xff0c;测试题里面大多都考些计算题&#xff0c;找规律题&#xff0c;判断推理题&#xff0c;还有一些图形转换&…

计算机毕业设计 基于java旅游攻略平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【命令操作】Linux中多种关机和重启的命令介绍 _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【系统配置】信创系统配置文件保护与防篡改 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux系统中多种关机和重启命令介绍的文章。Linux作为一个广泛应用的开源操作系统&#xff0c;提供了多种关机和重启的方式…

jupyter notebook 笔记

nbclassic 经典版 新版的 jupyter notebook 太丑了。 最难受的是字体太小了。 我还是喜欢老版本的 jupyter notebook. 安装经典版: pip install nbclassic 启动经典版: jupyter server 或是 jupyter nbclassic 参考来源: https://github.com/jupyter/nbclassic jupyter note…

计算机网络——传输层服务

传输层会给段加上目标ip和目标端口号 应用层去识别报文的开始和结束

C++ —— 关于多态

目录 1. 多态的概念 2.多态的定义及实现 3. 虚函数 3.1 虚函数的重写/覆盖 3.2 关于多态的面试难题 3.3 虚函数重写的⼀些问题 3.4 override 和 final关键字 3.5 重载/重写/隐藏的对比 3.6 纯虚函数和抽象类 4.多态的原理 4.1虚函数表指针 4.2 多态是如何实现的 4…

go压缩的使用

基础&#xff1a;使用go创建一个zip func base(path string) {// 创建 zip 文件zipFile, err : os.Create("test.zip")if err ! nil {panic(err)}defer zipFile.Close()// 创建一个新的 *Writer 对象zipWriter : zip.NewWriter(zipFile)defer zipWriter.Close()// 创…

如何使用DockerSpy检测你的Docker镜像是否安全

关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具&#xff0c;该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题&#xff0c;并识别潜在的泄漏内容&#xff0c;例如身份验证密钥等敏感信息。 功能介绍 1、安全审计&#xff1a…

linux一二三章那些是重点呢

第一章 静态库动态库的区别 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接 拿来用的变量、函数或类。 如何制作 静态动态库 静态库&#xff1a; GCC 进行链接时&#xff0c;会把静态库中代码打…