使用ZooKeeper实现配置同步

前言

应用项目中都会有一些配置信息,这些配置信息数据量少,一般会保存到内存、文件或者数据库,有时候需要动态更新。当需要在多个应用服务器中修改这些配置文件时,需要做到快速、简单、不停止应用服务器的方式修改并同步配置信息到所有应用中去。本篇文章就是介绍如何使用ZooKeeper来实现配置的动态同步。

ZooKeeper

在《hive Driver类运行过程》一文中可以看到hive为了支持并发访问引入了ZooKeeper来实现分布式锁。参考《ZooKeeper典型应用场景一览》一文,ZooKeeper还可以用作其他用途,例如:

  • 数据发布与订阅(配置中心)
  • 负载均衡
  • 命名服务(Naming Service)
  • 分布式通知/协调
  • 集群管理与Master选举
  • 分布式锁
  • 分布式队列

一些在线系统在运行中,需要在不停止程序的情况下能够动态调整某一个变量的值并且能够及时生效。特别是当部署了多台应用服务器的时候,需要能够做到在一台机器上修改配置文件,然后在同步到所有应用服务器。这时候使用ZooKeeper来实现就很合适了。

数据发布与订阅

发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。

使用ZooKeeper的发布与订阅模型,可以将应用中用到的一些配置信息放到ZK上进行集中管理。这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。这样的场景适合数据量很小,但是数据更新可能会比较快的需求。

配置存储方案

配置文件通常有如下几种保存方式:

  1. 将配置信息保存在程序代码中 这种方案简单,但每次修改配置都要重新编译、部署应用程序。显然这种方案很不方便,也不可靠,更无法做到修改的实时生效。
  2. 将配置信息保存在xml文件或者属性文件中 在参数信息保存在xml或者属性文件中,当需要修改参数时,直接修改 xml 文件。这样无需重新编译,只需重新部署修改的文件即可。但然后对所有的应用进行重新部署。这样做的缺点显而易见,要往上百台机器上重新部署应用,简直是一个噩梦。同时该方案还有一个缺点,就是配置修改无法做到实时生效。修改后往往过一段时间才能生效。
  3. 将配置信息保存在数据库中 当需要修改参数时,直接修改数据库,然后重启分布式应用程序,或者刷新分布式应用的缓存。尽管这种做法比以上两种方案简单,但却面临着单点失效问题。如果数据库服务器停机,则分布式应用程序的配置信息将无法更新。另外这种方案的配置修改生效实时性虽然比第二种方案好些,但仍然不能达到某些情况下的要求。

基于ZooKeeper的配置信息同步方案

如果使用ZooKeeper来实现,就可以直接把配置信息保存到ZooKeeper中,或者把属性文件内容保存到ZooKeeper中,当属性文件内容发生变化时,就通知监听者如应用程序去重新读取配置文件。

在网上搜索了一下,很能找到好用的现成的代码实现。有的基于ZooKeeper来扩张jdk的hashmap来存储配置参数,如:使用ZooKeeper实现静态数据中心化配置管理,也有人直接实现了一个基于java并发框架的工具包,如:menagerie



注意:以下部分文字和图来自:基于ZooKeeper的配置信息存储方案的设计与实现1.pdf

基于ZooKeeper的特性,借助ZooKeeper可以实现一个可靠的、简单的、修改配置能够实时生效的配置信息存储方案,整体的设计方案如图:

整个配置信息存储方案由三部分组成:ZooKeeper服务器集群、配置管理程序、分布式应用程序。

ZooKeeper服务器集群存储配置信息,在服务器上创建一个保存数据的节点(创建节点操作);配置管理程序提供一个配置管理的UI界面或者命令行方式,用户通过配置界面修改ZooKeeper服务器节点上配置信息(设置节点数据操作);分布式应用连接到ZooKeeper集群上(创建ZooKeeper客户端操作),监听配置信息的变化(使用获取节点数据操作,并注册一个watcher)。

当配置信息发生变化时,分布式应用会更新程序中使用配置信息。

源代码

找到一个淘宝工程师写的实现方式, 代码见:zkpublisher

优点

