基于ZooKeeper构建大规模配置系统
通常大中型互联网公司都拥有较大规模、结构复杂的服务器集群。随着互联网迅速发展,用户访问量以及服务器规模的越来越大,Web应用项目需要部署在数目众多的服务集群上协同工作,才为用户提供更可靠、稳定、优质的互联网服务。
一般在互联网公司发展初期,服务器以及Web应用程序较少,项目的配置信息都会存放在文件中,比如把一些基本的数据库信息、缓存信息配置在文件中,如***.property文件中,每个项目都有自身单独的一份配置文件。这样的结构如下图所示:
随着互联网的快速发展和用户的访问量越来越大,一个Web应用程序必须部署在几十台应用服务器上才能满足当前需求。此时再将项目的配置信息放入文件中,就会带来众多不便,比如:
1、 项目在开发环境、测试环境、正式环境中很多配置信息都不一样,比如数据库配置等。一个项目要维护多个配置信息,以便在项目不同阶段使用。当项目配置越来越多,文件类型的配置则会变得混乱,它缺乏统一管理。
2、 一个Web应用项目会部署在多台机器上,每次更新项目任何一个配置,都需要在不同服务器文件上更新很多次,这样容易出错而且麻烦。
3、 当更新项目的配置时,我们必须要将项目服务关闭,然后修改配置文件中的配置信息,并将项目重新发布,这必然造成一段时间内项目不能对外提供服务,一旦出现任何故障,这个一段时间可能更长。将配置信息放入文件中这样的配置方式不能做到配置信息的动态部署以及自动更新。
在这样的情况下,建立集中式的配置系统就变得非常有必要。它的整体的配置架构图如下:
下面讲述如何快速有效搭建大型互联网集群配置系统,它有如下四个重要的点:
1、 配置信息存储:项目配置信息怎么存放,放在哪里,怎么保证其安全可靠?因为项目配置关系到项目能否启动以及正常运行。一旦配置系统出问题时,公司整个网站都会受到影响。
2、 配置信息请求:当一个Web应用程序启动时,它如何获取到项目的配置?这里可能会涉及到一些程序之间的通信,比如应用和配置服务器的通信等。简单来说,Web项目启动时需要向集群配置系统发送远程请求,获取项目启动的配置信息。
3、 配置信息监听:当项目某些配置信息修改时,配置系统如何通知到应用这些配置的项目,项目接收到配置修改的通知后,项目会做一些动态修改。如何进行监听配置的动态修改,以及根据配置修改项目能做出配置的动态更新?
4、 终端统一控制:集群配置系统最终要给出一个集中的Web控制终端来管理这些配置,包含配置信息增加、删除、修改、查询、部署等等。
解决了上面的四个问题,您就可以自己搭建了一套集群配置系统。如果有足够的人力资源、技术资源,您可以写一套分布式的存储来解决配置信息的集中式存储。您也可以写一套通信协议、或者在现有的通信协议上做一些封装来解决获取项目配置、以及监听修改配置的问题。最后您可以用您熟悉的语言来写一套配置终端。但当您没有那么多资源和时间时,也许如下的解决方案是个不错的选择,它能帮助你在很短的时间内搭建一套可靠的分布式配置系统。
集群配置系统会应用到一个成熟的分布式服务开源框架—ZooKeeper。它是Apache Hadoop的一个子项目,它主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储。除了数据存储,它还可以用来维护和监控你存储的数据的状态变化。从设计模式角度来看,Zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知那些已经注册的观察者做出相应的反应。ZooKeeper典型集群配置应用如下图:
正如上图所示ZooKeeper帮我们解决上面四个问题中的三个。具体如下:ZooKeeper Server可以集中式存放数据,存放于上图的Configuration目录下,它有效解决了配置信息的集中式存储,同时ZooKeeper的工作模式是集群模式,一定程度上解决了配置系统的可靠性、安全性。ZooKeeper在java、ruby、C++都有自己线程的客户端Client。这些客户端负责和ZooKeeper Server进行通信,Client在应用程序启动时候向Server发送请求获取项目的配置信息,同时它还能监听这些配置信息的变化。当配置信息变化时候,项目会根据配置变化有一些自定义的操作,比如数据库重新连接,项目重新启动等等。所以ZooKeeper帮我们解决了第1、2、3个问题。最终我们只需要开发出一套配合集群配置系统运行的统一控制终端就可以了。统一控制终端可以是个B/S的管理类Web应用程序。
下面以Java项目为例,应用ZooKeeper的整个集群配置系统结构图如下:
如上图所示,ZooKeeper集群配置可以参考ZooKeeper开源文档来搭建,ZooKeeper集群由几台Server组成,Server中存放配置数据,集群的工作模式确保了数据的安全可靠。具体Java 应用程序可以通过ZooKeeperClient和ZooKeeper集群进行通信,获取项目的配置信息,同时监控配置变化。控制终端可能是简单的管理界面,在这个终端上管理着所有的项目配置。项目可能包括几个开发环境,因为在不同阶段搭建的配置是不同的。同时控制终端还将这些配置记录在本地数据库,以作备份。用户在控制终端上操作项目具体配置,包括增加、修改、删除等等。