ZooKeeper 到底解决了什么问题?

简介: 目标ZooKeeper 很流行,有个基本的疑问:ZooKeeper 是用来做什么的?之前没有ZK,为什么会诞生 ZK?

目标

ZooKeeper 很流行,有个基本的疑问:


ZooKeeper 是用来做什么的?

之前没有ZK,为什么会诞生 ZK?

OK,解答一下上面的疑问:(下面是凭直觉说的)


ZooKeeper 是用于简化分布式应用开发的,对开发者屏蔽一些分布式应用开发过程中的底层细节

ZooKeeper 对外暴露简单的 API,用于支持分布式应用开发

ZooKeeper 在提供上述功能的同时,其还是一个 高性能、高可用、高可靠的分布式集群

上面说这么多,总结一下,ZK 能解决分布式应用开发的问题,ZK 能很好的解决问题。 到这一步,疑问就更多了:


分布式应用开发,有哪些常见问题?ZK 是如何屏蔽这些底层细节的?

ZooKeeper 对外暴露了那些 API?这些 API 如何支持分布式应用开发的?这些 API 还能简化吗?API 的语义性怎么样?

ZooKeeper 自身是一个高性能、高可用、高可靠的分布式集群,那有个简单的问题:

高性能是指什么?ZooKeeper 为了达到高性能,做了哪些工作?

高可用同上

高可靠同上

Note:本篇 wiki 就是为了解决上述第一个疑问的。(其他疑问会在其他 blog 中逐步解答)


为什么有 ZooKeeper

一个应用程序,涉及多个进程协作时,业务逻辑代码中混杂有大量复杂的进程协作逻辑。


image.png


上述多进程协作逻辑,有 2 个特点:


处理复杂

处理逻辑可重用

因此,考虑将多进程协作的共性问题拎出,作为基础设施,让 RD 更加专注业务逻辑开发,即:


image.png


ZooKeeper 就是上述多进程协作基础服务的一种。


ZooKeeper 的特点

ZooKeeper 有几个简单特点:


ZooKeeper 的 API:从 文件系统 API 得到的启发,提供简单的 API

ZooKeeper 运行在专用服务器上,跟业务逻辑分离,保证了高容错性和可扩展性

ZooKeeper 是存储设施,但特别注意


ZK上存储的数据聚焦为:协作数据(元数据),而不是应用数据,应用数据有自己的存储方案,例如 HDFS 等

ZK 本质上,可以看作一种特殊的 FS

特别说明:


应用数据和元数据,由于使用场景不同,对一致性和持久性的要求有差异, 因此,架构设计、数据治理过程中,应将 2 类数据独立看待、独立存储。


ZooKeeper 的使命

ZK 要解决的核心问题:


ZK 目标:简化分布式应用开发中,多进程协作问题。为分布式应用,提供高效、可靠的分布式协调服务(基础服务),例如:


统一的命名服务

分布式锁

进程崩溃检测

Leader 选举

配置管理:配置变更时,及时下发到各个 Client。

一个简单的问题:多进程的协作是什么?尼玛呀,有完没完,啥问题你都有,面对这个掉咋天的脑壳,还是回答一下。


多进程协作,整体分为 2 类:


协作:多进程需要一同处理某些事情,一些进程采取行动是的其他进程能够正常工作,例如:主从结构,M 向 S 分配任务,S 才会执行,否则 S 就保持空闲状态

竞争:两个进程不能同时工作,一个进程必须等待另个进程执行完毕,例如:主从结构,M 节点失效后,很多 S 都想成为 M,这时,就需要互斥锁,只有第一个获得锁的 S 成为 M

特别说明:


不跨网络协作:多进程,可以在同一台物理主机上,同步原语很方便(比如?管道、共享内存、消息队列、信号量)

跨网络协作:多进程,分布在不同的物理主机上,ZK 关注这一类

跨网络多进程协作,进程通信,基本思路有 2 个:


消息机制:通过网络,直接信息交换,多消息传递算法,实现同步原语

共享存储:利用外部共享存储,实现多进程协作,要求共享存储提供有序访问,ZK 采用这种方式

真实系统中,跨网络通信,有几个共性问题:


消息延迟:由于网络原因,后发送先到达

处理器性能:由于系统调度原因,消息到达后,延迟处理

时钟偏移:不同物理主机,时钟发生偏移

ZK 精心设计用于屏蔽上述 3 个共性问题,使得这些问题在应用服务层面完全透明化。


ZooKeeper 特性

ZooKeeper 解决的本质问题

分布式系统的一致性问题:


消息传递:延迟性,先发送的消息,不一定先到达;

消息传递:丢失性,发送的消息,可能丢失;

