Zookeeper 简介
1. 前言
大家好,今天我们来介绍一个在分布式环境中经常使用的技术—— Apache Zookeeper 。Apache ZooKeeper 是 Apache Software Foundation 下的开源志愿者项目。接下来我们主要来介绍一下 Zookeeper 是什么?它有什么作用?以及我们为什么要学习 Zookeeper。
2. 什么是 Zookeeper
什么是 Zookeeper 呢?我们先来看一下 Zookeeper 的官网介绍:
原文直接翻译过来的概念很抽象,那我们简单的解释一下。在分布式环境中,存在着大量的服务,服务与服务之间难以做到彼此协调,也不便于开发人员对服务进行维护管理,而 Zookeeper 使用它简单的结构和 API ,协调服务与服务之间的关系,让开发人员专注于应用程序的核心业务逻辑,更方便的对应用程序的服务进行管理维护。
所以我们可以把 Zookeeper 叫做分布式协调服务。
简单介绍了 Zookeeper 是什么,接下来我们就来了解一下 Zookeeper 具体的应用场景。
3. Zookeeper 的应用
- 服务注册与发现
当我们的分布式系统增加了一个服务,我们只需要利用 Znode 和 Watcher,让它注册到 Zookeeper 中,我们就可以很方便的对这个服务进行管理; - 分布式锁
为了防止在分布式环境下,服务中多个进程之间互相干扰,我们可以用 Zookeeper 的临时顺序节点实现分布式锁,对这些进程进行调度,让它们顺序执行; - 配置管理
我们可以把核心的配置文件交给 Zookeeper 管理。当我们修改配置文件时,Zookeeper 就会把配置文件的信息同步到集群中的所有节点中去。
那么 Zookeeper 是依靠什么来实现这些功能的呢?接下来我们来关注 Zookeeper 有什么特点。
4. Zookeeper 的特点
- 在分布式环境下,Zookeeper 的部署方式为一主( Leader )多从( Follower )的集群方式,只要半数以上的节点(包括 Leader 节点)存活,Zookeeper 集群就能正常服务。就算是 Leader 节点挂掉了,Zookeeper 也会进行崩溃恢复,所说 Zookeeper 集群本身是高可用的;
- Zookeeper 集群的数据具有全局一致性。也就是说,无论客户端连接到 Zookeeper 集群的哪一个从节点,获取的数据都是一致的;
- 在 Zookeeper 集群节点进行数据同步更新时,要么全部成功,要么全部失败。所以 Zookeeper 的数据更新具有原子性;
- 在同一个客户端对 Zookeeper 节点进行更新请求操作时,会根据发送的顺序依次去执行;
- 由于 Zookeeper 能存储的数据量非常小,所以数据的同步更新也会非常快。也就可以说在一定时间段内,客户端获取的数据是实时的。
根据上面的特点,我们可以了解到 Zookeeper 在分布式环境中的作用还是非常强大的。所以我们还是有必要去学习一下 Zookeeper 的。
说了这么多 Zookeeper 的功能,那它与其他类似功能的技术相比较有什么区别呢?接下来我们用 Zookeeper 和其他技术进行一下比较。
5. Zookeeper 与其他技术的比较
-
Zookeeper 与 Redis 分布式锁比较
除了 Zookeeper 可以实现分布式锁之外,我们还可以使用高性能缓存技术 Redis 来实现,我们来比较一下它们的优缺点。分布式锁 优点 缺点 Zookeeper 1. 功能已经封装,实现简单 2. 有等待锁的队列,提升了抢锁的效率 添加和删除节点性能较低 Redis Set 和 Del 指令的性能高 1. 实现较复杂,需要考虑超时、原子性、误删的情况 2. 没有等锁队列,只能通过客户端自旋来等锁,效率低下 -
Zookeeper 与 Eureka 的比较
Eureka 是 Spring Cloud 微服务架构的分布式注册中心。
在进行比较之前,我们来了解一下 CAP 定理。什么是 CAP 定理呢?- C : Consistent ,一致性,需要保证数据的一致性。
- A : Availability ,可用性,需要保证服务的可用性。
- P : Partition tolerance ,分区容错性,服务对网络分区故障的容错性。
在 CAP 这个定理中,任何分布式系统都只能保证其中两条。那么 Zookeeper 和 Eureka 又是保证的哪两条呢?
分布式注册中心 优点 缺点 Zookeeper (保证 CP) 新的服务注册时会同步到其他节点,保证了节点数据的一致性 为了保证一致性,在 Leader 选举阶段服务不能注册,失去了可用性 Eureka (保证 AP) Eureka 的各个节点是平等的,只要有一个节点存在,就可以提供服务 新服务注册时,不会把数据同步到其他节点上,失去了数据一致性
6. 学习 Zookeeper 的必要条件
想要学习 Zookeeper ,我们必须有以下技能:
- Java :Zookeeper 是基于 Java 语言开发的,这是学习 Zookeeper 最基本的要求;
- Linux :Zookeeper 一般都是部署在 Linux 上的,所以我们需要知道如何操作 Lunix ,以及如何部署 Zookeeper ;
- 分布式开发:Zookeeper 作为分布式环境中重要的组件,我们必须了解什么是分布式项目,如何去开发分布式项目,以及分布式的项目会遇到什么问题。
7. 课程设计思路
在 Zookeeper 的课程中,我们的学习路线从 Zookeeper 的基础知识入门,到简单使用 Zookeeper ,再到 Zookeeper 的实现原理,最后使用 Zookeeper 进行应用实战,一步一步从入门到 Zookeeper 应用高手。以下是 Zookeeper 课程的学习路线:
- Zookeeper 基础入门:
包括 Zookeeper 的数据模型,Zookeeper 安装及部署,以及两种 Zookeeper 的 Java 客户端的初步使用,有了扎实的基础我们才能深入学习它的实现原理; - Zookeeper 实现原理:
包括 Zookeeper 通信原理,Zookeeper 监听机制,Zookeeper ACL,Zookeeper 序列化方式,Zookeeper ZAB 协议。其中重点是 Zookeeper ZAB 协议,包括两种运行模式:崩溃恢复模式和消息广播模式。了解了 Zookeeper 的实现原理,我们才能更好的来使用 Zookeeper; - Zookeeper 应用实战:
在 Zookeeper 实战内容中,我们使用 Zookeeper 实现了分布式锁、分布式 ID、负载均衡、配置中心、集群管理等,学习了如何使用了高效的部署方式 —— Docker 来构建我们的 Zookeeper 集群,以及如何对 Zookeeper 的 Java 进程和运行状态进行监控,最后我们还学习了在 Kafka 和 Dubbo 两大框架中是如何使用 Zookeeper 的。
相信通过这些内容的学习,同学们一定会熟练的掌握 Zookeeper,并使用 Zookeeper 解决在实际的开发中遇到的分布式环境所带来的问题。
8. 小结
本节课程我们主要了解了 Zookeeper 是什么,Zookeeper 的特点。我们来对本节内容进行总结:
- Zookeeper 是一种分布式协调服务。
- Zookeeper 的应用有服务注册与发现,分布式锁,配置管理。
- Zookeeper 的特点:集群的高可用性,数据的一致性、原子性,执行的顺序性,实时性。
- Zookeeper 优缺点:Zookeeper 是 CP 系统,在保证数据一致性的同时,不能保证服务注册的高可用。