`
sealbird
  • 浏览: 571406 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ZooKeeper使用常见问

zk 
阅读更多
from http://code.taobao.org/p/taokeeper/wiki/index/faq/

ZooKeeper使用常见问题 返回TaoKeeper
客户端
1. 客户端对ServerList的轮询机制是什么
随机,客户端在初始化( new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) )的过程中,将所有Server保存在一个List中,然后随机打散,形成一个环。之后从0号位开始一个一个使用。两个注意点:1. Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。(比如: 192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181). 2. 如果客户端在进行Server切换过程中耗时过长,那么将会收到SESSION_EXPIRED. 这也是上面第1点中的加大风险之处。

2.客户端如何正确处理CONNECTIONLOSS(连接断开) 和 SESSIONEXPIRED(Session 过期)两类连接异常
在ZooKeeper中,服务器和客户端之间维持的是一个长连接,在 SESSION_TIMEOUT 时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送heart_beat),服务器重置下次SESSION_TIMEOUT时间。因此,在正常情况下,Session一直有效,并且zk集群所有机器上都保存这个Session信息。在出现问题情况下,客户端与服务器之间连接断了(客户端所连接的那台zk机器挂了,或是其它原因的网络闪断)这个时候客户端会主动在地址列表(初始化的时候传入构造方法的那个参数connectString)中选择新的地址进行连接。 好了,上面基本就是服务器与客户端之间维持长连接的过程了。在这个过程中,用户可能会看到两类客异常CONNECTIONLOSS(连接断开) 和SESSIONEXPIRED(Session 过期)。

CONNECTIONLOSS发生在上面红色文字部分,应用在进行操作A时,发生了CONNECTIONLOSS,此时用户不需要关心我的会话是否可用,应用所要做的就是等待客户端帮我们自动连接上新的zk机器,一旦成功连接上新的zk机器后,确认刚刚的操作A是否执行成功了。

SESSIONEXPIRED发生在上面蓝色文字部分,这个通常是zk客户端与服务器的连接断了,试图连接上新的zk机器,这个过程如果耗时过长,超过 SESSION_TIMEOUT 后还没有成功连接上服务器,那么服务器认为这个session已经结束了(服务器无法确认是因为其它异常原因还是客户端主动结束会话),开始清除和这个会话有关的信息,包括这个会话创建的临时节点和注册的Watcher。在这之后,客户端重新连接上了服务器在,但是很不幸,服务器会告诉客户端SESSIONEXPIRED。此时客户端要做的事情就看应用的复杂情况了,总之,要重新实例zookeeper对象,重新操作所有临时数据(包括临时节点和注册Watcher)。

3. 不同的客户端对同一个节点是否能获取相同的数据
4. 一个客户端修改了某个节点的数据,其它客户端能够马上获取到这个最新数据吗
ZooKeeper不能确保任何客户端能够获取(即Read Request)到一样的数据,除非客户端自己要求:方法是客户端在获取数据之前调用 org.apache.zookeeper.AsyncCallback.VoidCallback, java.lang.Object) sync.

通常情况下(这里所说的通常情况满足:1. 对获取的数据是否是最新版本不敏感,2. 一个客户端修改了数据,其它客户端需要不需要立即能够获取最新),可以不关心这点。

在其它情况下,最清晰的场景是这样:ZK客户端A对 /my_test 的内容从 v1->v2, 但是ZK客户端B对 /my_test 的内容获取,依然得到的是 v1. 请注意,这个是实际存在的现象,当然延时很短。解决的方法是客户端B先调用 sync(), 再调用 getData().

5. ZK为什么不提供一个永久性的Watcher注册机制
不支持用持久Watcher的原因很简单,ZK无法保证性能。

6.使用watch需要注意的几点
1.Watches通知是一次性的,必须重复注册.
2.发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。
3.节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。
4.对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。
5.同一个zk客户端对某一个节点注册相同的watch,只会收到一次通知。即:
for( int i = 0; i < 3; i++ ){

zk.getData( path, true, null ); zk.getChildren( path, true );

}

7.我能否收到每次节点变化的通知
如果节点数据的更新频率很高的话,不能。

&nbsp;原因在于:当一次数据修改,通知客户端,客户端再次注册watch,在这个过程中,可能数据已经发生了许多次数据修改,因此,千万不要做这样的测试:"数据被修改了n次,一定会收到n次通知"来测试server是否正常工作。(我曾经就做过这样的傻事,发现Server一直工作不正常?其实不是)。即使你使用了GitHub上 这个客户端也一样。

8.能为临时节点创建子节点吗
不能。

9. 是否可以拒绝单个IP对ZK的访问,操作
ZK本身不提供这样的功能,它仅仅提供了对单个IP的连接数的限制。你可以通过修改iptables来实现对单个ip的限制,当然,你也可以通过 这样的方式来解决。

10. 在 getChildren(String path, boolean watch)是注册了对节点子节点的变化,那么子节点的子节点变化能通知吗
不能


11.创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut

服务器
分享到:
评论

相关推荐

    zookeeper常见面试题

    zookeeper常见面试题,zk都有哪些使用场景?一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

    Zookeeper kafka安装常见错误

    Zookeeper kafka安装常见错误及处理

    ZooKeeper常见29道面试题及答案.docx

    zookeeper常见面试题,zk都有哪些使用场景?一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

    Zookeeper学习中的疑难问题总结,很受用!

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和...

    zookeeper常见应用场景简单实现及ppt

    1、master选举:mastersel 2、数据的发布和订阅:subscribe 3、负载均衡:balance 4、分布式锁:lock 5、分布式队列:queue 6、命名服务:nameservice 演示代码下载(代码来自极客学院演示demo):

    Zookeeper面试题.pdf

    没啥好介绍的,Zookeeper常见面试题,懂的,有这方面需求的可以拿去练习.纯小白就没必要了.就这样吧

    分布式服务框架zookeeper 3.4.13版本

    分布式服务框架zookeeper 3.4.13版本,主要用于构建RPC服务与常见集群等。

    CentOs7.4配置zookeeper集群

    CentOs7.4配置zookeeper集群,详细配置服务、启动服务、查看服务状态、以及常见启动失败问题。

    thrift-zookeeper-rpc

    对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端...常见的负载均衡的基本算法。

    zookeeper-3.5.4-beta.tar

    通过提供一个简单的接口,ZooKeeper 允许开发人员在分布式环境中实现常见的协调任务,如统一命名服务、配置管理、分布式锁等。 版本号中的 3.5.4-beta 表示这是一个测试版(beta 版)的版本,通常用于开发和测试...

    kubernetes-zookeeper:该项目包含有助于在Kubernetes上部署Apache ZooKeeper的工具

    Kubernetes ZooKeeper 该项目包含使用促进在上部署工具。...无论您使用清单还是头盔来部署ZooKeeper集成,都应注意一些常见的管理和配置项。 整体尺寸 如限制部分所述,无法使用最新的稳定版本动态配置ZooKeepe

    Zookeeper集群搭建详细文档

    详细介绍了Zookerper注册中心集群搭建的准备工作以及搭建的详细步骤,并且模拟了集群的一些常见异常,可以使学习Zookeeper的同志们通过阅读本篇文档,能够快速上手对Zookeeper的搭建使用

    zookeeper-master-worker:使用c++同步zookeeper客户端接口的zookeeper master-worker实现

    介绍使用c++同步zookeeper客户端接口的Zookeeper master-worker实现Zookeeper C++ 客户端c++ 客户端实现基于zookeeper c 绑定客户端和boost。 与c-binding客户端相比,增加了一些便利:(1)所有客户端请求同步发送...

    ZooKeeper最新面试题2021年,常见面试题及答案汇总.md

    ZooKeeper最新面试题2021年,常见面试题及答案汇总

    Zookeeper面试题【面试题大整合】+面试专题

    Zookeeper面试题【面试题大整合】+...zookeeper常见面试题,zk都有哪些使用场景?一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

    liantengda#JavaEngineerBooks#ZooKeeper最新面试题2021年,常见面试题及答案汇总1

    1、Zookeeper 下 Server工作状态 2、ZooKeeper定义了几种权限 4、客户端如何获取配置信息 5、会话管理 6、四种类型的数据节点 Zno

    zookeeper面试专题及答案.pdf

    如果您正在准备Java面试,这份 "zookeeper面试专题及...它涵盖了许多常见的zookeeper面试问题,并提供了详细的解释和示例代码,有助于加深您对zookeeper的理解和掌握。当然,还需要结合实践来加深理解和提高技能水平。

    分布式协调工具-ZooKeeper实现动态负载均衡

    阿里巴巴集团开源的分布式服务框架Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表, 点击这里查看Dubbo开源项目。在Dubbo实现中: 服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}...

    ZookeeperJava客户端zkclient.zip

    让Zookeeper API 使用起来更简单 非常方便订阅各种事件并自动重新绑定事件(会话建立、节点修改、节点删除、子节点变更等) session过期自动重连、机制 快速入门 下面部分将引导使用者快速入门。 快速指南: ...

Global site tag (gtag.js) - Google Analytics