【Spring Cloud系统】- Zookeer特性与使用场景

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 笔记

一、概述


Zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。


简单来说zookeeper = 文件系统 + 监听通知机制


二、Zookeeper是什么


1.ZooKeeper是分布式协调服务的开源架构,可以用来解决分布式集群中应用系统的一致性问题(例如怎样避免同时操作同一数据造成脏读的问题);也是为分布式程序提供协调服务的Apache项目。

2.ZooKeeper本质上是一个分布式的小文件存储系统,提供基于类似于文件系统目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控你存储的数据的状态变化,通过监控数据状态的变化,从而可以达到基于数据的集群管理,诸如:统一命名服务、分布式配置管理、负载均衡、分布式锁、分布式协调等功能。


三、Zookeeper有哪些数据结构


ZooKeeper可以理解一个文件系统,ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。

3.1 数据结构图

7.png

如上图的每个节点称为一个Znode。每个Znode由3部分组成。


  • stat: 此为状态信息,描述该Znode的版本,权限等信息。
  • data: 与该Znode关联的数据
  • children: 该Znode下的子节点

3.2 节点类型

Znode有两种,分别为临时节点和永久节点。


节点的类型在创建时既被确定,并且不能改变。


临时节点:该节点的生命周期依赖于创建它们的会话,一旦会话结束,临时节点将被自动删除,当然可以也可以手动删除。临时节点不允许拥有子节点。


永久节点该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。


Znode还有一个序列化的特性,如果创建的时候指定的话,该Znode的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便于记录每个子节点创建的先后顺序。它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如:“000000001”)。


因为有序列化属性,这样Zookeeper便有四种类型的Znode节点,分别对应:

  • PERSISTENT:永久节点
  • EPHEMERAL:临时节点
  • PERSISTENT_SEQUENTIAL:永久节点、序列化
  • EPHEMERAL_SEQUENTIAL:临时节点、序列化

3.3 节点类型

每个znode都包含了一系列的属性,通过命令get,可以获得节点的属性。


▪dataVersion:数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题。


▪cversion :子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。


▪cZxid :Znode创建的事务id。


▪mZxid :Znode被修改的事务id,即每次对znode的修改都会更新mZxid。


对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode。


▪ctime:节点创建时的时间戳。


▪mtime:节点最新一次更新发生时的时间戳


▪:如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0。


四、Zookeeper有哪些核心功能


4.1 保证数据一致性

保证数据的一致性有两种情况:

▪重新选取出leader后的数据同步。

▪leader处理完事务请求后与follow保持数据一致。


首先是重新选取出新leader后的数据同步

通过FastLeaderElection选举算法选出leader,选出leader之后,leader需要与其他节点进行同步,当超过一半的follow与leader进行同步完成后,leader才能成为真正的leader,然后follow会带上自己最大的ZXID尝试与leader连接,来确定数据是否同步。


其次是leader处理完成事务请求后与follow保持数据一致

事务请求全部是由leader处理的,当leader收到请求后,会将事务请求转化为事务Proposal,由于leader会为每一个follow创建一个队列,所以leader会将事务放入响应队列中,按顺序处理事务请求,来保证事务的顺序性。之后会在队列中顺序向其他节点广播该提案。follow收到后会将其以事务的形式写入到本地日志中,并向leader发送反馈ack,leader会等待其他follow的回复,当收到一半以上的follow响应时,leader会向其他节点发送commit消息,同时leader提交该提案。当follow将数据同步完成之后,leader会将该follow加入到真正可用的follow列表中。


4.2 更新和监听

ZooKeeper支持watch的概念。客户端可以在znode上设置监视,当znode有事件发生时,通知给感兴趣的客户端。通知变化时收到通知。非常适用于保障分布式情况下的数据一致性。dubbo中使用zk作为注册中心等都用到了zk的更新监听功能。


五、Zookeeper有哪些权限控制


ZooKeeper通过ACL权限控制列表来控制其对znode节点的访问权限。ACL权限与Unix文件系统中的权限控制类似,使用权限位限制指定角色对znode节点的各节点操作,下面详细介绍ZooKeeper中ACL权限控制。


5.1 权限列表

zookeeper中对znode节点的操作权限主要有以下五种,我们可以通过其简写的任意组合来实现对znode节点的不同权限控制。

