`
m635674608
  • 浏览: 5068947 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

disconf 分布式配置

 
阅读更多

摘要

为了更好的解决分布式环境下多台服务实例的配置统一管理问题,本文提出了一套完整的分布式配置管理解决方案(简称为disconf[4],下同)。首先,实现了同构系统的配置发布统一化,提供了配置服务server,该服务可以对配置进行持久化管理并对外提供restful接口,在此基础上,基于zookeeper实现对配置更改的实时推送,并且,提供了稳定有效的容灾方案,以及用户体验良好的编程模型和WEB用户管理界面。其次,实现了异构系统的配置包管理,提出基于zookeeper的全局分布式一致性锁来实现主备统一部署、系统异常时的主备自主切换。通过在百度内部以及外部等多个产品线的实践结果表明,本解决方案是有效且稳定的。

技术背景

在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理成千上百个服务实例的配置问题。

王阿晶提出了基于zooKeeper的配置信息存储方案的设计与实现[1], 它将所有配置存储在zookeeper上,这会导致配置的管理不那么方便,而且他们没有相关的源码实现。淘宝的diamond[2]是淘宝内部使用的一个管理持久配置的系统,它具有完整的开源源码实现,它的特点是简单、可靠、易用,淘宝内部绝大多数系统的配置都采用diamond来进行统一管理。他将所有配置文件里的配置打散化进行存储,只支持KV结构,并且配置更新的推送是非实时的。百度内部的BJF配置中心服务[3]采用了类似淘宝diamond的实现,也是配置打散化、只支持KV和非实时推送。

同构系统是市场的主流,特别地,在业界大量使用部署虚拟化(如JPAAS系统,SAE,BAE)的情况下,同一个系统使用同一个部署包的情景会越来越多。但是,异构系统也有一定的存在意义,譬如,对于“拉模式”的多个下游实例,同一时间点只能只有一个下游实例在运行。在这种情景下,就存在多台实例机器有“主备机”模式的问题。目前国内并没有很明显的解决方案来统一解决此问题。

功能特点与设计理念

disconf是一套完整的基于zookeeper的分布式配置统一解决方案。

它的功能特点是

  • 支持配置(配置项+配置文件)的分布式化管理
    • 配置发布统一化
    • 配置发布、更新统一化(云端存储、发布):配置存储在云端系统,用户统一在平台上进行发布、更新配置。
    • 配置更新自动化:用户在平台更新配置,使用该配置的系统会自动发现该情况,并应用新配置。特殊地,如果用户为此配置定义了回调函数类,则此函数类会被自动调用。
  • 配置异构系统管理
    • 异构包部署统一化:这里的异构系统是指一个系统部署多个实例时,由于配置不同,从而需要多个部署包(jar或war)的情况(下同)。使用Disconf后,异构系统的部署只需要一个部署包,不同实例的配置会自动分配。特别地,在业界大量使用部署虚拟化(如JPAAS系统,SAE,BAE)的情况下,同一个系统使用同一个部署包的情景会越来越多,Disconf可以很自然地与他天然契合。 异构主备自动切换:如果一个异构系统存在主备机,主机发生挂机时,备机可以自动获取主机配置从而变成主机。
    • 异构主备机Context共享工具:异构系统下,主备机切换时可能需要共享Context。可以使用Context共享工具来共享主备的Context。
  • 注解式编程,极简的使用方式:我们追求的是极简的、用户编程体验良好的编程方式。通过简单的标注+极简单的代码撰写,即可完成复杂的配置分布式化。
  • 需要Spring编程环境

它的设计理念是:

  • 简单,用户体验良好:
    • 摒弃了打散化配置的管理方式[2,3],仍旧采用基于配置文件的编程方式,这和程序员以前的编程习惯(配置都是放在配置文件里)一致。特别的,为了支持较为小众的打散化配置功能,还特别支持了配置项。
    • 采用了基于XML无代码侵入编程方式:只需要几行XML配置,即可实现配置文件发布更新统一化、自动化。
    • 采用了基于注解式的弱代码侵入编程方式:通过编程规范,一个配置文件一个配置类,代码结构简单易懂。XML几乎没有任何更改,与原springXML配置一样。真正编程时,几乎感觉不到配置已经分布式化
  • 可以托管任何类型的配置文件,这与[2,3]只能支持KV结构的功能有较大的改进。
  • 配置更新实时推送
  • 提供界面良好Web管理功能,可以非常方便的查看配置被哪些实例使用了。

详细设计

架构设计

disconf服务集群模式

disconf的模块架构图

每个模块的简单介绍如下:

  • Disconf-core
    • 分布式通知模块:支持配置更新的实时化通知
    • 路径管理模块:统一管理内部配置路径URL
  • Disconf-client
    • 配置仓库容器模块:统一管理用户实例中本地配置文件和配置项的内存数据存储
    • 配置reload模块:监控本地配置文件的变动,并自动reload到指定bean
    • 扫描模块:支持扫描所有disconf注解的类和域
    • 下载模块:restful风格的下载配置文件和配置项
    • watch模块:监控远程配置文件和配置项的变化
    • 主备分配模块:主备竞争结束后,统一管理主备分配与主备监控控制
    • 主备竞争模块:支持分布式环境下的主备竞争
  • Disconf-web
    • 配置存储模块:管理所有配置的存储和读取
    • 配置管理模块:支持配置的上传、下载、更新
    • 通知模块:当配置更新后,实时通知使用这些配置的所有实例
    • 配置自检监控模块:自动定时校验实例本地配置与中心配置是否一致
    • 权限控制:web的简单权限控制
  • Disconf-tools
    • context共享模块:提供多实例间context的共享。

流程设计

运行流程详细介绍:

与2.0版本的主要区别是支持了:主备分配功能/主备切换事件。

  • 启动事件A:以下按顺序发生。
    • A3:扫描静态注解类数据,并注入到配置仓库里。
    • A4+A2:根据仓库里的配置文件、配置项,去 disconf-web 平台里下载配置数据。这里会有主备竞争
    • A5:将下载得到的配置数据值注入到仓库里。
    • A6:根据仓库里的配置文件、配置项,去ZK上监控结点。
    • A7+A2:根据XML配置定义,到 disconf-web 平台里下载配置文件,放在仓库里,并监控ZK结点。这里会有主备竞争。
    • A8:A1-A6均是处理静态类数据。A7是处理动态类数据,包括:实例化配置的回调函数类;将配置的值注入到配置实体里。
  • 更新配置事件B:以下按顺序发生。
    • B1:管理员在 Disconf-web 平台上更新配置。
    • B2:Disconf-web 平台发送配置更新消息给ZK指定的结点。
    • B3:ZK通知 Disconf-cient 模块。
    • B4:与A4一样。
    • B5:与A5一样。
    • B6:基本与A4一样,唯一的区别是,这里还会将配置的新值注入到配置实体里。
  • 主备机切换事件C:以下按顺序发生。
    • C1:发生主机挂机事件。
    • C2:ZK通知所有被影响到的备机。
    • C4:与A2一样。
    • C5:与A4一样。
    • C6:与A5一样。
    • C7:与A6一样。

模块实现

disconf-web提供了前后端分离的web架构,具体可见:https://github.com/knightliao/disconf/tree/master/disconf-web

本部分会重点介绍disconf-client的实现方式。

注解式disconf实现

本实现会涉及到 配置仓库容器模块、扫描模块、下载模块、watch模块,

http://ww1.sinaimg.cn/bmiddle/60c9620fjw1eqj9zzgc7yj20b20pn41v.jpg

使用AOP拦截的一个好处是可以比较轻松的实现配置控制,比如并发环境下的配置统一生效。关于这方面的讨论可以见这里

特别地,本方式提供的编程模式非常简单,例如使用以下配置类的程序在使用它时,可以直接@Autowired进来进行调用,使用它时就和平常使用普通的JavaBean一样,但其实它已经分布式化了。配置更新时,配置类亦会自动更新。

@Service
@DisconfFile(filename = "redis.properties")
public class JedisConfig {

    // 代表连接地址
    private String host;

    // 代表连接port
    private int port;

    /**
     * 地址, 分布式文件配置
     * 
     * @return
     */
    @DisconfFileItem(name = "redis.host", associateField = "host")
    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    /**
     * 端口, 分布式文件配置
     * 
     * @return
     */
    @DisconfFileItem(name = "redis.port", associateField = "port")
    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }
}

基于XML配置disconf实现

本实现提供了无任何代码侵入方式的分布式配置。

ReloadablePropertiesFactoryBean继承了Spring Properties文件的PropertiesFactoryBean类,管理所有当配置更新时要进行reload的配置文件。对于被管理的每一个配置文件,都会通过 配置仓库容器模块、扫描模块、下载模块、watch模块 进行配置获取至配置仓库里。

ReloadingPropertyPlaceholderConfigurer继承了Spring Bean配置值控制类PropertyPlaceholderConfigurer。在第一次扫描spring bean里,disconf会记录配置文件的配置与哪些bean有关联。

ReloadConfigurationMonitor是一个定时任务,定时check本地配置文件是否有更新。

当配置中心的配置被更新时,配置文件会被下载至实例本地,ReloadConfigurationMonitor即会监控到此行为,并且通知 ReloadingPropertyPlaceholderConfigurer 对相关的bean类进行值更新。

特别的,此种方式无法解决并发情况下配置统一生效的问题。

主备分配实现

在实现中,为每个配置提供主备选择的概念。用户实例在获取配置前需要先进行全局唯一性竞争才能得到配置值。在这里,我们采用基于zookeeper的全局唯一性锁来实现。

Comparisons

  淘宝Diamond[2] Disconf 比较
数据持久性 存储在mysql上 存储在mysql上 都持久化到数据库里,都易于管理
推拉模型 拉模型,每隔15s拉一次全量数据 基于Zookeeper的推模型,实时推送 disconf基于分布式的Zookeeper来实时推送,在稳定性、实效性、易用性上均优于diamond
配置读写 支持实例对配置读写。支持某台实例写配置数据,并广播到其它实例上 只支持实例对配置读。通过在disconf-web上更新配置到达到广播写到所有应用实例 从目前的应用场景来看,实例对配置的写需求不是那么明显。disconf支持的中心化广播方案可能会与人性思考更加相似。
容灾 多级容灾模式,配置数据会dump在本地,避免中心服务挂机时无法使用 多级容灾模式,优先读取本地配置文件。 双方均支持在中心服务挂机时配置实例仍然可以使用
配置数据模型 只支持KV结构的数据,非配置文件模式 支持传统的配置文件模式(配置文件),亦支持KV结构数据(配置项) 使用配置文件的编程方式可能与程序员的编程习惯更为相似,更易于接受和使用。
编程模型 需要将配置文件拆成多个配置项,没有明显的编程模型 在使用配置文件的基础上,提供了注解式和基于XML的两种编程模型
并发性 多条配置要同时生效时,无法解决并发同时生效的问题 基于注解式的配置,可以解决并发性问题

Reference

  1. 王阿晶,邹仕洪: 基于ZooKeeper的配置信息存储方案的设计与实现
  2. 淘宝diamod实现:http://code.taobao.org/p/diamond/src/, 2012
  3. 百度BJF配置中心, 2014
  4. disconf github: https://github.com/knightliao/disconf, 2014
  5. 淘宝分布式配置管理服务Diamond
  6. zooKeeper和Diamond有什么不同
  7. diamond专题(一)-- 简介和快速使用

http://www.liaoqiqi.com/post/219

分享到:
评论

相关推荐

    Disconf 分布式配置使用教程

    Disconf 分布式配置使用教程 Disconf 是一款分布式配置管理系统,旨在帮助开发者更方便地管理和维护项目中的配置文件。在本教程中,我们将详细介绍 Disconf 的使用方法和配置项。 1. Disconf 客户端录入/修改/删除...

    Disconf分布式配置管理平台 v2.6.36.zip

    综上所述,Disconf分布式配置管理平台提供了全面的配置管理解决方案,适用于各种规模和类型的分布式系统。通过理解和运用Disconf,开发者可以更好地应对复杂分布式环境下的配置管理挑战,提高系统的灵活性和可维护性...

    Disconf分布式配置管理平台 v2.6.36

    为您提供Disconf分布式配置管理平台下载,Disconf(Distributed Configuration Management Platform)分布式配置管理平台,专注于为各种「分布式系统配置管理」的「通用组件」和「通用平台」提供统一的「配置管理...

    Disconf分布式配置管理平台-其他

    Disconf(Distributed Configuration Management Platform)分布式配置管理平台,专注于为各种「分布式系统配置管理」的「通用组件」和「通用平台」提供统一的「配置管理服务」。包括百度、滴滴出行、银联、网易、...

    disconf-demo:disconf分布式配置demo

    `disconf`( Distributed Configuration System)就是这样一个用于Java环境的开源分布式配置管理工具。`disconf-demo`是基于`disconf`的一个示例项目,旨在帮助开发者更好地理解和使用`disconf`。 `disconf`的核心...

    (源码)基于Spring Boot和Disconf的分布式配置管理系统.zip

    # 基于Spring Boot和Disconf的分布式配置管理系统 ## 项目简介 本项目是一个基于Spring Boot框架和Disconf的分布式配置管理系统。Disconf是一个专注于分布式系统配置管理的通用组件和平台,提供统一的配置管理服务...

    分布式配置中心 Disconf 安装包

    分布式配置中心 Disconf 编译好的安装包, 分布式配置中心 Disconf 编译好的安装包,。

    (源码)基于SpringBoot和Vue的分布式配置管理系统.zip

    分布式配置管理系统(Disconf)是一个专注于各种分布式系统配置管理的通用组件和通用平台,提供统一的配置管理服务。Disconf旨在简化分布式系统的配置管理,确保配置的统一管理和动态更新。 ## 项目的主要特性和...

    Disconf配置war包

    Disconf(分布式配置中心)是百度开源的一款用于解决分布式系统配置管理问题的工具,它可以集中化管理应用的配置,使得在分布式环境下配置的修改和更新变得更加便捷。在本压缩包中,包含了`disconf-web.war`文件,这...

    SpringCloud之七 分布式配置中心SpringCloudConfig.pdf

    Spring Cloud Config是Spring Cloud全家桶中的一个组件,它主要用于实现分布式系统中的配置管理。在微服务架构下,系统通常被拆分成许多个小的微服务,每个服务都有自己的配置文件。当配置文件频繁更改或不同服务...

    disconf-demo

    【标题】"disconf-demo" 是一个基于Spring Boot框架的示例程序,它展示了如何集成和使用disconf(分布式配置中心)这一工具。这个项目旨在帮助开发者了解如何在Spring Boot应用中实现分布式配置管理,从而实现配置的...

    分布式架构Wish脚手架项目,mybatis据库读写分离,disconf配置中心等-Wish.zip

    4. **Disconf(分布式配置中心)**:Disconf是由百度开源的一个分布式配置管理工具,它可以帮助开发者集中管理分布式系统中的配置,简化配置的更新和同步过程。在Wish项目中,Disconf作为配置中心,可以方便地对各个...

    disconf使用

    《Disconf——分布式配置管理详解》 在现代的大型分布式系统中,配置管理是一个至关重要的环节。Disconf,全称为 Distributed Configuration,是一个开源的、基于Java的分布式配置中心,它致力于解决分布式环境下...

    disconf-web部署指南_V1.3

    Disconf(分布式配置中心)是一款开源的、轻量级的、适用于Java环境的分布式配置管理工具,它能有效地帮助开发者解决在分布式系统中配置管理的难题。这份V1.3版本的指南将详细介绍如何正确、高效地部署和使用disconf...

    disconf 例子

    《分布式配置中心Disconf实战详解》 在现代的大型分布式系统中,统一管理和维护配置信息是必不可少的一环。Disconf,全称为 Distributed Configuration,是一款由百度开源的分布式配置中心,它能够有效地解决分布式...

    disconf小文档

    disconf,全称是Distributed Configuration Service,是一款开源的分布式配置管理工具,由百度公司推出,旨在解决在分布式环境下配置管理的难题。它提供了一种集中式的、版本化的、动态更新的方式来管理和分发应用的...

    disconf-master.zip

    《分布式配置中心Disconf详解与应用实践》 Disconf,全称为Distributed Configuration,是一款开源的分布式配置中心,由百度公司开发并维护。在大型分布式系统中,管理配置是一项复杂的工作,Disconf的出现旨在解决...

    apollo和disconf对比

    Disconf则是百度开源的一款分布式配置管理工具,同样具备配置管理的核心功能。Disconf的特点包括: 1. **全面覆盖**:Disconf不仅支持常规的配置管理,还涵盖了Spring、MyBatis等框架的配置,以及Zookeeper、Redis...

    xmljava系统源码-disconf:DistributedConfigurationManagementPlatform(分布式配置管理平

    Platform(分布式配置管理平台) 专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」 包括 百度、滴滴出行、银联、网易、拉勾网、苏宁易购、顺丰科技 等知名互联网公司正在...

    分布式配置中心选型

    在众多开源的分布式配置中心项目中,如淘宝的Diamond和Disconf,Apollo因其功能强大、社区活跃、持续维护以及清晰的文档而受到青睐。它不仅能满足基本的配置管理需求,还提供了丰富的扩展性和灵活性,是微服务架构下...

Global site tag (gtag.js) - Google Analytics