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

devtools/2024/10/19 22:51:30/

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

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

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

一、ZooKeeper 简介

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

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

二、ZooKeeper 的工作原理和算法

  1. 数据模型
    ZooKeeper 使用一个层次化的命名空间,类似于文件系统,每个节点称为 znode。znode 可以存储数据,并且可以有子节点。
java">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() {@Overridepublic 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.ppmy.cn/devtools/127119.html

相关文章

Spring6梳理14——依赖注入之P命名空间

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①搭建模块 ②引入配置文件 ③创建bean-dip.xml文件 ④创建课程类文件 ⑤创建学生…

基于SSM+微信小程序的实验室设备故障报修管理系统2

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的实验室设备故障报修管理系统2实现了管理员,用户,维修员三个角色。 管理员功能有 个人中心,用户管理,维修员管理&#…

单点登录(Single Sign-On, SSO)

单点登录(Single Sign-On, SSO)是一种身份验证机制,允许用户使用一组凭据(如用户名和密码)登录一次,即可访问多个相关但独立的软件系统。SSO 的主要目的是简化用户的登录过程,提高用户体验&…

【C++刷题】力扣-#108-将有序数组转换为二叉搜索树

题目描述 给定一个升序排列的整数数组 nums,将其转换为一棵高度平衡的二叉搜索树(BST)。高度平衡的二叉搜索树定义为:一个二叉搜索树,其中左右两个子树的高度差不超过 1。 示例 示例 1 输入: nums [-10,-3,0,5,9] 输…

uboot基础 -- 启动Linux kernel镜像之 booti 命令的用法

U-Boot booti 命令的作用与用法 booti 命令是 U-Boot 中用于引导 Linux 内核的命令,主要用于启动 ARM64 (AArch64) 平台上的内核映像。在现代嵌入式系统中,booti 通常用于启动设备上的 Linux 内核。 1. 基本概念 booti 命令用于引导内核时加载一个二进…

嵌入式学习-IO进程-Day05

嵌入式学习-IO进程-Day05 线程函数接口 线程回收函数 获取线程号 线程同步 概念 线程同步机制 信号量 无名信号量 函数接口 互斥 互斥的概念 互斥锁 函数接口 死锁(面试可能会问) 条件变量 使用步骤 函数接口 进程间通信 Linux/Unix平台的通信方式发展 进…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

JAVA队列

目录 1. 队列(Queue) 2.1 概念 2.2 队列的使用 ​编辑 ​编辑 后入后出 和栈类似 队列同样有 size() 和 empty()方法 2.3 队列模拟实现 3. 出队列 1. 队列(Queue) 1.1 概念 队列:只允许在一端进行插入数据…