高级大数据工程师带你一起学习ZooKeeper保姆级教程一(基础概念篇)
笔者前言
笔者我看了一下当下论坛的关于ZooKeeper教程阅读量前几名的文章,个人觉得讲有点官腔,我没有真正接触过很难真正的理解!
笔者用最肤浅的语言与自己的理解讲述ZooKeeper的原理与案例,顺便也是自己梳理一下学习思路!
1、基本概念认识与学习
1.1 什么是分布式项目?
分布式项目是一种将复杂的任务分解并部署在多个独立的计算节点上进行协同工作的项目类型。
在分布式项目中:
一、架构特点
- 节点独立性:各个计算节点可以是独立的物理服务器,也可以是虚拟服务器。每个节点都有自己的处理器、内存、存储和操作系统,能够独立地执行特定的任务。例如,在一个分布式电商平台中,不同的服务器节点可以分别负责用户管理、商品展示、订单处理等不同的业务功能。
- 通信机制:节点之间通过网络进行通信,通常使用特定的通信协议来交换数据和协调任务。常见的通信协议有 HTTP、RPC(Remote Procedure Call,远程过程调用)等。比如,在分布式数据库系统中,不同的数据节点之间通过网络通信来同步数据和执行分布式事务。
二、优势
- 高可扩展性:随着业务需求的增长,可以方便地添加更多的计算节点来扩展系统的处理能力。例如,当电商平台的用户量和交易量增加时,可以添加新的服务器节点来应对不断增长的负载。
- 高可靠性:由于任务分布在多个节点上,即使某个节点出现故障,其他节点仍然可以继续工作,从而提高了系统的整体可靠性。例如,在分布式文件系统中,如果某个存储节点出现故障,系统可以自动将数据恢复到其他健康的节点上,保证数据的可用性。
- 性能提升:通过并行处理任务,可以大大提高系统的性能和响应速度。例如,在分布式计算框架中,可以将大规模的计算任务分解成多个小任务,分配到不同的计算节点上同时执行,从而显著缩短计算时间。
三、面临的挑战
- 数据一致性:在分布式环境下,保证多个节点之间的数据一致性是一个挑战。由于数据可能同时在不同的节点上进行更新,需要采用合适的一致性算法和机制来确保数据的完整性和一致性。例如,在分布式数据库中,可能需要使用两阶段提交、Paxos 算法等技术来保证分布式事务的一致性。**- 分布式协调:多个节点之间需要进行协调和同步,以确保任务的正确执行。这就需要使用分布式协调工具,如 ZooKeeper来管理节点的状态、进行主节点选举、实现分布式锁等功能。**
- 网络延迟和故障:分布式系统中的节点之间通过网络进行通信,网络延迟和故障可能会影响系统的性能和可靠性。需要设计合理的容错机制和网络拓扑结构,以应对网络问题带来的挑战。例如,采用冗余网络连接、心跳检测等技术来及时发现和处理网络故障。
想解决上述的挑战与痛点就用ZooKeeper框架来解决!
1.2 什么是集群?
集群是一组相互独立的计算机通过高速通信网络连接起来,协同工作以完成特定任务的系统。
一、集群的特点
- 高可用性- 当集群中的某一台计算机出现故障时,其他计算机可以迅速接管其任务,确保系统持续运行,减少因单点故障导致的服务中断。- 例如,在一个 Web 服务器集群中,如果一台服务器宕机,用户的请求可以自动被分配到其他正常运行的服务器上,用户几乎感觉不到服务的中断。
- 高性能- 通过将任务分配到多台计算机上并行处理,可以大大提高系统的处理能力和响应速度。- 比如在科学计算领域,大型的计算任务可以分配到集群中的各个节点上同时进行计算,从而缩短计算时间。
- 可扩展性- 可以根据需求方便地添加或移除计算机节点,以适应不断变化的业务需求。- 当业务量增长时,只需向集群中添加新的服务器即可提高系统的处理能力;当业务量下降时,可以移除部分服务器以降低成本。
二、集群的类型
- 负载均衡集群- 主要目的是将大量的客户端请求均衡地分配到多个服务器节点上,以提高系统的整体性能和吞吐量。- 通常使用专门的负载均衡设备或软件来实现请求的分发,常见的负载均衡算法有轮询、加权轮询、最少连接等。
- 高可用集群- 致力于提供高可靠性的服务,确保系统在出现故障时能够快速恢复。- 一般通过冗余设计,如多台服务器同时运行相同的服务,当主服务器出现故障时,备用服务器能够立即接管服务,保证业务的连续性。
- 高性能计算集群- 用于执行大规模的科学计算、工程模拟等高性能计算任务。- 通常由大量的计算节点组成,这些节点通过高速网络连接,并使用专门的并行计算软件和工具来实现任务的并行处理。
三、集群的应用领域
- 企业级应用- 许多企业的关键业务系统,如电子商务网站、企业资源规划(ERP)系统、客户关系管理(CRM)系统等,都采用集群技术来提高系统的可用性和性能。- 以电子商务网站为例,在促销活动期间,访问量会大幅增加,通过集群可以确保网站能够稳定地处理大量的用户请求。
- 科学研究- 在气象预报、生物信息学、物理学等科学研究领域,需要进行大规模的计算和数据处理,高性能计算集群成为不可或缺的工具。- 例如,气象预报需要对大量的气象数据进行复杂的数值模拟计算,高性能计算集群可以快速地完成这些计算任务,为气象预报提供准确的数据支持。
- 大数据处理- 随着大数据时代的到来,对海量数据的存储和处理需求不断增长,集群技术在大数据处理中发挥着重要作用。- 例如,Hadoop 分布式文件系统和 MapReduce 计算框架就是基于集群技术构建的,能够高效地处理大规模的数据集。
1.3 什么是HA高可用?
HA(High Availability,高可用性)是指系统经过专门的设计,从而减少停工时间,保持其服务的高度可用性。
一、高可用的重要性
在当今的数字化时代,许多关键业务系统如金融交易系统、电子商务平台、通信网络等都需要持续不间断地运行。如果这些系统出现故障或停机,可能会导致严重的经济损失、影响用户体验甚至危及公共安全。因此,确保系统的高可用性至关重要。
二、实现高可用的方法
- 冗余设计- 硬件冗余:采用多台服务器、存储设备、网络设备等,当其中一台设备出现故障时,其他设备可以立即接管其工作,确保系统继续运行。例如,在服务器集群中,通常会配置多台相同的服务器,每台服务器都可以独立地处理业务请求。- 软件冗余:对于关键的软件组件,如数据库管理系统、应用服务器等,可以采用冗余配置,以防止单点故障。例如,使用主从数据库架构,当主数据库出现故障时,从数据库可以立即切换为主数据库,继续提供服务。
- 故障检测与恢复- 实时监测系统的运行状态,一旦发现故障,立即采取相应的恢复措施。故障检测可以通过硬件监控设备、软件监测工具等实现。例如,服务器可以安装硬件传感器,实时监测温度、电压等参数,当出现异常时发出警报。- 恢复措施可以包括自动切换到备用设备、重新启动故障组件、恢复数据等。例如,在高可用集群中,当某台服务器出现故障时,集群管理软件会自动将业务请求转移到其他正常的服务器上,并尝试重新启动故障服务器。
- 负载均衡- 将业务请求均匀地分配到多个服务器上,避免单个服务器负载过高而导致故障。负载均衡可以通过硬件负载均衡器或软件负载均衡算法实现。例如,在 Web 服务器集群中,可以使用负载均衡器将用户的请求分配到不同的服务器上,以提高系统的整体性能和可用性。
- 数据备份与恢复- 定期备份重要数据,以防止数据丢失。在出现故障时,可以快速恢复数据,确保系统能够尽快恢复正常运行。数据备份可以采用全量备份、增量备份等方式,并存储在不同的位置,以提高数据的安全性。例如,企业可以将数据备份到本地磁盘、网络存储设备或云存储服务中。
1.4、什么是ZooKeeper?
•Zookeeper 是 Apache Hadoop 项目下的一个子项目,是一个树形目录服务。
•Zookeeper 翻译过来就是 动物园管理员,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小 猪)的管理员。简称zk
•Zookeeper 是一个分布式的、开源的分布式应用程序的协调服务。
•Zookeeper 提供的主要功能包括:
•配置管理
•分布式锁
•集群管理
ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。它是个JAVA项目!
1.5、为什么要学习ZooKeeper?
以下是一些用到 ZooKeeper 的框架:
一、Hadoop
- Hadoop 生态系统中的 HBase 依赖 ZooKeeper。HBase 是一个分布式的、面向列的开源数据库,ZooKeeper 为 HBase 提供分布式协调服务,包括存储 HBase 的元数据信息、保障主节点选举的可靠性等。例如,在 HBase 启动时,通过 ZooKeeper 来确定主服务器的位置,并协调各个 RegionServer 的工作状态。
二、Kafka
- Kafka 是一种高吞吐量的分布式发布订阅消息系统。它利用 ZooKeeper 进行分布式协调和管理,如存储 broker 的信息、主题的分区状态、消费者的消费偏移量等。当 Kafka 集群中的 broker 或主题发生变化时,ZooKeeper 能够及时通知相关的客户端和 broker,确保系统的动态调整能够顺利进行。
三、Dubbo
- Dubbo 是一款高性能、轻量级的开源 Java RPC 框架。Dubbo 使用 ZooKeeper 作为其注册中心,服务提供者将自己提供的服务注册到 ZooKeeper 中,服务消费者从 ZooKeeper 中获取服务提供者的地址列表,从而实现服务的自动发现和负载均衡。例如,当有新的服务提供者加入或旧的服务提供者下线时,ZooKeeper 能够及时通知服务消费者进行相应的调整。
四、Storm
- Storm 是一个分布式实时计算系统。它借助 ZooKeeper 来管理集群的状态和配置信息,例如 Nimbus 和 Supervisor 的启动和停止、任务的分配和监控等。通过 ZooKeeper,Storm 能够实现高可用的集群架构,确保在节点故障时能够快速恢复和重新分配任务。
如果你公司的项目用到dubbo框架必然依赖用到ZooKeeper!
如果你公司的项目用到Hadoop框架也必然依赖用到ZooKeeper!
简单说ZooKeeper框架在很多场景都有运用到,搭建clickhouse分布式集群也用到ZooKeeper!流行的分布式项目必然用到ZooKeeper!很多框架都跟它有关系,ZooKeeper作为分布式项目中的管理协调者角色很重要, 所以同学们,不得不学!
1.6 ZooKeeper有什么突出的优点?
ZooKeeper 通过以下方式保证分布式锁的可靠性:
一、节点特性保证
- 临时顺序节点:- ZooKeeper 在实现分布式锁时会利用临时顺序节点。当一个客户端请求锁时,它会在锁对应的父节点下创建一个临时顺序节点。临时节点的特性是当创建它的客户端会话结束或发生故障时,该节点会被自动删除。- 顺序节点则保证了节点创建的先后顺序。这使得每个客户端创建的节点都有一个唯一的编号,编号越小表示创建时间越早。例如,客户端 A、B、C 同时请求锁,它们分别创建的临时顺序节点可能是 /lock/0000000001、/lock/0000000002、/lock/0000000003。
- 节点监听机制:- 客户端在创建自己的临时顺序节点后,会通过 ZooKeeper 的监听机制监听比自己编号小的前一个节点的状态变化。一旦前一个节点被删除,说明当前客户端有可能获得锁,它会收到通知并进行相应的处理。- 例如,客户端 B 会监听客户端 A 的节点状态。如果客户端 A 释放锁(其会话结束或主动删除节点),客户端 B 会收到通知,此时客户端 B 会检查自己是否是当前编号最小的节点,如果是,则获得锁。
二、集群特性保障
- ZooKeeper 集群架构:- ZooKeeper 通常以集群的方式部署,由多个服务器组成。这增加了系统的可靠性和容错性。即使部分服务器出现故障,只要集群中大多数服务器正常运行,ZooKeeper 服务就能继续提供服务。- 在分布式锁的场景下,如果一个客户端与某个 ZooKeeper 服务器的连接出现问题,它可以尝试连接其他服务器,继续参与锁的竞争和监听。
- 数据一致性保证:- ZooKeeper 采用 Zab(ZooKeeper Atomic Broadcast)协议来保证数据的一致性。无论客户端连接到哪个服务器,它们看到的锁的状态和顺序都是一致的。- 当一个客户端获得锁并对共享资源进行操作时,其他客户端无论从哪个服务器获取锁的信息,都能准确地知道当前锁的持有者以及自己在锁等待队列中的位置。
三、故障处理机制
- 客户端故障处理:- 如果持有锁的客户端发生故障,由于其创建的是临时节点,ZooKeeper 会自动删除该节点。此时,等待锁的其他客户端会收到通知,重新竞争锁。- 例如,客户端 A 获得锁后突然发生故障,其对应的临时顺序节点被删除。客户端 B 和 C 会收到通知,它们会检查自己是否是当前编号最小的节点,客户端 B 发现自己是,于是获得锁。
- ZooKeeper 服务器故障处理:- 如果 ZooKeeper 服务器出现故障,集群会自动进行故障转移和恢复。在这个过程中,可能会有短暂的不可用时间,但一旦集群恢复稳定,分布式锁的功能会继续正常工作。- 客户端会在服务器故障期间进行重试和重新连接,确保在服务器恢复后能够继续参与锁的竞争和使用。
1.7 ZooKeeper特点概述?
通俗易懂的语言与图示如下:
- 在这里的每个节点都称为:ZNODE,每个节点上都会保持自己的数据与节点信息! (Leader)领导者节点(只有一个)负责事物写入更新、分发广播的任务,(Follower)跟随着节点负责供客户端查询与把写入命令传达给领导者的作用!我们可以用MYSQL一主多从数据库集群常用读写分离的概念来理解。区别是ZooKeeper 每个客户端都可以写入操作,其实是Follower节点接收到写入操作传到给Leader节点进行写入再出发广播同步机制!
- 我们配置5台服务器5个ZNODE节点组成一个ZooKeeper集群,每台服务器分别部署ZooKeeper服务,独立IP端口!5个节点中其中只有一个领导者节点,其余是跟随着节点!1个老大,4个小弟!启动过程中会自动选举谁是,半数以上,并且按顺序从大到小的规则选举谁是领导节点!
- 5台服务器中,假设宕机2台,还是可以正常运作的!如果超过半数,3台宕机,整个集群就宕机了!只要半数以上的节点存活,整个集群就是正常运作的!具有高可用的特点!
1.8 ZooKeeper集群ZNODE节点选举(Leader)领导节点制度算法概述
总结选举领导者节点的算法是依次从小到大递加,超过半数选中!
什么情况下会触发选举机制?
1、初始化集群启动的时候
2、(Leader)领导者节点服务器宕机了
1.9 ZooKeeper集群ZNODE节点客户端写入请求流程案例总结
这一章节概念比较多,如果从上到下到都读了,还是萌萌哒也很正常,可以随着下面章节继续深入学习,随着深入学习到真实案例,就能理解ZooKeeper到底是什么?如果你一直用的传统单点架构项目,也许不能马上理解,分布式项目中ZooKeeper是作为一个管理协调者的角色!
你首先需要真正了解什么是分布式项目?什么是HA高可用?什么是集群?如果是单机单点部署项目是用不到分布式协调的。
关于什么分布式架构,与分布式架构的演变过程请参考笔者另一篇文章!
https://blog.csdn.net/nasen512/article/details/142769773
2、深入学习篇
2.1 ZooKeeper的数据模型
- ZooKeeper是一个树形目录结构,其数据模型与LINUX的文件系统目录树形类似,拥有一个层次话的结构!
- 在这里的每个节点都称为:ZNODE,每个节点上都会保持自己的数据与节点信息!
- 节点可以拥有子节点,同时也允许少量(1MB)数据存储在该结点上!
2.2 ZNODE节点的四种类型
ZooKeeper 中的节点有以下四种类型:
一、持久节点(PERSISTENT)
- 特点- 持久化存储的节点,一旦创建,除非主动删除,否则会一直存在于 ZooKeeper 服务器上。- 即使 ZooKeeper 集群发生故障重启,持久节点的数据也不会丢失。
- 应用场景- 适合存储一些需要长期保存的配置信息或关键数据。例如,在分布式系统中,可以用持久节点存储系统的全局配置参数,这些参数在系统运行过程中一般不会频繁更改,并且需要在系统重启后仍然可用。
二、临时节点(EPHEMERAL)
- 特点- 与客户端会话绑定,当创建临时节点的客户端会话结束时,该节点会被自动删除。- 临时节点不能有子节点。
- 应用场景- 可以用于实现分布式锁。例如,多个客户端竞争一个资源时,每个客户端在 ZooKeeper 中创建一个临时节点,谁创建成功谁就获得了对资源的访问权。当客户端完成对资源的操作后,删除该临时节点,释放资源。- 还可用于监控服务的可用性。当一个服务启动时,在 ZooKeeper 中创建一个临时节点,当服务下线时,该节点自动删除。其他依赖该服务的组件可以通过监听这个临时节点的变化来及时得知服务的状态。
三、持久顺序节点(PERSISTENT_SEQUENTIAL)
- 特点- 具有持久节点的特性,即会一直存在于 ZooKeeper 服务器上,除非被主动删除。- 在创建节点时,ZooKeeper 会自动为其添加一个顺序编号,编号是单调递增的。
- 应用场景- 可用于实现分布式队列。例如,生产者在 ZooKeeper 中创建持久顺序节点来表示任务,消费者按照顺序编号依次处理任务,确保任务的有序执行。- 在分布式环境下需要对资源进行唯一标识和顺序分配时,也可以使用持久顺序节点。
四、临时顺序节点(EPHEMERAL_SEQUENTIAL)
- 特点- 结合了临时节点和顺序节点的特点。与客户端会话绑定,当会话结束时节点自动删除,同时在创建时会被自动分配一个顺序编号。
- 应用场景- 同样可以用于实现分布式锁,相比临时节点,临时顺序节点可以避免多个客户端同时创建节点时的冲突问题,确保只有一个客户端能够获得锁。- 在一些需要临时且有序的场景中,如分布式任务分配系统中,可以用临时顺序节点来表示临时任务,并按照顺序进行处理。
2.3 ZooKeeper服务端常用命令
2.4 ZooKeeper客户端常用命令,节点操作与节点关键信息
2.5 ZooKeeper监听通知机制原理
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper会通知客户端。监听机制保证ZooKeeper保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。
2.6 ZooKeeper分布式锁实现算法概述
分布式锁是控制分布式系统或不同进程之间共同访问共享资源的一种机制。
在分布式环境下,由于多个节点或进程可能同时尝试访问同一资源,为了避免数据不一致、资源竞争等问题,就需要引入分布式锁。
举例 3个客户端123,竞争关系,争夺锁!
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点!
1、客户端获取锁时,在lock节点下创建临时顺序节点!之所以用临时节点,是避免客户端宕机之后,永久节点不释放造成锁永不释放的问题!
2、然后获取lock下所有子节点集合,如果发现自己是集合序号中最小的,那么就判定为成功获取锁,用完锁释放将该节点删除!
3、如果发现自己创建的节点并非lock子节点集合中最小的,说明自己没有获得锁!此时客户端需要找比自己小那个节点,进行对其注册事件监听器,监听删除事件!
4、如果发现比自己小的节点被删除,则客户端的WATCHER会受到相应的通知,此时再次判断自己创造的节点是不是lock子节点集合中最小的,如果是就得到了锁,如果不是,就继续跟上一步,继续获取到比自己小的一个节点并注册监听!
3、总结
本篇文章主要是把ZooKeeper的基本概念系统的讲讲,ZooKeeper的安装部署、集群、还有分布式算法笔者我打算分几篇文章来讲述!
笔者正在整合当前大数据相关主流框架的技术点!概括总结的过程中也是笔者自己学习梳理知识点的过程!
版权归原作者 技术很渣 所有, 如有侵权,请联系我们删除。