ZooKeeper
是什么
ZooKeeper 是一个典型的分布式数据一致性解决方案
能干什么
分布式应用程序能够通过zookeeper来实现如下功能
- 负载均衡
- 数据发布/订阅
- 配置中心
- Master选举
- 分布式锁
- 分布式队列
- 命名服务
CAP
zookeeper实现了CP,丢失了A
当集群进行leader选举期间,整个集群都是不可用的,因此不满足A(可用性)
特性
顺序一致性
从一个客户端发起的事务请求,最终将会严格的按照其发起的顺序被应用到zookeeper中去
集体什么是顺序一致性,可以看这篇文章https://lotabout.me/2019/QQA-What-is-Sequential-Consistency/
原子性
从客户端发起的事务请求是原子性的,要么在所有的机器上都执行完成,要么都是失败,不会一部分成功,一部分失败
全局数据一致性
无论客户端连接到服务器的哪个节点,都能保证读取到的数据是一致的
可靠性
一旦事务被处理,并且向客户端发送了响应,那么该事务引起的服务端数据修改将会一直保存
实时性
当事务被正确处理后,zookeeper保证在一段时间范围内客户端可以读取到最新的数据
重要概念
会话
当客户端连接到服务端的一个节点时,会创建一个连接到服务端节点的tcp连接并且开始一个新的会话周期。通过这个tcp连接,客户端可以向服务端发送命令,接收服务端的响应以及watch事件通知。当有大量空闲连接连接到服务端节点时,会影响服务端的性能,因此会话有会话过期时间。当一个客户端长时间不和服务端交互时,会关闭连接并且结束会话周期。当连接因为一些异常情况断开时,客户端只要在会话过期时间内连接到任意一个服务端节点,之前创建的会话仍然生效。
znode
znode类似于文件路径,zookeeper的底层存储结构是一个树形结构,该树形结构上的每个节点是znode,znode上可以存储数据,每一个 znode 默认能够存储 1MB 的数据
znode有如下几种类型:
- 持久性节点
该节点创建之后,不会因为会话的过期而被删除,会一直存在,除非被删除 - 持久顺序节点
在持久节点的基础上,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作为新的节点名。 - 临时节点
和会话的生命周期绑定,当会话过期时,临时节点会被删除。在临时节点下面不能创建子节点。 - 临时顺序节点
类比于持久顺序节点
watcher
客户端可以注册一些watcher到服务端,当服务端发生指定的事件时,可以通知到客户端
acl
zookeeper中引入了acl权限控制
- create:创建子节点的权限
- read:获取节点数据和子节点列表的权限
- write:更新节点的权限
- delete:删除节点的权限
- admin:设置节点ACL的权限
节点角色
Leader
负责进行投票的发起和决议,并且最终更新状态
Follower
用于接收客户请求并返回响应结果,参与leader选举的投票
Observer
用于接收客户端请求并返回响应结果,不参与leader选举的投票,只同步leader状态
为什么需要Observer
client可以连接到任意一台服务器并发送请求。当是读请求时,接收到client请求的节点会查询本节点存放的副本并发送响应结果。如果是写请求,会将请求转发给leader,由leader来发起proposal,对该操作进行投票,其他server会进行投票,当投票量超过半数时,leader会向所有的节点发送通知,节点收到通知会将变更保存到当前节点中,此时接收请求的节点会向client发送响应结果。
从上面的过程可以看出,服务器的节点一共有两个职能:1
- 参与投票
- 接收并响应客户端请求
当请求量逐渐增多而需要拓展集群从而能够响应更多客户端请求时,可以增加observer的数量,因为其不参与投票,因此不会因为observer数量的增多导致参与投票的节点个数增多,从而减慢投票速度
Learner
同步leader的数据的角色都称为学习者,包括follower和observer