`
yale
  • 浏览: 359424 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

tddl+diamond(一)

 
阅读更多

简介:

tddl的相关介绍请在http://rdc.taobao.com/team/jm/archives/1642中进行了解,这里就不做介绍了,diamond是淘宝开源管理持久配置的系统,持久配置是指配置数据会持久化到磁盘和数据库中,diamond为应用系统提供了获取配置的服务,应用不仅可以在启动时从diamond获取相关的配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据
相关实现代码:

//  //创建订阅者,ManagerListener 是客户端注册的数据监听器, 它的作用是在
//  //运行中接受变化的配置数据,然后回调receiveConfigInfo()方法,执行客户端处理数据的逻辑。
//  //如果要在运行中对变化的配置数据进行处理,就一定要注册ManagerListener
//DiamondManager diamondConfigure = new DefaultDiamondManage

("DEFAULT_GROUP","com.taobao.tddl.atom.global.qatest_normal_0", new ManagerListener() {
//   public java.util.concurrent.Executor getExecutor() {
//            return null;
//          }
//          public void receiveConfigInfo(String configInfo) {
//           // 客户端处理数据的逻辑
//           System.out.println("服务器端配置已经发生了改变!!!!!!!!!!!!!");
//          }       
//  });

 

核心原理
一、server集群数据同步

diamond-server将数据存储在mysql和本地文件中,同步数据有两种方式:

(1)server写数据时,先将数据写入mysql,然后写入本地文件,写入完成后发送一个HTTP请求给集群中的其他server,其他server收到请求,从mysql中dump刚刚写入的数据至本地文件。

(2)server启动后会启动一个定时任务,定时从mysql中dump所有数据至本地文件。

二、client获取server地址

diamond-client在使用时没有指定server地址的代码,地址获取对用户是透明的。

server地址存储在一台具有域名的机器上的HTTP server中,我们称它为地址服务器,diamond-client使用前需要在本地进行正确的域名绑定,启动时它会根据域名绑定,去对应环境的地址服务器上获取diamond-server地址列表(需要在host文件中进行ip a.b.c的绑定,因为在diamond的配置文件中,com.taobao.diamond.common.Constants.java的初始化配置是a.b.c,你也可以自行修改)。

获取的地址列表,会保存在client本地,当出现网络异常,无法从网络获取地址列表时,client会使用本地保存的地址列表。

client启动后会启动一个定时任务,定时从HTTP server上获取地址列表并保存在本地,以保证地址是最新的。

三、client主动获取数据

我们可以通过源代码发现,在com.taobao.tddl.jdbc.atom.config.DiamondDbPasswdManager类中的getPasswd()方法中,当配置处理器类不为空时,就调用获取配置处理器的接口com.taobao.tddl.common.config.ConfigDataHandler的getData方法(从配置中心拉取数据):

 

在getData方法中,会根据传入的条件不同来选择同步策略:

    /**
     * 同步获取一份有效的配置信息,按照<strong>本地文件->diamond服务器->上一次正确配置的snapshot</strong>
     * 的优先顺序获取, 如果这些途径都无效,则返回null
     * 
     * @param timeout
     *            从网络获取配置信息的超时,单位毫秒
     * @return
     */
    public String getAvailableConfigureInfomation(long timeout);
    
    
    /**
     * 同步获取一份有效的配置信息,按照<strong>上一次正确配置的snapshot->本地文件->diamond服务器</strong>
     * 的优先顺序获取, 如果这些途径都无效,则返回null
     * @param timeout 从网络获取配置信息的超时,单位毫秒
     * @return
     */
     public String getAvailableConfigureInfomationFromSnapshot(long timeout);

  

四、client运行中感知数据变化

这是diamond最为核心的一个功能,这个特性是通过比较client和server的数据的MD5值实现的。server在启动时,会将所有数据的MD5加载到内存中(MD5根据某算法得出,保证数据内容不同,MD5不同,MD5存储在mysql中),数据更新时,会更新内存中对应的MD5,client在启动并第一次获取数据后,会将数据的MD5保存在内存中,并且在启动时会启动一个定时任务,定时去server检查数据是否变化。每次检查时,client将MD5传给server,server比较传来的MD5和自身内存中的MD5是否相同,如果相同,说明数据没变,返回一个标示数据不变的字符串给client;如果不同,说明数据变了,返回变化数据的dataId和group给client.  client收到变化数据的dataId和group,再去server请求一次数据,拿回数据后回调监听器。

    相关类以及代码:

    com.taobao.datasource.resource.security.SecureIdentifyLoginModule.java类用来处理上述MD5的操作,下面是IAtomConfParser.java调用decode来进行验证MD5的操作:

  

	public static String decode(String encKey, String secret) throws NoSuchPaddingException, NoSuchAlgorithmException,
			InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
		byte[] kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
		if (StringUtils.isNotBlank(encKey)) {
			kbytes = encKey.getBytes();
		}
		SecretKeySpec key = new SecretKeySpec(kbytes, "AES");
		BigInteger n = new BigInteger(secret, 16);
		byte[] encoding = n.toByteArray();
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] decode = cipher.doFinal(encoding);
		return new String(decode);
	}

    TAtomConfParser.java:

   

	public static String parserPasswd(String passwdStr) {
		String passwd = null;
		Properties passwdProp = TAtomConfParser.parserConfStr2Properties(passwdStr);
		String encPasswd = passwdProp.getProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY);
		if (TStringUtil.isNotBlank(encPasswd)) {
			String encKey = passwdProp.getProperty(TAtomConfParser.PASSWD_ENC_KEY_KEY);
			try {
				passwd = SecureIdentityLoginModule.decode(encKey, encPasswd);
			} catch (Exception e) {
				logger.error("[parserPasswd Error] decode dbPasswdError !", e);
			}
		}
		return passwd;
	}

   

//  //创建订阅者,ManagerListener 是客户端注册的数据监听器, 它的作用是在
  
//运行中接受变化的配置数据,然后回调receiveConfigInfo()方法,执行客户端处理数据的逻辑。
//DiamondManager diamondConfigure = new DefaultDiamondManage

("DEFAULT_GROUP","com.taobao.tddl.atom.global.qatest_normal_0", new ManagerListener() {
//   public java.util.concurrent.Executor getExecutor() {
//            return null;
//          }
//          public void receiveConfigInfo(String configInfo) {
//           // 客户端处理数据的逻辑
//           System.out.println("服务器端配置已经发生了改变!!!!!!!!!!!!!");
//          }       
//  });

  

diamond架构


通过上述图我们可以看到,
1、作为一个配置中心,diamond的功能分为发布和订阅两部分。因为diamond存放的是持久数据,这些数据的变化频率不会很高,所以发布采用手工的形式,通过diamond后台管理界面发布;订阅是diamond的核心功能,订阅通过diamond-client的API进行。

2、diamond服务端采用mysql加本地文件的形式存放配置数据。发布数据时,数据先写到mysql,再写到本地文件;订阅数据时,直接获取本地文件,不查询数据库,这样可以最大程度减少对数据库的压力。

3、diamond服务端是一个集群,集群中的每台机器连接同一个mysql,集群之间的数据同步通过两种方式进行,一是每台server定时去mysql dump数据到本地文件,二是某一台server接收发布数据请求,在更新完mysql和本机的本地文件后,发送一个HTTP请求(通知)到集群中的其他几台server,其他server收到通知,去mysql中将刚刚更新的数据dump到本地文件,并产生相关日志:

 4、每一台server前端都有一个nginx,用来做流量控制。

5、地址服务器是一台有域名的机器,上面运行有一个HTTP server,其中有一个静态文件(diamond),存放着diamond服务器的地址列表。客户端启动时,根据自身的域名绑定,连接到地址服务器,取回diamond服务器的地址列表,从中随机选择一台diamond服务器进行连接。


diamond容灾
diamond具有一套完备的容灾机制,容灾机制涉及到client和server两部分,主要包括以下几个方面:
1、server存储数据的方式。
server存储数据是“数据库 + 本地文件”的方式,client订阅数据时,访问的是本地文件,不查询数据库,这样即使数据库出问题了,仍然不影响client的订阅。

2、server是一个集群。
集群中的一台server不可用了,client发现后可以自动切换到其他server上进行访问,自动切换在client内部实现。

3、client保存snapshot
client每次从server获取到数据后,都会将数据保存在本地文件系统,diamond称之为snapshot,即数据快照。当client下次启动发现在超时时间内所有server均不可用(可能是网络故障),它会使用snapshot中的数据快照进行启动。

4、client校验MD5
client每次从server获取到数据后,都会进行MD5校验(数据保存在response body,MD5保存在response header),以防止因网络故障造成的数据不完整,MD5校验不通过直接抛出异常。

5、client与server分离
client可以和server完全分离,单独使用,diamond定义了一个“容灾目录”的概念,client在启动时会创建这个目录,每次主动获取数据(即调用getAvailableConfigInfomation()方法),都会优先从“容灾目录”获取数据,如果client按照一个固定的规则,在“容灾目录”下配置了需要的数据,那么client直接获取到数据返回,不再通过网络从diamond-server获取数据。同样的,在每次轮询时,都会优先轮询“容灾目录”,如果发现配置还存在于其中,则不再向server发出轮询请求。 以上的情形, 会持续到“容灾目录”的配置数据被删除为止,容灾目录如下图:

 

根据以上的容灾机制,diamond整个系统完全不可用的条件需满足以下4个:
 1、数据库不可用。
 2、所有server均不可用。
 3、client主动删除了snapshot
 4、client没有备份配置数据,导致其不能配置“容灾目录”。

分享到:
评论
2 楼 zhaoshijie 2015-05-04  
你好,请教下 客户端连接时报错:“当前没有可用的服务列表”,异常信息如下:五月 04, 2015 1:33:42 下午 com.taobao.diamond.client.processor.ServerAddressProcessor acquireServerAddressOnce
严重: 获取服务器地址列表信息Http异常, configServerAddress=d.e.f,, java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
五月 04, 2015 1:33:42 下午 com.taobao.diamond.client.processor.ServerAddressProcessor synAcquireServerAddress
信息: 从本地获取Diamond地址列表
Exception in thread "main" java.lang.RuntimeException: 当前没有可用的服务器列表
at com.taobao.diamond.client.processor.ServerAddressProcessor.synAcquireServerAddress(ServerAddressProcessor.java:168)
at com.taobao.diamond.client.processor.ServerAddressProcessor.start(ServerAddressProcessor.java:77)
at com.taobao.diamond.client.impl.DefaultDiamondSubscriber.start(DefaultDiamondSubscriber.java:142)
at com.taobao.diamond.client.impl.DefaultDiamondSubscriber.addDataId(DefaultDiamondSubscriber.java:1177)
at com.taobao.diamond.manager.impl.DefaultDiamondManager.<init>(DefaultDiamondManager.java:59)
1 楼 ppgf135 2013-08-14  
最近项目有用到这个diamond,学习中

相关推荐

    分布式数据层TDDL.zip

    可分析的日志打印,日志流控,动态变更TDDL必须要依赖diamond配置中心(diamond是淘宝内部使用的一个管理持久配置的系统,目前淘宝内部绝大多数系统的配置,由diamond来进行统一管理,同时diamond也已开源)。...

    diamond 中文版 lattice软件

    在计算机科学与电子工程领域,电路设计是一项至关重要的工作,而Lattice公司的Diamond软件则是其中的一款杰出工具。它为用户提供了丰富的硬件描述语言(HDL)编译、仿真、综合以及配置等功能,特别适用于FPGA(Field...

    diamond3_读取_micaps_diamond3_气象_3类数据_

    Diamond3是Micaps系统中的一种特定数据格式,用于存储和传输气象预报和观测数据。这种格式通常包含多种气象参数,如温度、湿度、风速、风向、气压等,以满足气象分析和预报的需求。由于数据结构复杂,直接读取和处理...

    Lattice厂家开发软件Diamond安装文件 License

    在 FPGA 开发领域,Lattice 公司的 Diamond 软件是一款不可或缺的工具,它提供了全面的设计环境,用于开发、仿真和编程基于 Lattice FPGA 的项目。本资源包含的是 Diamond 开发软件的安装文件以及 License 文件,...

    Lattice Diamond 3.1 User Guide

    Lattice Diamond 3.1是一款由Lattice Semiconductor Corporation开发的FPGA设计软件工具。Lattice Semiconductor是专门从事可编程逻辑器件的半导体制造商,它提供从低功耗移动设备到高性能通信系统的多种产品线。在...

    编写函数diamond打印一个菱形

    《linux c一站式编程》中的习题,...编写函数diamond打印一个菱形。如果调用diamond(3, '*')则打印: * * * * * 如果调用diamond(5, '+')则打印: + + + + + + + + + + + + + 如果用偶数做参数则打印错误提示。

    taobao Diamond 部分maven jar包

    淘宝Diamond是一款由阿里巴巴开源的分布式配置中心,它主要用于解决大规模分布式系统中的配置管理问题。在大型互联网企业中,随着系统的复杂度增加,配置的管理和更新变得越来越困难,Diamond为此提供了统一、高效且...

    Diamond 3.9 lisence万能版.zip

    在电子设计自动化(EDA)领域,Lattice Diamond 是一款广泛使用的 FPGA 设计工具,由 Lattice Semiconductor 公司提供。它集成了逻辑综合、布局布线、仿真、硬件编程等一系列功能,帮助工程师们在开发基于 Lattice ...

    Black_Diamond_EA (1)_forexearobot_forex_Diamond_DiamondEA下载_blac

    "Black_Diamond_EA (1)_forexearobot_forex_Diamond_DiamondEA下载_blac" 提到的Black Diamond EA,正是这样一款备受瞩目的外汇交易机器人,它融合了独特的马丁格尔策略,提供了一种可选的盈利方法。本文将深入探讨...

    Diamond软件

    而Diamond软件,作为一个专为晶体结构展示和分析设计的强大工具,深受科研人员喜爱。它以其直观的界面、强大的功能以及易上手的操作,成为了晶体学研究者的首选软件之一。 Diamond软件的核心功能在于其能够帮助用户...

    Night Diamond五套指针.rar

    "Night Diamond五套指针.rar" 是一个专为鼠标指针爱好者提供的资源包,它包含五款设计精美的夜光钻石主题指针,让你的电脑操作界面更具个性化色彩。只需简单几步操作,即可让平凡的鼠标指针焕发出独特的魅力。 首先...

    Lattice Diamond官网下载简明教程

    在下载Lattice Diamond之前,你需要拥有一个Lattice账户。点击页面右上角的“登录”按钮,如果你还没有账号,可以点击“创建账户”进行注册。注册过程通常需要填写电子邮件地址、用户名和密码,可能还需要验证邮箱...

    Lattice Diamond 3.12 Reveal User Guide

    Lattice Diamond 3.12 Reveal User Guide 是一款高级的 FPGA 片上调试工具,旨在帮助用户更方便地 debug 和优化 FPGA 设计。Reveal 软件提供了几个关键的可用性优势,包括与金刚石设计流程的集成、一键式操作、将...

    lattice diamond 3.7 license

    在电子设计自动化(EDA)领域,Lattice Semiconductor公司的Lattice Diamond是一款至关重要的软件工具。该软件专为编程、仿真和设计莱迪思(Lattice)系列的现场可编程逻辑门阵列(FPGA)而设计。本文将深入探讨...

    美国钻石公司数据采集卡DIAMOND-MM-32-AT 技术手册

    美国钻石公司的DIAMOND-MM-32-AT是一款高性能的数据采集卡,采用PC/104格式设计,具备全面的功能。该模块提供32路模拟输入通道(16位分辨率),可编程的输入范围;最高每秒20万次采样率,支持FIFO操作;4路模拟输出...

    lattice Diamond多种解密方法

    lattice diamond 的license 多种解密方法,让你在lattice diamond芯片开发上,大展身手!

    Diamond3.2破解文件

    diamond升级到了3.2i, 经测试原来的破解yourlicense在3.2H之前仍然有效!到这里下载3.2I,http://download.csdn.net/detail/daipengren/4424598 安装后,下载附件中的yourlicense覆盖原文件即可

    Crystal Impact Diamond 3.1破解补丁

    Crystal Impact Diamond 3.1破解补丁。安装Crystal Impact Diamond 3.1后,将破解补丁复制粘贴到Diamond对应安装目录覆盖原文件即可。

Global site tag (gtag.js) - Google Analytics