节点崩溃:分布式系统内,任何一个节点都可能崩溃;

在这种情况下,如何保证数据的一致性?


提案投票:基于投票策略,2PC

选举投票:基于投票策略,投出优先级最高的节点(包含最新数据的节点)

Paxos 目标:解决分布式一致性问题,提高分布式系统容错性的一致性算法。


Paxos 本质:基于消息传递的高度容错的一致性算法


ZooKeeper 定位

ZooKeeper 是:


分布式协调服务

高效、可靠

方便应用程序,聚焦业务逻辑开发,而不需要过多关注分布式进程间协作细节

ZooKeeper 不直接暴露原语,而是,暴露一部分调用方法组成的 API,类似文件系统的 API,支持应用程序实现自己的原语。


ZooKeeper 特性

ZooKeeper 可以保证如下分布式一致性特性:


顺序一致性:同一个 Client 发起的事务请求,严格按照发起顺序执行

原子性:事务请求,要么应用到所有节点,要么一个节点都没有应用

单一视图:Client 无论连接到哪个节点,看到的服务端数据都是一致的(Note:不准确,其实是最终一致性)

可靠性:事务一旦执行成功,状态永久保留

实时性:事务一旦执行成功,Client 并不能立即看到最新数据,但 ZooKeeper 保证最终一致性

ZooKeeper 设计目标

ZooKeeper 致力于提供高性能、高可用、顺序一致性的分布式协调服务,保证数据最终一致性。


目标一:高性能(简单的数据模型)

采用树形结构组织数据节点;

全量数据节点,都存储在内存中;

Follower 和 Observer 直接处理非事务请求;

目标二:高可用(构建集群)

半数以上机器存活,服务就能正常运行

自动进行 Leader 选举

目标三:顺序一致性(事务操作的顺序)

每个事务请求,都会转发给 Leader 处理

每个事务,会分配全局唯一的递增id(zxid,64位:epoch + 自增 id)

目标四:最终一致性

通过提议投票方式,保证事务提交的可靠性

提议投票方式,只能保证 Client 收到事务提交成功后,半数以上节点能够看到最新数据

ZooKeeper 出现之前

ZK 出现之前,分布式系统常用两种方式,实现多进程协作:


分布式锁管理器

分布式数据库

ZK 更专注于进程协作,而不提供任何锁接口和通用的存储数据接口。(疑问:ZK 也可以提供啊,我们不使用就行了)


应用服务器,常见的 2 种需求:


Master-Slave Leader 选举:要求提供Master节点选举功能

进程响应跟踪 崩溃检测:要求提供进程存活状态的跟踪

分布式锁:互斥排它锁

ZK 为上述 2 种策略提供了基础 API。


ZooKeeper 不适用的场景:


海量数据存储:ZK 本质是特殊的 FS,但 ZK 用于存储元数据,需要单独存储应用数据

术语介绍

image.png

相关文章
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
3712 1
|
SQL 监控 NoSQL
架构师第一课,一文带你玩转 ruoyi 架构
我理解的架构/框架应该有以下功能: 1.满足日常开发功能,如单点登陆、消息队列、监控等; 2.规范开发者的开发,指定代码格式、注释等; 3.提高开发效率,提供一系列的封装方法,并减少bug的产生率。 下文将详细介绍ruoyi框架。
8928 1
架构师第一课,一文带你玩转 ruoyi 架构
|
关系型数据库 MySQL 数据库
MySQL 集群部署实战指南:高可用与可扩展的数据库架构
本文深入讲解MySQL集群部署方案,涵盖主从复制、MHA高可用架构及InnoDB Cluster,结合实战配置与监控维护,助力构建高性能、高可用的数据库系统。
1051 0
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
10月前
|
Java 数据库 开发者
Spring Boot 框架超级详细总结及长尾关键词应用解析
本文深入讲解Spring Boot框架的核心概念、功能特性及实际应用,涵盖自动配置、独立运行、starter依赖等优势。通过Web开发、微服务架构、批处理等适用场景分析,结合在线书店实战案例,演示项目初始化、数据库设计、分层架构实现全流程。同时探讨热部署、多环境配置、缓存机制与事务管理等高级特性,助你高效掌握Spring Boot开发技巧。代码示例详尽,适合从入门到进阶的学习者。
3736 0
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
554 20
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
1105 1
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的葡萄簇目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
基于YOLOv8深度学习的葡萄簇目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
|
设计模式 缓存 Devops
微服务架构最强讲解,那叫一个通俗易懂!
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的
33927 3
微服务架构最强讲解,那叫一个通俗易懂!
|
存储 负载均衡 监控
redis 集群模式(redis cluster)介绍
redis 集群模式(redis cluster)介绍

热门文章

最新文章