Zookeeper
zookeeper是一个分布式协调服务的开源框架,解决分布式集群中应用系统的一致性问题
zookeeper本质是一个分布式的小文件存储系统,基于目录树方式
主从集群:
主角色 leader master 大哥
从角色 follower slave 小弟
主从角色各司其职,从角色要收到主角色的管理。(常见的是一主多从)主备集群:
主角色 active
备角色 standby
主备集群解决了单点故障问题。形成了高可用。
主备集群中同一时间,有且只有一个是主角色。当主角色挂了,备角色切换成为主角色,保证服务的连续。zk集群是一个标准的主从集群。
zookeeper特性
- 全局数据一致: 每个服务器保存一份相同的数据副本 client无论连接哪个 展示的数据都一致
- 可靠性: 如果消息被其中一台服务器接受,那么将被所有的服务器接受
- 顺序性:
- 全局有序 某台服务器a消息在b前发布 则所有服务器a都在b前发布
- 偏序 同一个发布者依次发布 a b 消息 则a必将排在b前面
- 数据更新原子性 一次数据的更新 要么成功( 半数以上节点成功 ),要么失败
- 实时性 保证客户端在一个时间间隔范围内获得服务器的更新信息
zookeeper集群角色
leader: 处理事务和非事务请求 参与投票
follower: 处理非事务请求, 事务请求转发给leader 参与投票
Observer : 处理非事务请求, 事务请求转发给leader 不参与投票
zookeeper shell
客户端连接: zkCli.sh -server ip
- zkCli.sh
- zkCli.sh -server node-2
创建节点: create [-s] [-e] path data acl
- create /test1 t1 创建永久非序列化节点
- create -e /eee1 e1 创建临时非序列化节点
- create -s /sss1 s1 创建永久序列化节点
- create -e -s /eeesss1 创建临时序列化节点
读取节点:
- ls / 列出该路径的所有子节点
- get / 获得该节点的数据内容和属性信息
- ls2 / 获得该节点的子节点和属性信息
更新节点 : set path date [version] 可以指定该节点的数据版本 如果版本不一致则报错
- set /test1 t2
删除节点: delete path [version] 可以指定该节点的数据版本 如果版本不一致则报错
- delete /test1/eee1
- rmr 递归删除节点
节点限制:
setquota -n|-b val path 添加限制 n: 子节点最大个数 b: 数据值最大长度 val:子节点最大个数或数 据值最大长度
- setquota -n 2 /test1 设置/test1节点的子节点最大个数为2
listquota /test1 查询/test1节点的限制
delquota [-n|-b] path 删除quota
其他:
- history : 列出历史命令及其编号
- redo : 重新执行指定命令编号的历史命令
zookeeper数据模型
zookeeper结构和文件系统相似,都是树形结构
zookeeper树的每个节点被称为Znode
- Znode 既是文件又是目录 , 可以存储数据, 又可以拥有子节点
- Znode 存储大小有限制 最多1M
- Znode 具有原子性操作
- Znode 通过路径引用 必须以/ 开头
- Znode 由 stat data children 组成
Znode 有两种(临时节点 永久节点) 和一个特性 (序列化 ) , 所以Znode有四种, 在创建时就被确定类型
- 临时节点 : 依赖于会话 , 会话结束 节点自动被删除 , 也可以手动删除
- 永久节点 : 只有在客户端执行删除操作, 才能被删除
- 序列化: 指定序列化 Znode名字会自动加一个不断增加的序列号(10位数字,从1开始, 0000000001)
- cZxid:这是导致创建znode更改的事务ID。 - mZxid:这是最后修改znode更改的事务ID。 - pZxid:这是用于添加或删除子节点的znode更改的事务ID。 - ctime:表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode创建时间。 - mtime:表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode最近修改时间。 - dataVersion:表示对该znode的数据所做的更改次数。 - cversion:这表示对此znode的子节点进行的更改次数。 - aclVersion:表示对此znode的ACL进行更改的次数。 - ephemeralOwner:如果znode是ephemeral类型节点,则这是znode所有者的 session ID。 如果znode不是ephemeral节点,则该字段设置为零。 - dataLength:这是znode数据字段的长度。 - numChildren:这表示znode的子节点的数量。
zookeeper watcher
zookeeper允许客户端向服务端注册一个watcher (分布式发布/订阅功能 一对多)
- 客户端注册watcher
- 服务端事件发生, 触发watcher
- 客户端回调watcher 得到触发事件情况
watcher 是一次性的触发, 触发后, 服务端发给客户端watchedEvent对象, 通知事件是异步发送的
对象包含通知状态, 事件类型,节点路径
连接状态事件(type=None, path=null)不需要客户端注册, 就会触发, 有需要处理, 没有需要不用管
zk中监听分为两大类
- 连接状态事件监听 自动存在 不需要用户注册 客户端需要就处理 不需要就忽略不计
- 自定义监听 先注册再监听 一次性监听
shell 设置 watcher : get /test1 watch
zookeeper 选举机制
服务器ID : 服务器编号
选举状态 : looking following observing leading
数据ID : 存放的最新数据version
逻辑时钟: 也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的
全新选举机制:
- 服务器ID大的权重大
- 票数过半, 选举结束
非全新选举机制:
- 逻辑时钟小的 选举结果被忽略
- 统一逻辑时钟后, 数据ID大的胜出
- 数据ID相同, 服务器ID大的胜出
zookeeper典型应用
数据发布与订阅( 配置中心) : 索引的元信息和服务器集群机器的节点状态存放在ZK的一些指定节点,供各个客 户端订阅使用
命名服务: 根据全局唯一path ,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息 dubbo
分布式锁