使用ZooKeeper实现配置同步(转)
前言
应用项目中都会有一些配置信息,这些配置信息数据量少,一般会保存到内存、文件或者数据库,有时候需要动态更新。当需要在多个应用服务器中修改这些配置文件时,需要做到快速、简单、不停止应用服务器的方式修改并同步配置信息到所有应用中去。本篇文章就是介绍如何使用ZooKeeper来实现配置的动态同步。
ZooKeeper
在《hive Driver类运行过程》一文中可以看到hive为了支持并发访问引入了ZooKeeper来实现分布式锁。参考《ZooKeeper典型应用场景一览》一文,ZooKeeper还可以用作其他用途,例如:
- 数据发布与订阅(配置中心)
- 负载均衡
- 命名服务(Naming Service)
- 分布式通知/协调
- 集群管理与Master选举
- 分布式锁
- 分布式队列
一些在线系统在运行中,需要在不停止程序的情况下能够动态调整某一个变量的值并且能够及时生效。特别是当部署了多台应用服务器的时候,需要能够做到在一台机器上修改配置文件,然后在同步到所有应用服务器。这时候使用ZooKeeper来实现就很合适了。
数据发布与订阅
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
使用ZooKeeper的发布与订阅模型,可以将应用中用到的一些配置信息放到ZK上进行集中管理。这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。这样的场景适合数据量很小,但是数据更新可能会比较快的需求。
配置存储方案
配置文件通常有如下几种保存方式:
将配置信息保存在程序代码中
这种方案简单,但每次修改配置都要重新编译、部署应用程序。显然这种方案很不方便,也不可靠,更无法做到修改的实时生效。将配置信息保存在xml文件或者属性文件中
在参数信息保存在xml或者属性文件中,当需要修改参数时,直接修改 xml 文件。这样无需重新编译,只需重新部署修改的文件即可。但然后对所有的应用进行重新部署。这样做的缺点显而易见,要往上百台机器上重新部署应用,简直是一个噩梦。同时该方案还有一个缺点,就是配置修改无法做到实时生效。修改后往往过一段时间才能生效。将配置信息保存在数据库中
当需要修改参数时,直接修改数据库,然后重启分布式应用程序,或者刷新分布式应用的缓存。尽管这种做法比以上两种方案简单,但却面临着单点失效问题。如果数据库服务器停机,则分布式应用程序的配置信息将无法更新。另外这种方案的配置修改生效实时性虽然比第二种方案好些,但仍然不能达到某些情况下的要求。
基于ZooKeeper的配置信息同步方案
如果使用ZooKeeper来实现,就可以直接把配置信息保存到ZooKeeper中,或者把属性文件内容保存到ZooKeeper中,当属性文件内容发生变化时,就通知监听者如应用程序去重新读取配置文件。
在网上搜索了一下,很能找到好用的现成的代码实现。有的基于ZooKeeper来扩张jdk的hashmap来存储配置参数,如:使用ZooKeeper实现静态数据中心化配置管理,也有人直接实现了一个基于java并发框架的工具包,如:menagerie。
注意:以下部分文字和图来自:基于ZooKeeper的配置信息存储方案的设计与实现1.pdf
基于ZooKeeper的特性,借助ZooKeeper可以实现一个可靠的、简单的、修改配置能够实时生效的配置信息存储方案,整体的设计方案如图:

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

源代码
找到一个淘宝工程师写的实现方式, 代码见:zkpublisher
优点
借助 ZooKeeper我们实现的配置信息存储方案具有的优点如下:
- 简单。尽管前期搭建ZooKeeper服务器集群较为麻烦,但是实现该方案后,修改配置整个过程变得简单很多。用户只要修改配置,无需进行其他任何操作,配置自动生效。
- 可靠。ZooKeeper服务集群具有无单点失效的特性,使整个系统更加可靠。即使ZooKeeper 集群中的一台机器失效,也不会影响整体服务,更不会影响分布式应用配置信息的更新。
- 实时。ZooKeeper的数据更新通知机制,可以在数据发生变化后,立即通知给分布式应用程序,具有很强的变化响应能力。
总结
本文参考了网上的一些文章,给出了基于ZooKeeper的配置信息同步方案,解决了传统配置信息同步方案的缺点如实时性差、可靠性差、复杂等。
参考文章
使用ZooKeeper实现配置同步(转)的更多相关文章
- zookeeper配置同步zookeeper编程
分布式助手Zookeeper(四) kissyoudyb 2013-12-05 17:41 阅读:33 评论:0 分布式助手Zookeeper(三) kissyoudyb 2013-12-05 ...
- ZooKeeper系列1:ZooKeeper的配置
问题导读:1.zookeeper有哪些配置文件?2.zookeeper最低配置需要哪些配置项?3.zookeeper高级配置需要配置哪些项? ZooKeeper 的功能特性通过 ZooKeeper 配 ...
- ZooKeeper学习第二期--ZooKeeper安装配置
一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是在一台物 ...
- Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用
https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...
- 【Zookeeper系列】ZooKeeper安装配置(转)
原文链接:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...
- 【转载】ZooKeeper学习第二期--ZooKeeper安装配置
原文地址(https://www.cnblogs.com/sunddenly/p/4018459.html) 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及 ...
- 搞懂分布式技术5:Zookeeper的配置与集群管理实战
搞懂分布式技术5:Zookeeper的配置与集群管理实战 4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为“zoo_sample.cfg”的文件,是ZooK ...
- zk 05之:ZooKeeper的配置
ZooKeeper 的功能特性通过 ZooKeeper 配置文件来进行控制管理( zoo.cfg 配置文件). ZooKeeper 这样的设计其实是有它自身的原因的.通过前面对 ZooKeeper 的 ...
- ZooKeeper学习第二期--ZooKeeper安装配置(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...
随机推荐
- C# Path 有关于文件路径获取的问题 的方法
string Current = Directory.GetCurrentDirectory();//获取当前根目录 //private string strFilePath = Applicatio ...
- Coursera Algorithms week3 归并排序 练习测验: Shuffling a linked list
题目原文: Shuffling a linked list. Given a singly-linked list containing n items, rearrange the items un ...
- fsockopen get,post 封装 (转)
function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) { $parse = pa ...
- Newtonsoft.Json 序列化日期问题解决
上代码 其中的使用方法和UserInfo实体对象就不贴代码了. /// <summary> /// 把对象转成json字符串 /// </summary> /// <pa ...
- Find them, Catch them(并查集)
http://poj.org/problem?id=1703 题意:有两个黑帮团伙,共n名团伙成员(不知道属于这两个黑帮中的哪一个).现在警察有一些信息,每条信息包含2个人的编号,如果给出A a b, ...
- [Luogu 1850] noip16 换教室
[Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...
- DB2数据常用指令
************************************************************** 这个只是个人平时总结,如果有更好的欢迎告诉我,一起学习一起成长 ***** ...
- (转)C#开发微信门户及应用(5)--用户分组信息管理
http://www.cnblogs.com/wuhuacong/p/3695351.html 在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继 ...
- dispatch_sync:As an optimization, this function invokes the block on the current thread when possible
两件事情: 1.是否是一个线程: 2.queue task 的目标线程是否有未完成的task. 模型:一个线程处理当前的task还有通过gc d派发来的待执行task. 猜测: 如果目标thread上 ...
- c# 验证码实现代码
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...