Zookeeper功能以及工作原理详解

         ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护域名服务分布式同步组服务等。

一、 特点

zookeeper特点

二、zookeeper投票机制

         zookeeper集群中可以有多个zookeeper server,其中会有一个leader server,其他的都是follower server,当然,leader server也是通过投票选出来的,当票数过半是就可以通过,如果只有一个zookeeper的话,那这个zookeeper就是leader server。client发起的请求(增删改操作,查询操作是由server直接返回,不需要投票)也是通过这种投票机制得到响应的。
在这里插入图片描述

三、zookeeper的个数

         一般zookeeper的个数要是奇数,偶数个也是可以的,但没必要。

         1、容错:例如,搭建3个和搭建4个zookeeper集群,此时如果要通过client发起的请求,那么3个zookeeper的集群要2票就能通过,那么这个集群就允许一台zookeeper挂掉;而4台zookeeper的集群就要3票才能通过,那么集群也只允许挂一台。既然都允许挂掉一台,那么就显得4台zookeeper就显得浪费了。

         2、splite-brain(脑裂):当集群分裂了成了两个集群,那么就容易出现这个问题,同样以3台和4台为例。当集群为3台时,可能会被分成1台和2台,那么此时2台的集群投票选出leader server时,就可以以2(超过半数)方式选出一个leader server;当集群为4台时,如果被分成了1台和3台是可以的,但如果被分成了2台和2台,那么无论怎么投票都无法选出一个leader server,就会出现所有的client的请求都被接受了,但无法给出响应。

四、Znode

         ZooKeeper 将所有数据存储在内存中,数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode,例如/baidu/yun。每个上都会保存自己的数据内容,同时还会保存一系列属性信息。
在这里插入图片描述

         在 Zookeeper 中,Node 可以分为持久节点临时节点两类。所谓持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 ZooKeeper 上。而临时节点就不一样了,它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。

         另外,ZooKeeper 还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL。一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper 会自动在其节点名后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字

有四种类型的znode:

  1. PERSISTENT-持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在

  2. PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

  3. EPHEMERAL-临时目录节点
    客户端与zookeeper断开连接后,该节点被删除

  4. EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

五、事件监听Watcher

         Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反应:
         可以设置观察的操作:exists,getChildren,getData
         可以触发观察的操作:create,delete,setData

ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:
                  - 客户端注册 Watcher
                  - 服务器处理 Watcher
                  - 客户端回调 Watcher

ZooKeeper 的 Watcher 具有以下几个特性:

1、一次性

  • 无论是服务端还是客户端,一旦一个 Watcher 被触发,ZooKeeper 都会将其从相应的存储中移除
  • 因此,在 Watcher 的使用上,需要反复注册。这样的设计有效地减轻了服务端的压力。

2、客户端串行执行

  • 客户端 Watcher 回调的过程是一个串行同步的过程,这为我们保证了顺序
    同时,需要注意的一点是,一定不能因为一个 Watcher 的处理逻辑影响了整个客户端的 Watcher 回调,
  • 所以,我觉得客户端 Watcher 的实现类要另开一个线程进行处理业务逻辑,以便给其他的 Watcher 调用让出时间。

3、轻量级

  • WatchedEvent 是最小通知单元仅仅包括:通知状态、事件类型、节点路径仅仅通知客户端发生了事件,不会带事件具体内容,具体内容需要客户端再次请求获取
  • 客户端向服务端传递的也不是watcher 对象,使用Boolean类型标记属性,服务端保存当前连接的ServerCnxn。

六、ZooKeeper服务中操作

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值