zookeeper

2019-05-31  本文已影响0人  哓晓的故事

ZooKeeper保证只要大多数服务器可用((N+1)/(2N+1)),整个服务就是可用的

guarantees

znode

ZNode由两部分组成:协调数据状态数据

znode type

zookeeper 类似于一个文件系统, 数据以文件路径节点的方式存储, 但是节点有4种类型, 由 1,2,1+3,2+3组合而成

  1. Ephemeral, ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点
  2. Persistent, persistent节点不和特定的session绑定, 不会随着创建该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除.
  3. Sequence, sequence并非节点类型中的一种. sequence节点既可以是ephemeral的, 也可以是persistent的. 创建sequence节点时, ZooKeeper server会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 因此可以多次创建相同的sequence节点, 而得到不同的节点
    1. 计数器是由父节点控制, 直接对下级节点生效
    2. 每个父节点都会负责维护其子节点创建的先后顺序,并且如果创建的是顺序节点(SEQUENTIAL)的话,父节点会自动为这个节点分配一个整形数值,以后缀的形式自动追加到节点名中,作为这个节点最终的节点名。

sessions

client通过TCP连接到单个server,通过该连接发送请求,获取响应,获取监视事件以及发送心跳,当该TCP连接断开后,client会自动连接到其他server

ZK Client通过ZooKeeper提供的client binding 代码(官方提供:C/Java两种Client API)创建一个handle来和ZooKeeper服务建立Session连接。创建一个handle进行连接后,client会处于CONNECTING状态,然后client library会进行尝试对ZK服务集群中的server发起连接,成功后client会置为CONNECTED状态。当发生不可恢复的错误,例如会话过期,鉴权失败,或者client主动进行关闭,handle会切换为CLOSED状态

当client session state从CONNECTED由于disconnected事件变成CONNECTING后,不建议创建新的session对象进行连接,因为ZK client library会自动进行重连,特别ZK client lib中内置了一些启发式方法来处理“羊群效应”之类的事情。在使用过程中,仅需要在收到会话到期通知时进行新会话的创建???(这里要看client的实现)

watch

客户端可以在znodes上设置监听,ZooKeeper中所有的read操作:getData(),getChildren()和exists(),都提供了参数来设置watch。关于watch的定义:watch事件是一个一次性的触发器,当watch的Znode发生变更的时候,ZooKeeper会向客户端发送通知

watch三个特性:

warning. 由于watch的一次性触发特性,在获取watch event和发送新的请求来再次进行znode的监听之间是有延迟的,所以这中间ZNode可能发生了多次变化,但client不会有watch event的通知.

羊群效应

注册监听, 来做分布式锁. 普通的方法是在 parent znode上注册监听, 当parent znode下的字节点发生变更, 就判断watcher者是否是最小的节点, 以此来做抢锁. 这个方法的问题在, 绝大多数情况下, watch到的事件都是无效的(自己并不是最小的). 这个在集群规模大的时候, 引发羊群效应(Herd Effect). 解决方案是使用exist, 只注册在比自己小一位的那个节点上, 只有这个节点发生变更才会有watch.

reference

ZooKeeper的基本介绍
zookeeper分布式锁避免羊群效应(Herd Effect)

上一篇 下一篇

猜你喜欢

热点阅读