借助 ZooKeeper我们实现的配置信息存储方案具有的优点如下:

  1. 简单。尽管前期搭建ZooKeeper服务器集群较为麻烦,但是实现该方案后,修改配置整个过程变得简单很多。用户只要修改配置,无需进行其他任何操作,配置自动生效。
  2. 可靠。ZooKeeper服务集群具有无单点失效的特性,使整个系统更加可靠。即使ZooKeeper 集群中的一台机器失效,也不会影响整体服务,更不会影响分布式应用配置信息的更新。
  3. 实时。ZooKeeper的数据更新通知机制,可以在数据发生变化后,立即通知给分布式应用程序,具有很强的变化响应能力。

总结

本文参考了网上的一些文章,给出了基于ZooKeeper的配置信息同步方案,解决了传统配置信息同步方案的缺点如实时性差、可靠性差、复杂等。

时间: 2025-01-07 16:07:44

使用ZooKeeper实现配置同步的相关文章

Dubbo的Zookeeper单机配置和Zookeeper集群配置

Zookeeper单机配置:方式一. <dubbo:registry address="zookeeper://10.20.153.10:2181"/> 方式二. <dubbo:registry protocol="zookeeper" address="10.20.153.10:2181"/> Zookeeper集群配置: 方式一. <dubbo:registry address="zookeeper:/

kafka+zookeeper环境配置(Mac 或者 linux环境)

一.zookeeper下载与安装 1)下载 adeMacBook-Pro:zookeeper_soft apple$ wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 2)解压 tar zxvf zookeeper-3.4.6.tar.gz 3)配置 cd zookeeper-3.4.6 cp -rf conf/zoo_sample.cfg conf/zoo.cfg vim z

简单快速ZooKeeper搭建配置

一.单机模式 1.配置JDK环境,略过. 2.获取及下载zookeeper 下载地址:http://mirror.bit.edu.cn/apache/zookeeper/stable/ ,  代码如下 复制代码 #wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz #tar zxvf zookeeper-3.4.6.tar.gz -C /usr/local #cd /usr/l

hbase:用于实现版本文件及配置同步的两个shell脚本

复制master节点上的版本内容到所有slaves节点上 注意:     1:版本目录做了软链接,如 ln -s hbase-0.94.6 hbase     2: 要根据实际情况,将/usr/local/修改为hbase所在的目录 #!/bin/bash # copy a new release of HBase from the masternode to all slave nodes # Rsyncs HBase files across all slaves. Must run on

Hadoop学习之ZooKeeper理论知识和集群安装配置

ZooKeeper集群安装配置和理论知识 1.   简介:zookeeper是Google的Chubby的一个开源实现,是hadoop的分布式协调服务 2.    Zookeeper(简称zk)包含一个简单的原语集,分布式应用程序可以给予它实现同步服务,配置维护和命名服务等 3.    Zk的设计目标 a)      简单化:通过共享体系的,命名空间进行协调,与文件系统相似,有一些数据寄存器组成,被称为Znode.Zk的数据是放在内存中的,zk可以达到高吞吐量.低延迟. Zk能用在大型.分布式的

mysql-5.6主从同步配置示例

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1764093 本文环境    主库:CentOS6.5 x64 192.168.0.65 mysql-5.6.29     备库:CentOS6.5 x64 192.168.0.66 mysql-5.6.29 一.常规配置方式一 1. mysql主服务器配置 # vi /etc/my.cnf [mysqld]    log

.NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个名为ConfigurationReloadToken的类型开始. [ 本文已经同步到<ASP.NET Core框架揭秘>之中] 目录 一.从ConfigurationReloadToken说起 二.Configuration对象与配置文件的同步 三.应用重新加载的配置 四.同步流程总结 一.从Co

ASP.NET Core的配置(5):配置的同步[设计篇]

本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二.当Configuration对象承载的配置放生变换的时候如何向应用程序发送通知,最终让应用程序使用最新的配置. 一.配置与配置源的同步 配置模型提供了三个原生ConfigurationProvider(JsonConfigrationProvider.XmlConfigurationProvider和IniC

用脚本模式配置数据同步

大数据开发套件里可以通过配置同步任务,实现数据在不同数据源之间的迁移.但是因为目前只部署在华东1(参考文档),有一些特殊网络环境可能无法覆盖到.比如VPC下的DRDS或者其他区域自建数据库内网就不通了.不过套件还提供了脚本模式+调度资源设置这2个大杀器,满足各种复杂场景下的数据同步功能. 本文就数据从MaxCompute的数据导出到VPC下的DRDS为例,详细介绍如何使用这两种方法来实现灵活的数据同步. 同步原理 首先介绍下大数据开发套件的同步任务是怎么做的. (这个图片来自这里) 常有人以同步