Zookeeper 是一个开源的分布式协调框架,它主要用于处理分布式系统中的一些常见问题,如同步、配置管理、命名服务和集群管理等。Zookeeper 是由 Apache 提供的,并且广泛应用于各种分布式应用中,特别是在高可用、高可靠性和高性能的系统中。
Zookeeper 的主要功能
- 分布式协调:Zookeeper 提供了协调多个节点(服务器)间行为的机制。例如,分布式锁、选举、配置管理等。
- 命名服务:Zookeeper 提供类似于文件系统的树形结构,可以作为分布式系统中的命名服务,帮助各个节点在分布式环境中互相发现。
- 同步服务:Zookeeper 可以帮助多个客户端保持一致的状态。一个典型的例子是分布式锁,它确保在同一时刻只有一个客户端能进行某个操作。
- 配置管理:Zookeeper 可以集中管理配置信息并将其同步到所有节点,确保各个节点的配置信息一致。
- 高可用性:Zookeeper 本身设计为高可用且容错的,可以在节点出现故障时继续工作。
Zookeeper 的架构
Zookeeper 的核心架构由以下几个部分组成:
- Zookeeper 集群:Zookeeper 由多个节点组成,这些节点之间会通过选举产生一个 leader 节点,其它节点为
follower。整个集群至少需要 3 个节点,以确保能够在节点失败时继续提供服务。 - Zookeeper 客户端:客户端通过 Zookeeper 提供的 API 进行交互,它可以是任意编程语言的客户端,Zookeeper
提供了 Java、C、Python 等语言的客户端库。 - Zookeeper 服务器(节点):
Leader 节点:负责处理所有的写请求,并将数据同步到其它节点。
Follower 节点:负责处理所有的读请求,且将写请求转发给 leader 节点。跟随 leader 节点的变化。
Observer 节点:仅作为观察者,不参与投票和写请求,但它可以提供读服务,减少集群的压力。
ZNode:Zookeeper 中的核心数据结构,类似于文件系统中的文件或目录。 - ZNode 支持两种数据类型:
- 持久节点:当客户端断开连接时,节点依然存在。
- 临时节点:当客户端与 Zookeeper 服务器断开连接时,节点会被自动删除。
Zookeeper 的工作原理
Zookeeper 基于 Paxos 协议实现分布式一致性。所有的写请求都会先由 Leader 节点进行处理,然后将更改同步到所有的 Follower 节点。
- 读请求:Zookeeper 集群中的任何节点都可以处理读请求,通常由 Follower 节点处理。
- 写请求:写请求会先被发送到 Leader 节点,Leader 节点会进行数据处理并同步给其它节点。如果 Leader
节点宕机,集群会进行 Leader 选举,确保集群的高可用性。 - 一致性:Zookeeper 保证
顺序一致性(所有操作按提交顺序被执行),原子性(每个操作要么完全成功,要么完全失败),单一视图(客户端能看到一致的数据视图),实时性(客户端总能看到最新的数据),高可靠性(如果某个节点失败,系统仍然可以继续运行)。
Zookeeper 的常用操作
创建节点:
bash
create /myNode “data”
创建一个路径为 /myNode,值为 “data” 的节点。
获取节点数据:
bash
get /myNode
获取路径 /myNode 的数据。
修改节点数据:
bash
set /myNode “newData”
修改路径 /myNode 的数据为 “newData”。
删除节点:
bash
delete /myNode
删除路径 /myNode 的节点。
获取子节点:
bash
ls /myNode
获取 /myNode 路径下的子节点列表。
Zookeeper 的应用场景
- 分布式锁:通过临时节点实现分布式锁,确保在同一时刻只有一个客户端能够操作某个资源。
- 服务注册与发现:Zookeeper 用于服务注册与发现,允许各个服务通过注册节点将自己暴露给集群中的其他节点,其他节点可以通过获取
ZNode 子节点来发现服务。 - 分布式配置管理:Zookeeper 可以集中管理配置信息,所有服务都可以通过 Zookeeper
获取最新的配置信息,确保配置的一致性和可更新性。 - 分布式协调:通过 Zookeeper 实现如选举、同步、状态共享等任务。
官方文档
https://zookeeper.apache.org/doc/r3.7.0/