阿里中间件——diamond

Posted 小滴课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里中间件——diamond相关的知识,希望对你有一定的参考价值。

一、前言


最近工作不忙闲来无事,仔细分析了公司整个项目架构,发现用到了很多阿里巴巴集团开源的框架,今天要介绍的是中间件diamond,访问了对应开发团队的博客(http://jm-blog.aliapp.com),认真学习了一下diamond,下面是本人学习中的一些心得,故写出来。


阿里中间件——diamond
二、diamond学习笔记

     

1、diamond简介

diamond是一个管理持久配置(持久配置是指配置数据会持久化到磁盘和数据库中)的系统。无可厚非,淘宝内部正在使用diamond,在淘宝内部的绝大多数系统的配置都是由diamond统一管理的。diamond最大的特点就是简单、可靠、易用。diamond的简单是指diamond整体结构非常简单,从而减少了出错的可能性;diamond的可靠是指应用方在任何情况下都可以启动,例如:淘宝的核心系统最初一年多是由diamond所管理,在这期间并没有发生什么大的故障;diamond的易用是指客户端使用只需要两行代码,暴露出的接口都非常简单,易于理解。

对于应用系统而言,diamond为其提供获取配置的服务,应用不仅可以在启动时从diamond获取相关的配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据。

   

2、快速使用

源码检出:http://code.taobao.org/svn/diamond/trunk。

阿里中间件——diamond
server搭建
阿里中间件——diamond
阿里中间件——diamond

a. mysql

mysql的安装(安装步骤请自行查阅资料,本人建议按照mysql官方文档),以root用户登录,建立用户并赋予权限,建立数据库,然后建表。脚本如下:


    
      
      
    
  1. create database diamond;

  2. grant all on diamond.* to CK@'%' identified by 'abc';

  3. use diamond

  4. create table config_info (

  5. 'id' bigint(64) unsigned NOT NULL auto_increment,

  6. 'data_id' varchar(255) NOT NULL default ' ',

  7. 'group_id' varchar(128) NOT NULL default ' ',

  8. 'content' longtext NOT NULL,

  9. 'md5' varchar(32) NOT NULL default ' ',

  10. 'gmt_create' datetime NOT NULL default '2010-05-05 00:00:00',

  11. 'gmt_modified' datetime NOT NULL default '2010-05-05 00:00:00',

  12. PRIMARY KEY  ('id'),

  13. UNIQUE KEY 'uk_config_datagroup' ('data_id','group_id')

  14. );

阿里中间件——diamond
完成后,请将数据库的配置信息(IP,用户名,密码)添加到diamond-server工程的src/resources/jdbc.properties文件中的db.url,db.user,db.password属性上面,这里建立的库名,用户名和密码,必须和jdbc.properties中对应的属性相同。


阿里中间件——diamond

b. tomcat

tomcat是diamond server的运行容器,而对于tomcat的安装请自行查阅资料,推荐使用tomcat7和安装tomcat的官方文档。tomcat安装后,不需要做任何改动。

阿里中间件——diamond

c. diamond server

在diamond-server源代码根目录下,执行mvn clean package -Dmaven.test.skip,成功后会在diamond-server/target目录下生成diamond-server.war(如果没有安装maven,请参考maven官方文档进行安装)。打包完成后,将diamond-server.war放在tomcat的webapps目录下。启动tomcat,即启动了diamond-server。

阿里中间件——diamond

d. http server


阿里中间件——diamond
发布数据
阿里中间件——diamond


阿里中间件——diamond
订阅数据
阿里中间件——diamond

diamond客户端API主要提供了订阅数据的功能:

阿里中间件——diamond
a. 客户端获取服务端地址获取服务端地址对客户端是透明的,客户端仅仅需要在本地进行如下域名绑定即可:ip a.b.c,ip为前面搭建的http-server的ip。
阿里中间件——diamond
b. 创建订阅者        

    
      
      
    
  1. DiamondManager manager = new DefaultDiamondManager(group, dataId, new ManagerListener() {

  2. public Executor getExecutor() {

  3. return null;

  4. }

  5. public void receiveConfigInfo(String configInfo) {

  6. // 客户端处理数据的逻辑

  7. }

  8. });

阿里中间件——diamond
参数说明:group和dataId为String类型,二者结合为diamond-server端保存数据的惟一key。ManagerListener 是客户端注册的数据监听器, 它的作用是在运行中接受变化的配置数据,然后回调receiveConfigInfo()方法,执行客户端处理数据的逻辑。如果要在运行中对变化的配置数据进行处理,就一定要注册ManagerListener。



阿里中间件——diamond
c. 获取配置数据    


String configInfo = manager.getAvailableConfigureInfomation(timeout);


阿里中间件——diamond
diamond-server端保存的配置全都为文本类型,返回给客户端的配置数据为java.lang.String类型,timeout为从网络获取配置数据的超时时间。客户端调用每次调用该方法,都能够保证获取一份最新的可用的配置数据。
3、核心原理


a. server集群的数据同步


diamond-server将数据存储在mysql和本地文件中,mysql是一个中心,diamond认为存储在mysql中的数据绝对正确,除此之外,server会将数据存储在本地文件中。

同步数据有两种方式:

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

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




c. client从server获取数据


client调用getAvailableConfigInfomation(), 即可获取一份最新的可用的配置数据,获取过程实际上是拼接http url,使用http-client调用http method的过程。为了避免短时间内大量的获取数据请求发向server,client端实现了一个带有过期时间的缓存,client将本次获取到的数据保存在缓存中,在过期时间内的所有请求,都返回缓存内的数据,不向server发出请求。


d. client运行时感知server的数据变化


这是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请求一次数据,拿回数据后回调监听器。

4、diamond架构

diamond服务是一个集群,是一个去除单点的协作集群。如下图所示:

阿里中间件——diamond

对该图进行一些说明:

阿里中间件——diamond
a. 作为一个配置中心,diamond的功能分为发布和订阅两部分。因为diamond存放的是持久数据,这些数据的变化频率不会很高,甚至很低,所以发布采用手工的形式,通过diamond后台管理界面发布;订阅是diamond的核心功能,订阅通过diamond-client的API进行。
阿里中间件——diamond
阿里中间件——diamond
b. diamond服务端采用mysql加本地文件的形式存放配置数据。发布数据时,数据先写到mysql,再写到本地文件;订阅数据时,直接获取本地文件,不查询数据库,这样可以最大程度减少对数据库的压力。
阿里中间件——diamond
阿里中间件——diamond
c. diamond服务端是一个集群,集群中的每台机器连接同一个mysql,集群之间的数据同步通过两种方式进行,一是每台server定时去mysql dump数据到本地文件,二是某一台server接收发布数据请求,在更新完mysql和本机的本地文件后,发送一个HTTP请求(通知)到集群中的其他几台server,其他server收到通知,去mysql中将刚刚更新的数据dump到本地文件。
阿里中间件——diamond
阿里中间件——diamond
d. 每一台server前端都有一个nginx,用来做流量控制。
阿里中间件——diamond
阿里中间件——diamond
e. 图中没有将地址服务器画出,地址服务器是一台有域名的机器,上面运行有一个HTTP server,其中有一个静态文件,存放着diamond服务器的地址列表。客户端启动时,根据自身的域名绑定,连接到地址服务器,取回diamond服务器的地址列表,从中随机选择一台diamond服务器进行连接。
阿里中间件——diamond
5、容灾机制

diamond容灾机制涉及到client和server两部分,主要包括以下几个方面:

阿里中间件——diamond

a. server存储数据的方式

server存储数据是“数据库 + 本地文件”的方式,集群间的数据同步我们在之前的文章中讲过(请参考专题二的原理部分),client订阅数据时,访问的是本地文件,不查询数据库,这样即使数据库出问题了,仍然不影响client的订阅。

阿里中间件——diamond
阿里中间件——diamond

b. server是一个集群

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

阿里中间件——diamond
阿里中间件——diamond

c. client保存snapshot

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

阿里中间件——diamond
阿里中间件——diamond

d. client校验MD5

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

阿里中间件——diamond
阿里中间件——diamond

e. client与server分离

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

阿里中间件——diamond


根据以上的容灾机制,我们可以总结一下diamond整个系统完全不可用的条件:

数据库不可用;

所有server均不可用;

client主动删除了snapshot;

client没有备份配置数据,导致其不能配置"容灾目录";

本人在公司的线上环境仔细分析过,同时满足这四点条件的概率那是相当小!


阿里中间件——diamond
三、总结
阿里中间件——diamond
阿里中间件——diamond
通过对diamond源码的阅读及架构的分析,可以得出这样一个结论:diamond简单、可靠、易用的特点是相辅相成的,即diamond之所以简单是因为使用的都是一些最常用的技术以及产品,它之所以表现得非常稳定,跟其架构简单是分不开的,当然,稳定的另一个主要原因是它具备一套比较完善的容灾机制。
阿里中间件——diamond
-----
阿里中间件——diamond
-----    

来源:CSDN

链接:点击“阅读原文”即可查看







若有技术难题

可联系小编进技术交流群

若有生活难题

也可联系小编

我们可以从诗词歌赋聊到人生哲学

阿里中间件——diamond

回顾往期精彩文章














说了这么多我只要你关注我





以上是关于阿里中间件——diamond的主要内容,如果未能解决你的问题,请参考以下文章

不改代码也能全面 Serverless 化,阿里中间件如何破解这一难题?

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

阿里分布式中间件Seata从入门到精通

Sublime Text3自定义代码片段

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

Java - 此语言级别不支持 Diamond 类型