目录
一、Zookeeper 概述
1.1 什么是 Zookeeper
Zookeeper 是一个基于观察者模式设计的分布式服务管理框架,可以将它认为是 文件系统 + 通知机制。它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者作出相应的反应。
1.2 Zookeeper 的特点
- 集群: 由一个领导者(Leader),多个追随者(follower)组成的集群。同时支持注册多个观察者(Observer)
- 稳定性: 集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务
- 全局数据一致: 每个 server 都保存一份相同的数据副本,Client 无论连接到哪一个 Server,数据都是一致的
- 更新请求顺序进行: 来自同一个 Client 的更新请求按其发送的顺序依次执行
- 数据更新原子性: 一次数据更新要么成功,要么失败
- 实时性: 在一定时间范围内,Client 能读到最新数据
1.3 Zookeeper 数据结构
Zookeeper 的数据结构可以看成一棵树,每个节点称作一个 ZNode,每个 ZNode 默认能够存储 1MB 的数据,且每个 ZNode 都可以通过其路径唯一标识。
1.4 应用场景
提供的服务类型有:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等
1.4.1 统一命名服务
需求:
在分布式系统中,经常需要给一个资源生成一个唯一的ID,在没有中心管理结点的情况下,要生成这个全局唯一,又便于理解的的ID并不是一件很容易的事情。Zookeeper 就提供了这样一个命名服务
实现:
使用 Zookeeper 创建顺序节点时,成功创建的每个节点都会返回一个编号,使用该编号以及给定的名称即可生成具有特定含义的统一名称
1.4.2 统一配置管理
需求:
在分布式环境下,配置文件同步十分常见。如在一个集群中,所有节点的信息是一致的,如 Kafka 集群,对配置文件修改后,希望可以快速同步到各个节点上。
实现:
Zookeeper 的观察者模式则能帮助我们实现这一点,我们可以将配置信息写入 ZooKeeper 上的一个 ZNode 中,各个服务端监听这个 ZNode,一旦 ZNode 中的数据被修改,ZooKeeper 将通知各个客户端服务器。
1.4.3 统一集群管理
需求:
在分布式环境中,实时掌握每个节点的状态是必要的。例如某些节点挂了,其他所有的节点立刻都能知道,并可根据节点实时状态作出一些调整。
实现:
我们可以将节点信息写入 ZooKeeper 上的一个 ZNode 中,监听这个 ZNode 可以获取它的实时状态变化。
1.4.4 服务器节点动态上下线
需求:
客户端能实时洞察到服务器上下线的变化
实现:
各个服务器将其本身是否在线的状态写入 Zookeeper 中,客户端观察 Zookeeper 上的数据变化,发现原本访问的服务器挂了,则自动切换连接的服务器
1.4.5 软负载均衡
需求:
由于每台服务器的访问数都不同,将更多的请求发送到压力更轻的服务器上
实现:
在 Zookeeper 中记录每台服务器的访问数,让客户端去访问压力更轻的服务器。