Zookeeper

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

逻辑时钟: 也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的

全新选举机制:

  1. 服务器ID大的权重大
  2. 票数过半, 选举结束

非全新选举机制:

  1. 逻辑时钟小的 选举结果被忽略
  2. 统一逻辑时钟后, 数据ID大的胜出
  3. 数据ID相同, 服务器ID大的胜出
zookeeper典型应用

数据发布与订阅( 配置中心) : 索引的元信息和服务器集群机器的节点状态存放在ZK的一些指定节点,供各个客 户端订阅使用

命名服务: 根据全局唯一path ,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息 dubbo

分布式锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值