`
shenstone2012
  • 浏览: 18491 次
社区版块
存档分类
最新评论

diamond

 
阅读更多

大家好,今天开始为大家带来我们通用产品团队的产品 —— diamond的专题,本次为大家介绍diamond的概况和快速使用。

一、概况

diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单、可靠、易用,目前淘宝内部绝大多数系统的配置,由diamond来进行统一管理。

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

持久配置是指配置数据会持久化到磁盘和数据库中。

diamond的特点是简单、可靠、易用:

简单:整体结构非常简单,从而减少了出错的可能性。

可靠:应用方在任何情况下都可以启动,在承载淘宝核心系统并正常运行一年多以来,没有出现过任何重大故障。

易用:客户端使用只需要两行代码,暴露的接口都非常简单,易于理解。

二、快速使用

1、源代码检出

从以下svn地址检出diamond的源代码:

http://code.taobao.org/svn/diamond/trunk

2、server的搭建

(1)mysql

安装mysql-server的步骤请参考mysql官方文档,安装完毕后,以root用户登录,建立用户并赋予权限,建立数据库,然后建表,语句分别如下:

create database diamond;

grant all on diamond.* to zh@’%’  identified by ‘abc’;

use diamond

create table config_info (

‘id’ bigint(64) unsigned NOT NULL auto_increment,

‘data_id’ varchar(255) NOT NULL default ’ ’,

‘group_id’ varchar(128) NOT NULL default ’ ’,

‘content’ longtext NOT NULL,

‘md5′ varchar(32) NOT NULL default ’ ’,

‘gmt_create’ datetime NOT NULL default ’2010-05-05 00:00:00′,

‘gmt_modified’ datetime NOT NULL default ’2010-05-05 00:00:00′,

PRIMARY KEY  (‘id’),

UNIQUE KEY ‘uk_config_datagroup’ (‘data_id’,'group_id’)

);

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

(2)tomcat

tomcat是diamond server的运行容器。

tomcat的安装请参考tomcat官方文档,建议使用tomcat7

不需要对tomcat进行任何改动。

(3)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

(4)http server

http server用来存放diamond server等地址列表,可以选用任何http server,这里以tomcat为例。

一般来讲,http server和diamond server是部署在不同机器上的,这里简单起见,将二者部署在同一个机器下的同一个tomcat的同一个应用中,注意,如果部署在不同的tomcat中,端口号一定是8080,不能修改(所以必须部署在不同的机器上)。

在(3)的tomcat的webapps中的diamond-server中建立文件diamond,文件内容是diamond-server的地址列表,一行一个地址,地址为IP,例如:

127.0.0.1

完成以上4步后,server端的搭建就完成了。

2、发布数据

diamond发布数据通过手工的方式进行。

在浏览器中输入http://ip:8080/diamond-server/,ip为server搭建的第(2)步中的地址,以user为用户名,123为密码,登录后进入后台管理界面,然后点击“配置信息管理”—— “添加配置信息”,在输入框中输入dataId、group、内容,最后点击“提交”即可。

成功后,可以在“配置信息管理”中查询到发布的数据。

3、订阅数据

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

(1)客户端获取服务端地址

获取服务端地址对客户端是透明的,客户端仅仅需要在本地进行如下域名绑定即可:

ip    a.b.c

ip为前面搭建的http-server的ip

(2)创建订阅者

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

public Executor getExecutor() {

return null;

}

public void receiveConfigInfo(String configInfo) {

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

}

});

参数的说明:

group和dataId为String类型,二者结合为diamond-server端保存数据的惟一key

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

(3)获取配置数据

String configInfo = manager.getAvailableConfigureInfomation(timeout);

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

大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解。本次为大家带来的是diamond核心原理的介绍,主要包括server集群的数据同步、client获取server地址、client从server获取数据、client运行时感知server的数据变化,这四部分。

一、server集群数据同步

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

同步数据有两种方式:

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

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

二、client获取server地址

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

server地址存储在一台具有域名的机器上的HTTP server中,我们称它为地址服务器,diamond-client使用前需要在本地进行正确的域名绑定,启动时它会根据域名绑定,去对应环境的地址服务器上获取diamond-server地址列表。

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

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

三、client主动获取数据

client调用getAvailableConfigInfomation(), 即可获取一份最新的可用的配置数据,获取过程实际上是拼接http url,使用http-client调用http method的过程。

为了避免短时间内大量的获取数据请求发向server,client端实现了一个带有过期时间的缓存,client将本次获取到的数据保存在缓存中,在过期时间内的所有请求,都返回缓存内的数据,不向server发出请求。

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

大家好,这次为大家带来的是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之所以表现的稳定可靠,除了架构简单之外,另一个重要原因是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整个系统完全不可用的条件:

1、数据库不可用。

2、所有server均不可用。

3、client主动删除了snapshot

4、client没有备份配置数据,导致其不能配置“容灾目录”。

同时满足以上4个条件的概率,在生产环境中是极小的。

以上就是diamond的容灾机制,接下来的专题文章会带大家一起探究diamond的实现细节。

分享到:
评论

相关推荐

    Lattice Diamond 3.1 User Guide

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

    diamond 中文版 lattice软件

    《Lattice Diamond中文版软件详解》 在计算机科学与电子工程领域,电路设计是一项至关重要的工作,而Lattice公司的Diamond软件则是其中的一款杰出工具。它为用户提供了丰富的硬件描述语言(HDL)编译、仿真、综合...

    diamond3_读取_micaps_diamond3_气象_3类数据_

    标题中的“diamond3_读取_micaps_diamond3_气象_3类数据_”表明我们要讨论的是如何利用特定的工具或方法读取Micaps系统中的Diamond3格式的气象数据,这涉及到3种不同类型的数据。这里,我们将深入探讨Diamond3数据...

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

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

    taobao Diamond 部分maven jar包

    **淘宝Diamond Maven Jar包详解** 淘宝Diamond是一款由阿里巴巴开源的分布式配置中心,它主要用于解决大规模分布式系统中的配置管理问题。在大型互联网企业中,随着系统的复杂度增加,配置的管理和更新变得越来越...

    Diamond 3.9 lisence万能版.zip

    《Lattice Diamond 3.9 License 万能版解析与应用》 在电子设计自动化(EDA)领域,Lattice Diamond 是一款广泛使用的 FPGA 设计工具,由 Lattice Semiconductor 公司提供。它集成了逻辑综合、布局布线、仿真、硬件...

    Lattice Diamond官网下载简明教程

    《Lattice Diamond官方下载简明教程》 在电子设计领域,FPGA(Field-Programmable Gate Array)因其灵活性和高性能而被广泛应用。Lattice Semiconductor公司是一家知名的FPGA解决方案提供商,其开发工具Lattice ...

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

    ### 美国钻石公司数据采集卡DIAMOND-MM-32-AT 技术手册 #### 描述 美国钻石公司的DIAMOND-MM-32-AT是一款高性能的数据采集卡,采用PC/104格式设计,具备全面的功能。该模块提供32路模拟输入通道(16位分辨率),可...

    Lattice Diamond 3.12 Reveal User Guide

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

    diamond picture.c

    diamond

    Black_Diamond_EA (1)_forexearobot_forex_Diamond_DiamondEA下载_blac

    《黑钻EA(1):外汇交易的钻石策略解析》 在外汇交易的世界里,一款优秀的自动交易系统能够为投资者带来稳定且高效的投资回报。"Black_Diamond_EA (1)_forexearobot_forex_Diamond_DiamondEA下载_blac" 提到的...

    lattice diamond 3.7 license

    《Lattice Diamond 3.7 License详解》 在电子设计自动化(EDA)领域,Lattice Semiconductor公司的Lattice Diamond是一款至关重要的软件工具。该软件专为编程、仿真和设计莱迪思(Lattice)系列的现场可编程逻辑门...

    Diamond软件

    《Diamond软件:绘制晶体结构的得力助手》 在理论计算领域,理解并模拟晶体结构是至关重要的。而Diamond软件,作为一个专为晶体结构展示和分析设计的强大工具,深受科研人员喜爱。它以其直观的界面、强大的功能以及...

    Night Diamond五套指针.rar

    在"Night Diamond五套指针"这个压缩包中,包含了五种不同风格的夜光钻石指针设计,每一种都独具匠心,将钻石的璀璨与夜晚的神秘完美结合。这些指针在黑暗环境中尤为引人注目,不仅美观,还增加了操作的辨识度。 ...

    Crystal Impact Diamond 3.1破解补丁

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

    Lattice_Diamond_Crack

    Lattice Diamond的有效破解在网上目前找不到,这个是我从厂家要到的,亲测Lattice_Diamond.2.0.0.154有效破解

    lattice Diamond多种解密方法

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

    diamond客户端使用方法.docx

    ### Diamond客户端使用方法详解 #### 一、简介 本文档主要介绍了如何使用Diamond客户端进行配置管理,适用于希望采用Diamond作为其应用配置管理解决方案的企业或个人开发者。Diamond客户端是一款基于Java开发的...

    作品:《Sea Diamond》 .rar

    《Sea Diamond》是一款创新性的数字艺术作品,其RAR压缩包包含了一系列与该作品相关的文件,为用户或客户提供全面的信息和资源。RAR是一种流行的文件压缩格式,由RarLab开发,常用于存储和传输大量数据。它能有效地...

    Diamond晶体结构绘制软件教程

    ### Diamond晶体结构绘制软件知识点详解 #### 一、Diamond软件简介 **Diamond**是一款专业的晶体与分子结构可视化软件,主要用于绘制高质量的晶体结构图像。它适用于科学研究、教学演示以及学术出版等多个领域。...

Global site tag (gtag.js) - Google Analytics