8.png

5.2 ACL权限特点

Zookeeper权限控制有以下几个特点:


1.zookeeper的权限是基于znode节点的,需要对每个节点设置权限。

2.znode节点支持同时设置多种权限方案和多个权限。当znode有多种权限的时候,只要有一个权限允许当前操作,即可执行当前操作,即多个权限之间为或的关系。

3.子节点不会继承父节点的权限,客户端没有权限访问当前节点,但是可以访问当前节点的子节点。

4.使用setAcl命令对节点进行权限设置会覆盖掉原来的权限。


六、Zookeeper数据持久化


ZooKeeper数据的组织形式为一个类似文件系统的数据结构,而这些数据都是存储在内存中的,所以我们可以认为,ZooKeeper是一个基于内存的小型数据库。


如果数据只存储在内存中的话,那么在ZooKeeper宕机或者断电的情况下,数据将会丢失,所以ZooKeeper也制定了一些数据持久方式:


▪事务日志log

▪数据快照snapshot

6.1 事务日志log文件

针对每一次客户端的事务操作(写),ZooKeeper都会将他们记录到事务日志中,当然,ZooKeeper也会将数据变更应用到内存数据库中,我们可以在ZooKeeper的主配置文件zoo.cfg中配置内存中的数据持久化目录,也就是事务日志存储路径dataLogDir。如果没有配置dataLogDir(非必填),事务日志将存储到dataDir(必须填)。


6.2 事务日志log文件

数据快照是ZooKeeper数据存储中另–个非常核心的运行机制。顾名思义,数据快照用来记录ZooKeeper服务器上某一个时刻的全量内存数据内容,并将其写入到指定的磁盘文件中。


文件存储:


快照文件存储在dataDir属性配置的目录下。


和事务日志文件的命名规则一致,快照数据文件也是使用ZXID的十六进制表示来作为文件名后缀,该后缀标识了本次数据快照开始时刻的服务器最新ZXID。这个十六进制的文件后缀非常重要,在数据恢复阶段,ZooKeeper会根据该ZXID来确定数据恢复的起始点。


和事务日志文件不同的是ZooKeeper的快照数据文件没有采用“预分配”机制,因此不会像事务日志文件那样内容中可能包含大量的“0”。每个快照数据文件中的所有内容都是有效的,因此该文件的大小在一定程度上能够反映当前ZooKeeper内存中全量数据的大小。


七、总结


Zookeeper作为一个分布式协调服务,由于其通用性,所以在众多软件开发中被使用。它一般包括存储数据和监听功能,主要提供节点选举、统一配置文件管理、发布和订阅消息、集群管理等功能。在以后的博文中讲详细讲解每个部分详细使用。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
3月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
112 0
|
7天前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
22 2
|
11天前
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!
112 2
|
消息中间件 存储 Java
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
本文详细介绍了如何使用Spring Boot 3结合RabbitMQ构建高效可靠的聊天消息存储系统。通过引入消息队列,实现了聊天功能与消息存储的解耦,解决了高并发场景下直接写入数据库带来的性能瓶颈问题。文章首先分析了不同MQ产品的特点及适用场景,最终选择RabbitMQ作为解决方案,因其成熟稳定、灵活路由和易于集成等优势。接着,通过Docker快速部署RabbitMQ,并完成Spring Boot项目的配置与代码实现,包括生产者发送消息、消费者接收并处理消息等功能。最后,通过异步存储机制,既保证了消息的即时性,又实现了可靠持久化。
137 0
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
|
5月前
|
负载均衡 Java API
Spring Cloud是什么及基本特性都有哪些?
Spring Cloud 是用于构建健壮云应用的框架,包含多个子项目。其核心组件如Eureka(服务注册与发现)、Hystrix(熔断器)、Ribbon(负载均衡)等,帮助开发者快速实现微服务架构。Spring Cloud 提供了服务注册与发现、分布式配置、路由、断路器等功能,简化了微服务开发与管理。本文将重点介绍服务注册与发现及分布式配置两大特性。
194 5
|
3月前
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
704 57
|
29天前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
115 0
|
4月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
3925 7
|
4月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
260 0
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
|
9月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
123 0