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.我能否收到每次节点变化的通知
如果节点数据的更新频率很高的话,不能。
原因在于:当一次数据修改,通知客户端,客户端再次注册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 的使用场景 1. 分布式协调:ZooKeeper 可以实现分布式系统之间的协调工作,例如,在分布式系统中,A 系统发送请求到消息队列,然后 B 系统消费消息...
数据发布与订阅是一种常见的配置管理方式,即将数据发布到ZooKeeper的节点上,让订阅者能够动态地获取这些数据,实现配置信息的集中管理和动态更新。 **使用方法**: - **索引信息和集群状态**:将索引信息或集群中...
它可能还包含一些最佳实践和常见问题解答,帮助读者在实际项目中顺利应用Zookeeper。 通过学习和理解这些知识点,开发者和系统管理员能够更好地掌握Zookeeper的使用,从而在分布式系统中实现高效、可靠的协调和管理...
2. Curator:Curator 是由 Netflix 开发并贡献给 Apache 的 ZooKeeper 客户端库,它提供了一套高级API,使得开发者能够更方便地处理 ZooKeeper 中常见的任务,例如创建、删除节点、设置/获取节点数据,以及实现...
1. **分布式协调服务**:Zookeeper 可以用来解决分布式系统中的许多常见问题,例如负载均衡、故障恢复等。 2. **消息队列管理**:利用 Zookeeper 的通知机制可以构建可靠的消息队列系统。 3. **服务发现**:...
这个版本的发布对于理解和使用Zookeeper至关重要,因为它包含了该框架的稳定性和功能增强。 在描述“注册中心 zookeeper-3.4.6”中,关键词“注册中心”揭示了Zookeeper在分布式系统中的核心作用。它作为一个中心化...
在解决Zookeeper使用中的常见问题时,例如关于Zookeeper init函数的使用、session失效问题、watcher设置和获取等,都需要对Zookeeper内部工作原理和API有充分的了解。在进行Zookeeper安装和配置时,应该参考官方文档...
#### ZooKeeper 使用常见问题 - **连接问题** - 确认服务器是否运行正常。 - 检查配置文件中的地址是否正确。 - **监视未触发** - 确保监视已被正确设置。 - 检查网络连接稳定性。 - **数据不一致** - 确认...
常见的Zookeeper可视化工具 - **ZooInspector**:由Apache官方提供的轻量级工具,集成在Zookeeper的客户端中,提供了基本的节点浏览和数据编辑功能。 - **ZKAdmin**:一个开源的Zookeeper管理工具,功能较全面,...
它可以用来实现分布式锁,例如使用 Redis 来设计分布式锁,使用 ZooKeeper 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? ZooKeeper 的这种设计方式可以带来高效的分布式锁实现。
Linux 集群搭建是 ZooKeeper 的一种常见应用场景,本文将详细介绍 ZooKeeper Linux 集群搭建流程。 准备前提 在开始搭建 ZooKeeper 集群之前,需要提前在本地安装好 JDK,因为 ZooKeeper 是用 Java 编写的,需要...
对于开发者来说,理解ZooKeeper的API和最佳实践也至关重要,如何正确地创建、更新和删除Znode,以及如何设置和使用Watchers,都是实际开发中必须掌握的技能。 总的来说,《ZooKeeper:分布式过程协同技术详解》和...
以下是一些常见的错误及其处理方法。 首先,当安装Zookeeper与Kafka时,一个可能遇到的问题是两者之间的通信异常。Zookeeper是Kafka集群的基石,它用于协调各个节点的状态和选举领导节点。如果Zookeeper配置不正确...
Zookeeper的数据模型是一棵层次化的命名空间,类似于常见的文件系统。在这个层次化的结构中,每个节点被称为“znode”,每个znode可以存储数据,具有唯一的路径标识。Zookeeper的关键特性之一是它使用watch机制,...
6. **命令行模拟**: 提供类似Zookeeper命令行的交互界面,可以执行常见的Zookeeper命令,如`ls`, `get`, `set`等。 **源码分析** 对于开发者来说,深入理解Zookeeper管理工具的源码可以帮助我们更好地定制和优化...
使用Curator可以使ZooKeeper的使用更加便捷和稳定。 7. **ZkClient应用**:ZkClient是另一个常用的ZooKeeper客户端,它提供了丰富的API,易于理解和使用。除了基本的ZNode操作,还支持异步调用、事件监听等功能,...
通过这些基础功能,ZooKeeper能够帮助开发者解决一系列分布式系统中常见的问题,例如一致性保证、组管理、Leader选举等。 **1.1 命名服务(Naming Service)** 命名服务是指在分布式环境中为资源和服务提供统一的...
Zookeeper使用递增的事务ID (zxid) 来保证事务的顺序一致性。zxid是一个64位整数,其中高32位表示Leader的周期,低32位表示事务编号。 #### 三、Zookeeper 的节点类型 Zookeeper支持四种类型的节点(ZNode): - **...
本文将深入探讨Zookeeper 3.4.12在Linux环境下的安装、配置、使用以及常见问题的解决。 一、Zookeeper的简介与作用 Zookeeper作为一个高可用的分布式服务框架,主要用于实现分布式应用程序的数据共享、配置管理、...
分布式锁是ZooKeeper的一个常见应用场景,通过创建和删除ZNode来实现锁机制。主要有两种方式: 1. **顺序节点**:客户端创建临时顺序节点,根据节点名称的顺序判断锁的获取。通常,最小序号的节点持有锁。 2. **监视...