`
yixietianxia
  • 浏览: 14078 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Zookeeper常见问题(一)

 
阅读更多

Zookeeper常见问题(转)

 

ZK选举过程

当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法使用ZAB协议:

  1. 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
  2. 选举线程首先向所有Server发起一次询问(包括自己);
  3. 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
  4. 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
  5. 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。

通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数最好是奇数2n+1,且存活的Server的数目不得少于n+1

master/slave之间通信

Storm:定期扫描 
PtBalancer:节点监听

节点变多时,PtBalancer速度变慢

类似问题:根据Netflix的Curator作者所说,ZooKeeper真心不适合做Queue,或者说ZK没有实现一个好的Queue,详细内容可以看 https://cwiki.apache.org/confluence/display/CURATOR/TN4, 
原因有五:

  1. ZK有1MB 的传输限制。 实践中ZNode必须相对较小,而队列包含成千上万的消息,非常的大。
  2. 如果有很多节点,ZK启动时相当的慢。 而使用queue会导致好多ZNode. 你需要显著增大 initLimit 和 syncLimit.
  3. ZNode很大的时候很难清理。Netflix不得不创建了一个专门的程序做这事。
  4. 当很大量的包含成千上万的子节点的ZNode时, ZK的性能变得不好
  5. ZK的数据库完全放在内存中。 大量的Queue意味着会占用很多的内存空间。

尽管如此, Curator还是创建了各种Queue的实现。 如果Queue的数据量不太多,数据量不太大的情况下,酌情考虑,还是可以使用的。

客户端对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点中的加大风险之处。更多关于客户端地址列表相关的,

客户端如何正确处理CONNECTIONLOSS(连接断开) 和 SESSIONEXPIRED(Session 过期)两类连接异常

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

好了,上面基本就是服务器与客户端之间维持长连接的过程了。在这个过程中,用户可能会看到两类异常CONNECTIONLOSS(连接断开) 和SESSIONEXPIRED(Session 过期)。

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

一个客户端修改了某个节点的数据,其它客户端能够马上获取到这个最新数据吗

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().

ZK为什么不提供一个永久性的Watcher注册机制

不支持用持久Watcher的原因很简单,ZK无法保证性能。 
使用watch需要注意的几点

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

我能否收到每次节点变化的通知

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

能为临时节点创建子节点吗

不能。

是否可以拒绝单个IP对ZK的访问,操作

ZK本身不提供这样的功能,它仅仅提供了对单个IP的连接数的限制。你可以通过修改iptables来实现对单个ip的限制,当然,你也可以通过这样的方式来解决。 https://issues.apache.org/jira/browse/ZOOKEEPER-1320

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

不能

创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?

连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut

zookeeper是否支持动态进行机器扩容?如果目前不支持,那么要如何扩容呢?

截止3.4.3版本的zookeeper,还不支持这个功能,在3.5.0版本开始,支持动态加机器了,期待下吧: https://issues.apache.org/jira/browse/ZOOKEEPER-107

ZooKeeper集群中个服务器之间是怎样通信的?

Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有F/O的LearnerHandler。

zookeeper是否会自动进行日志清理?如何进行日志清理?

zk自己不会进行日志清理,需要运维人员进行日志清理

分享到:
评论

相关推荐

    zookeeper常见面试题

    下面是关于 ZooKeeper 的一些常见面试题和知识点。 ZooKeeper 的使用场景 1. 分布式协调:ZooKeeper 可以实现分布式系统之间的协调工作,例如,在分布式系统中,A 系统发送请求到消息队列,然后 B 系统消费消息...

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

    1. **分布式协调服务**:Zookeeper 可以用来解决分布式系统中的许多常见问题,例如负载均衡、故障恢复等。 2. **消息队列管理**:利用 Zookeeper 的通知机制可以构建可靠的消息队列系统。 3. **服务发现**:...

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

    有序性是 Zookeeper 中非常重要的一个特性,所有的更新都是全局有序的,每个更新都有一个唯一的时间戳,这个时间戳称为 zxid(Zookeeper Transaction Id)。而读请求只会相对于更新有序,也就是读请求的返回结果中会...

    zookeeper-3.4.6_zookeeper_

    2. **原子操作**:所有的读写操作都是原子性的,这意味着一次只能执行一个操作,不会出现并发问题,这在分布式环境下尤为重要。 3. **事件通知**:Zookeeper提供watcher机制,允许客户端设置监听某个节点的变化,当...

    zookeeper可视化工具

    常见的Zookeeper可视化工具 - **ZooInspector**:由Apache官方提供的轻量级工具,集成在Zookeeper的客户端中,提供了基本的节点浏览和数据编辑功能。 - **ZKAdmin**:一个开源的Zookeeper管理工具,功能较全面,...

    zookeeper一站式学习资料

    针对学习资源,"国内首部Zookeeper从入门到精通"很可能是系列教程书籍或课程,它会从基础知识开始,逐步介绍Zookeeper的安装配置、API使用、集群搭建以及常见问题的解决。"搜索引擎等一条龙学习资料"可能涵盖了...

    zookeeper linux集群搭建流程

    Linux 集群搭建是 ZooKeeper 的一种常见应用场景,本文将详细介绍 ZooKeeper Linux 集群搭建流程。 准备前提 在开始搭建 ZooKeeper 集群之前,需要提前在本地安装好 JDK,因为 ZooKeeper 是用 Java 编写的,需要...

    ZooKeeper-分布式过程协同技术详解 和从Paxos到Zookeeper

    此外,书中还会涉及ZooKeeper的安装、配置和监控,以及常见问题的排查和优化。对于开发者来说,理解ZooKeeper的API和最佳实践也至关重要,如何正确地创建、更新和删除Znode,以及如何设置和使用Watchers,都是实际...

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

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

    【Zookeeper管理工具】

    Zookeeper是Apache Hadoop项目的一部分,主要用于解决分布式环境中的命名服务、配置管理、集群同步等问题。它是一个分布式数据一致性解决方案,基于发布/订阅模型,可以视为一种分布式协调服务。 在分布式系统中,...

    zookeeper-3.4.6.jar

    Zookeeper的核心功能在于提供命名服务、配置管理、集群同步、分分布式锁和领导者选举等一系列分布式常见问题的解决方案。它的设计目标是简单易用,使得开发者能够快速地构建分布式应用系统。Zookeeper基于类似于文件...

    zookeeper-3.4.12 linux

    本文将深入探讨Zookeeper 3.4.12在Linux环境下的安装、配置、使用以及常见问题的解决。 一、Zookeeper的简介与作用 Zookeeper作为一个高可用的分布式服务框架,主要用于实现分布式应用程序的数据共享、配置管理、...

    Zookeeper kafka安装常见错误

    首先,当安装Zookeeper与Kafka时,一个可能遇到的问题是两者之间的通信异常。Zookeeper是Kafka集群的基石,它用于协调各个节点的状态和选举领导节点。如果Zookeeper配置不正确,Kafka可能无法正确启动或运行。确保在...

    尚硅谷大数据之Zookeeper视频

    在分布式系统中,Zookeeper被广泛用于解决各种常见的分布式一致性问题,如命名服务、配置管理、集群管理、分布式锁、队列管理等。Zookeeper的核心特性包括: - **数据一致性**:无论客户端连接到哪个Server,其看到...

    java中的zookeeper

    分布式锁是ZooKeeper的一个常见应用场景,通过创建和删除ZNode来实现锁机制。主要有两种方式: 1. **顺序节点**:客户端创建临时顺序节点,根据节点名称的顺序判断锁的获取。通常,最小序号的节点持有锁。 2. **监视...

    apache-zookeeper-3.6.3-bin.zip

    Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着分布式操作的进展,同时也提供了命名服务、配置管理、组服务、分布式同步和领导选举等功能。在Windows环境下安装...

Global site tag (gtag.js) - Google Analytics