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

[经验分享] 基于ZooKeeper构建大规模配置系统II

[复制链接]

尚未签到

发表于 2015-9-6 12:36:13 | 显示全部楼层 |阅读模式
  
  上篇博文描述了基于ZooKeeper构建互联网大规模配置系统的基本概念,并对ZooKeeper做了简单的介绍。这里谈谈ZooKeeper的一些关键技术以及用ZooKeeper构建大规模配置系统的细节,最后讲述我们在构建系统过程中的遇到问题及其解决思路,仅作参考,希望对您有所帮助。
  提到zookeeper,我们不得不提起Paoxs算法和LesileLamport。Paoxs算法是zookeeper的灵魂,这个算法是Leslie Lamport在1990年提出的一种基于消息传递的一致性算法。Paxos 算法解决的问题是一个分布式系统就某个值达成一致。典型的场景就决定zookeeper中的leader。算法具体可参见http://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95  
  集中式的配置管理在应用集群中是非常常见的,一般公司都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。应用Zookeeper很容易实现这种集中式的配置管理,比如将APP1的所有配置配置到/APP1这个节点下,APP1所有机器一启动就对/APP1这个节点进行监控,并且实现回调方法Watcher,那么在zookeeper上/APP1下节点数据发生变化的时候,每个Client机器都会收到通知,Watcher方法将会被执行。以上这个例子只是简单的粗颗粒度配置监控,细颗粒度的数据可以进行分层级监控,这一切都是可以设计和控制。它的具体示例图如下:
  

DSC0000.gif          如图中/APP1目录下就项目APP1所有配置的信息,每个配置都是一个节点。Watch就是应用ZooKeeper来监控APP1节点数据变化。Watch可以理解为一个分布式的回调,当client关心的节点发生变化时,zookeeper将会把消息传回到client,并导致client的消息处理函数得到调用。zk的任何一个读操作都能够设置watch,例如:getData(),getChildren(), exists()
  可以watch的event包括如下的二种:
  n  KeeperState:Disconnected、SyncConnected、Expired
  n  EventType:None、NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChanged
  Zookeeper的使用主要是通过创建其jar包下的Zookeeper实例,并且调用其接口方法进行的,主要的操作就是对节点的增、删、改操作,监听数据节点的变化以及处理。它的简单示例如下图所示:
DSC0001.gif

  上面对ZooKeeper的一些基本常识以及基本编程方法,下面谈谈我们在搭建集群配置系统中遇到的两个主要问题,以及它的解决思路。
  问题1:ZooKeeper的session超时问题。
  超时问题是任何分布式应用程序都需要考虑到的问题,ZooKeeper也不例外。由于网络中断一段时间,当它自动恢复过来时候,如果这段时间大于设置的Session超时时间,此时就会产生超时异常。ZooKeeper客户端和服务器是基于长连接的方式,并用心跳保持连接,一旦遇到超时问题,这个连接就无效了。一般解决思路大致有如下三种:
  l  在程序中显式用try和Catch主动获取超时异常,然后将客户端和服务器重新连接,前提是在您应用程序中要缓存一些重新连接需要的属性。
  l  在程序中启动一个后台线程和ZooKeeper服务器进行通信,这个线程可以做数据的同步,同时也起到一个心跳作用。当检查到超时异常,程序重新连接ZooKeeperServer。
  l  最优雅的一种方式,监控ZooKeeper最上层的父节点,当遇到超时异常时,此Watch的回调方法的参数event的属性KeepState包括了Expired,也就是超时异常,在此你可以重新连接服务器。
  问题2:ZooKeeper和应用程序数据同步问题。
  ZooKeeper会协调应用程序的配置的一致性。但是应用程序是否需要始终需要获取配置的最新信息呢?显然不是。一个程序对外提供服务,它可能部署在10台机器上。当它有了新版本更新时,它的一些配置需要重新修改。项目版本更新时,总是先停掉部分机器,一批批的进行版本更新。如果项目始终获取的最新的配置信息时候,一些老版本项目会获取最新配置导致运行出错。这样的思路一般解决思路有如下:
  l  ZooKeeper是的节点是带版本信息,项目一个版本可以和节点的一个版本进行对应。
  l  将修改配置分为两种情况:修改ZooKeeper服务器配置,但是客户端已经运行配置不做修改;在修改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-110131-1-1.html 上篇帖子: zookeeper启动过程-粗略梳理 下篇帖子: ZooKeeper 3.5.0 分布式配置问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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