简介:

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("服务器端配置已经发生了改变!!!!!!!!!!!!!");
//          }
//  });  

通过上述图我们可以看到,
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没有备份配置数据,导致其不能配置“容灾目录”。

tddl+diamond(一)相关推荐

  1. tddl+diamond(二)

    diamond的相关原理介绍,我们已经通过其他的文章进行了讲解,这篇文章我们着重讲解下diamond的初始化配置,以及tddl的初始化配置. 下载.部署diamond diamond的svn下载地址: ...

  2. 大众点评CAT开源监控系统剖析

    参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监控系统的设计与实现 深度剖析开源分布式监控CAT [分布式监控CAT] Client端源 ...

  3. mysql中间件研究(Atlas,cobar,TDDL)

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

  4. mysql中间件研究(Atlas,cobar,TDDL,Mycat)

    2019独角兽企业重金招聘Python工程师标准>>> mysql中间件研究(Atlas,cobar,TDDL,Mycat) 博客分类: 数据库 mysql-proxy是官方提供的m ...

  5. mysql中间件研究( Atlas,cobar,TDDL,mycat,heisenberg,Oceanus,vitess,OneProxy )

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

  6. 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)

    注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591   前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...

  7. mysql中间件研究( Atlas,cobar,TDDL,mycat,heisenberg,Oceanus,vitess )

    原文来自 http://www.gpfeng.com/?p=657&utm_source=tuicool 写在前面 14年中换了一份工作,出国游荡了一阵子,目前工作离数据库内核远了点,离业务近 ...

  8. 淘宝TDDL——Matrix层的分库分表配置与实现

    http://gao-xianglong.iteye.com/blog/2019729/ 目录 一.互联网当下的数据库拆分过程 二.TDDL的架构原型 三.下载TDDL的Atom层和Group层源代码 ...

  9. 分库分表之淘宝TDDL的原理

    分库分表之淘宝TDDL的原理 一.互联网当下的数据库拆分过程 二.TDDL的架构原型 三.下载TDDL的Atom层和Group层源代码 四.Diamond简介 五.Diamond的安装和使用 六.动态 ...

最新文章

  1. 70个Python练手项目列表 预祝大家 快乐
  2. p值+p-value+p value+显著性+significance
  3. ios视频硬解异常总结,12911总结
  4. Codeforces Beta Round #7 C. Line (扩展欧几里德)
  5. 【报错笔记】程序报错:Cause: java.sql.SQLException: Invalid value for getInt() - ‘4ab72edc-c02f-423f-ae9e-18c30
  6. SpringCloud 之客户端负载均衡策略
  7. Cesium最全源码集合
  8. 二极管伏安特性曲线_二极管的温度特性
  9. CSS3:3D环绕实现
  10. 大数据技术基础与应用
  11. 全国计算机二级ms备考,全国计算机二级MS office经验分享
  12. matlab应用于体育彩票上,马尔科夫预测法在体育彩票“排列三”中的应用
  13. 开源企业内部沟通协作平台, 免费企业IM, ENTBOOST, Windows环境:免安装模式部署
  14. 线性二自由度汽车模型的微分方程
  15. 2.基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地
  16. Scrum 5.0(继4.0)
  17. WIFI覆盖“瓷都”景区 电信助力景德镇打造“智慧城市”
  18. QT笔记--QT内类的层次关系,以及控件从属关系
  19. 【云服务】如何让你写的小程序在多平台(投放到支付宝、淘宝、钉钉、WX、H5等多个平台)上运行?
  20. 前端实现在线预览文档

热门文章

  1. JS组件Bootstrap实现弹出框和提示框效果代码
  2. 元宇宙:从数字孪生到数字共生
  3. DjangoUeditor添加与配置
  4. 在ReactJS中正确修改状态数组
  5. 四面阿里,因为最后一个问题与offer失之交臂
  6. Linux 3.10内核锁瓶颈描述以及解决-overlayfs的性能缺陷
  7. 常用技巧精选(一)尺取法
  8. 小分子药物logp预测/计算
  9. “第十届金融工程及量化投资者年会”来啦!
  10. 如何让Ubuntu系统支持LDAC,APTX,AAC编码(提升蓝牙音质)