当前位置: 首页 > 分布式系统 > 正文

基于ZooKeeper的配置动态发布系统(二)

关键字:
1 星2 星3 星4 星5 星 (1 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

集中式的配置系统在应用集群中是非常常见的,它可以满足不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。它包括配置的动态部署和服务动态发布。

配置动态部署:应用程序很多配置在运行时候能动态改变其配置的值。配置动态部署可以细化到具体的某一台机器,仅仅改变这个一台机器的配置,其他集群中机器的配置并不改变。配置动态部署不需要重新启动项目应用程序,也不需要进行修改配置文件等等。动态配置作用很多:比如一旦线上环境出现问题,动态修改配置使程序就以其它的方式运行。

服务动态发布:现在互联网程序一般都是Web应用程序和后台的Service程序组成,Web程序需要调用Service的服务。运行在后台的Service可能由于Web应用程序访问压力过大,需要新增Service机器。服务动态发布使得新增Service的机器并不需要改变Web应用程序,它就能为Web应用程序提供服务。服务动态发布还包括修改动态修改机器的权重(机器之间的性能可能有差异)。具体的实现方案也和动态配置类似,应用程序中一个服务的地址也会对应到一个配置信息,当修改了服务配置,配置中心通知到应用这些配置的Web应用程序。当遇到节假日或者其他一些事件,网站访问量变大、服务器压力变大时,横向扩展多台Service机器能一定程序解决问题。当访问量下降时候,可以将多余机器切换出去,做其他的事情,以用来节约成本。

我们在构建配置管理系统时,使用了Zookeeper来作为核心中心。应用ZooKeeper,我们将将APP1的所有的配置信息部署到/APP1这个节点下,APP1所有机器一启动就对/APP1这个节点进行监控,并且注册回调方法Watcher,那么在Zookeeper上/APP1下节点数据发生变化的时候,每个Client机器都会收到通知,Watcher方法将会被执行。以上这个例子只是简单的粗颗粒度配置监控,细颗粒度的数据可以进行分层级监控,这一切都是可以设计和控制。它的具体结构图如下:
01
01.配置系统结构图

项目配置的动态部署流程图如下:
02
02.配置动态发布流程图

如图中/APP1目录下就项目APP1所有配置的信息,每个配置都是一个节点。Watch就是应用ZooKeeper来监控APP1节点数据变化。Watch可以理解为一个分布式的回调,当client关心的节点发生变化时,zookeeper将会把消息传回到client,并导致client的消息处理函数得到调用,最后客户端仍然需要重新设置监听器。ZooKeeper的任何一个读操作都能够设置watch,例如:getData(), getChildren(), exists()
可以watch的event包括如下的二种:
 KeeperState:Disconnected、SyncConnected、Expired
 EventType:None、NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChanged

下面讲述下在构建配置系统遇到的一些问题,仅做参考!

问题1:ZooKeeper的session超时问题。
超时问题是任何分布式应用程序都需要考虑到的问题,ZooKeeper也不例外。由于网络中断一段时间,当它自动恢复过来时候,如果这段时间大于设置的Session超时时间,此时就会产生超时异常。ZooKeeper客户端和服务器是基于长连接的方式,并用心跳保持连接,一旦遇到超时问题,这个连接就无效了。一般解决思路大致有如下三种:

 在程序中显式用try和Catch主动获取超时异常,然后将客户端和服务器重新连接,前提是在您应用程序中要缓存一些重新连接需要的属性。
 在程序中启动一个后台线程和ZooKeeper服务器进行通信,这个线程可以做数据的同步,同时也起到一个心跳作用。当检查到超时异常,程序重新连接ZooKeeper Server。
 最优雅的一种方式,监控ZooKeeper最上层root节点,当遇到超时异常时,此Watch的回调方法的参数event的属性KeepState包括了Expired,也就是超时异常,在此你可以重新连接服务器。

问题2:ZooKeeper和应用程序数据同步问题。

ZooKeeper会协调应用程序的配置的一致性。但是应用程序是否需要始终需要获取配置的最新信息呢?显然不是。一个程序对外提供服务,它可能部署在10台机器上。当它有了新版本更新时,它的一些配置需要重新修改。当项目版本更新时,总是先停掉部分机器,一批批的进行版本更新。如果项目始终获取的最新的配置信息时候,一些老版本项目会获取最新配置导致运行出错。这样的思路一般解决思路有如下:

 ZooKeeper是的节点是可以带版本信息,项目一个版本可以和节点的一个版本进行对应。
 将修改配置分为两种情况:修改ZooKeeper服务器配置,但是客户端已经运行配置不做修改;在修改ZooKeeper服务器配置,同时修改客户端的配置。这样您需要自己在程序中设定开关,是不是修改应用程序的配置值,可以通过标志位来实现。

本文固定链接: http://www.chepoo.com/zookeeper-based-dynamic-publishing-system-configuration-2.html | IT技术精华网

基于ZooKeeper的配置动态发布系统(二):等您坐沙发呢!

发表评论