一、ZooKeeper简介&特性
ZooKeeper是一个开源分布式协调服务系统,独特的Leader-Follower的集群结构,很好地解决了分布式单点问题。目前主要应用场景
(1)统一命名服务
(2)配置管理
(3)分布式锁服务
(4)集群管理
1. 一些基本概念
(1)角色
a. Leader
b. Follower
c. Observer
(2)数据单元:Znode(Path)
统一命名空间中的数据单元,形象点来理解的话,就是文件路径树中的一个个节点,相当于一个文件或者一个目录
(3)监听器:Watcher
2. 数据模型和层级命名空间
ZooKeeper提供的命名空间极像一个标准的文件系统,一个名字就是一个以“/”分隔的路径元素的序列,ZooKeeper命名空间的每个节点(即Znode)通过路径来标识
(1)树形结构
其中一个节点,即为一个Znode
(2)节点与临时节点
与标准文件系统不同的是,ZooKeeper命名空间中的所有节点都可以有数据和子节点,这就好比文件系统中的一个文件可以同时是一个目录。ZooKeeper被设计用来存储管理服务的数据,如:状态信息、配置、位置信息等,所以每个节点存储的数据通常很小,几字节到几K字节不等。我们使用Znode这个术语来表示ZooKeeper中的数据节点。
Znode上维持一个stat结构,它包含数据变化的版本号、ACL变化和时间戳,以允许cache校验和协调化的更新。每当Znode的数据变化时,版本号便递增。一个客户端收到数据时,也会同时收到数据的版本号。
保存在每个Znode中的数据都是自动读写的,读操作获取Znode的所有数据,写操作替换掉Znode的所有数据。每个节点都有一个访问控制列表(ACL)来限制谁能做哪些操作。
有一种特殊的Znode类型是临时节点,这些Znode只存在于创建Znode的会话中,当会话结束,这些节点也就被删除了。
(3)Znode的类型
a. 持久化节点(persistent)
b. 临时节点(ephemeral)
c. 时序节点(sequential)
(4)多维度(对比configserver和diamond)
4. 一些特性
(1)条件化更新和监控(watcher)
ZooKeeper支持监控的机制。客户端可以在指定Znode上设置一个watcher。这个watcher会在Znode发生变化时触发和移除。当watcher被触发时,客户端会收到到一条说明znode发生变化的通知消息,进而可以触发自己预先定义的逻辑,实现Znode状态的监控。如果客户端和服务端的连接断了,客户端会收到一个本地的通知。
(2)写请求严格顺序性
所有写请求都会交给leader节点来处理,包括create()、delete()、setData()等等
(3)视图唯一性
所有服务节点上所呈现给客户端的是一棵结构和数据都保持一致的树
(4)ZooKeeper所能保证的一些特性
a. 顺序一致性:来自客户端的更新操作将以它们发送的顺序来执行
b. 原子性:更新操作只有成功和失败两种结果,没有局部化结果
c. 单个系统镜像:不管客户端连接的服务节点是哪个,所有客户端看到的服务都会是一致的。当然,这里的一致是最终一致性,实际上是存在一定的延迟的,最高延迟时间是500ms
d. 可靠性:一旦更新操作被执行,它将被持久化保存直到被下次更新操作所覆盖
e. 及时性:客户端所看到的系统在一个时间范围内是最新的
(1)watcher
(2)解耦/异构
(3)案例
a. 案例1:心跳检测
b. 案例2:愚公移山,任务的调度与机器管理
c. 案例3:millau(原forest),监控平台与管理平台,任务触发
d. 案例4:zeus+treasure,通过ZK将两个不同的系统协调起来
4. 分布式锁
(1)唯一性
(2)时序性
(3)读写锁
(4)分布式锁进阶
a. 刚才的问题(域账号密码修改通知问题)的实现方法是否有问题?是否通知了真正需要修改密码的小二?是否找准了订阅者真正关心的问题?
Client处理无用通知。
Server发送无用通知。
b. 问题核心:Watcher注册点
c. 解决方案:
缩小锁粒度
缩小订阅者的订阅范围
(5)案例
a. 终搜:竞争Dump任务的执行权,动态master选丼
b. 一淘DUMP中心:定时脚本执行+手动修复
c. 淘宝SNS:任务执行权
d. 淘宝交易-Honey:任务执行权
e. 聚划算-SNS-JU-TASK
5. 集群管理
(1)master选举
(2)动态调整集群拓扑结构
(3)案例
a. TAE:一旦某个机器A挂了,马上能够通知到一个Manager,然后Manager将A机器上的东西(看作是正常运行的最后状态)迁移到新的机器中。这个场景用Zookeeper可以管理。
b. 精卫:主备切换
6. 负载均衡
(1)案例
a. 消息中间件meta:生产者负载均衡,消费者的负载均衡,meta中的分区和消费都数据紧密联系。