设为首页 收藏本站
查看: 864|回复: 0

[经验分享] ZooKeeper FAQ

[复制链接]

尚未签到

发表于 2019-1-8 09:20:16 | 显示全部楼层 |阅读模式
  这段时间来,也在和公司里的一些同学交流使用zk的心得,整理了一些常见的zookeeper问题。这个页面的目标是解答一些zk常见的使用问题,同时也让大家明确zk不能干什么。页面会一直更新。
客户端
  1.客户端对ServerList的轮询机制是什么
随机,客户端在初始化(newZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher))的过程中,将所有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点中的加大风险之处。更多关于客户端地址列表相关的,请查看文章《ZooKeeper客户端地址列表的随机原理》
  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不能确保任何客户端能够获取(即ReadRequest)到一样的数据,除非客户端自己要求:方法是客户端在获取数据之前调用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需要注意的几点
  a.Watches通知是一次性的,必须重复注册.
b.发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。
c.节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。
d.对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。
e.同一个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的限制,当然,你也可以通过这样的方式来解决。https://issues.apache.org/jira/browse/ZOOKEEPER-1320
  10.在getChildren(Stringpath,booleanwatch)是注册了对节点子节点的变化,那么子节点的子节点变化能通知吗
  不能
  11.创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
  连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut
  12.zookeeper是否支持动态进行机器扩容?如果目前不支持,那么要如何扩容呢?
  截止2012-03-15,3.4.3版本的zookeeper,还不支持这个功能,在3.5.0版本开始,支持动态加机器了,期待下吧:https://issues.apache.org/jira/browse/ZOOKEEPER-107
  13.zookeeper是否会自动进行日志清理?如果进行日志清理?
  zk自己不会进行日志清理,需要运维人员进行日志清理,详细关于zk的日志清理,可以查看《ZooKeeper日志清理》




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660592-1-1.html 上篇帖子: zookeeper watches 下篇帖子: 客户端操作zookeeper服务代码示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表