设计网站公司专注y湖南岚鸿知 名,wordpress放tomcat,网站色哦优化8888,合肥网络推广优化公司一、前言 最近工作不忙闲来无事#xff0c;仔细分析了公司整个项目架构#xff0c;发现用到了很多阿里巴巴集团开源的框架#xff0c;今天要介绍的是中间件diamond.
二、diamond学习笔记 1、diamond简介 diamond是一个管理持久配置#xff08;持久配置是指配置数据会持久化…一、前言 最近工作不忙闲来无事仔细分析了公司整个项目架构发现用到了很多阿里巴巴集团开源的框架今天要介绍的是中间件diamond.
二、diamond学习笔记 1、diamond简介 diamond是一个管理持久配置持久配置是指配置数据会持久化到磁盘和数据库中的系统。无可厚非淘宝内部正在使用diamond在淘宝内部的绝大多数系统的配置都是由diamond统一管理的。diamond最大的特点就是简单、可靠、易用。diamond的简单是指diamond整体结构非常简单从而减少了出错的可能性diamond的可靠是指应用方在任何情况下都可以启动例如淘宝的核心系统最初一年多是由diamond所管理在这期间并没有发生什么大的故障diamond的易用是指客户端使用只需要两行代码暴露出的接口都非常简单易于理解。 对于应用系统而言diamond为其提供获取配置的服务应用不仅可以在启动时从diamond获取相关的配置而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据。 2、快速使用 源码检出http://code.taobao.org/svn/diamond/trunk。 server搭建 a. mysql mysql的安装安装步骤请自行查阅资料本人建议按照mysql官方文档以root用户登录建立用户并赋予权限建立数据库然后建表。脚本如下
create database diamond;
grant all on diamond.* to CK% 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.urldb.userdb.password属性上面这里建立的库名用户名和密码必须和jdbc.properties中对应的属性相同。 b. tomcat tomcat是diamond server的运行容器而对于tomcat的安装请自行查阅资料推荐使用tomcat7和安装tomcat的官方文档。tomcat安装后不需要做任何改动。 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。 d. http server http server用来存放diamond server等地址列表可以选用任何http server这里以tomcat为例。一般来讲http server和diamond server是部署在不同机器上的这里简单起见将二者部署在同一个机器下的同一个tomcat的同一个应用中注意如果部署在不同的tomcat中端口号一定是8080不能修改所以必须部署在不同的机器上。在上一步的tomcat的webapps中的diamond-server中建立文件diamond文件内容是diamond-server的地址列表一行一个地址地址为IP例如127.0.0.1。完成以上4步后server端的搭建就完成了。 发布数据 diamond发布数据通过手工的方式进行。在浏览器中输入http://ip:8080/diamond-server/ip为server搭建的第二步中的地址以user为用户名123为密码登录后进入后台管理界面然后点击“配置信息管理”—— “添加配置信息”在输入框中输入dataId、group、内容最后点击“提交”即可。成功后可以在“配置信息管理”中查询到发布的数据。 订阅数据 diamond客户端API主要提供了订阅数据的功能 a. 客户端获取服务端地址 获取服务端地址对客户端是透明的客户端仅仅需要在本地进行如下域名绑定即可ip a.b.cip为前面搭建的http-server的ip。 b. 创建订阅者 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。 c. 获取配置数据 String configInfo manager.getAvailableConfigureInfomation(timeout); diamond-server端保存的配置全都为文本类型返回给客户端的配置数据为java.lang.String类型timeout为从网络获取配置数据的超时时间。客户端调用每次调用该方法都能够保证获取一份最新的可用的配置数据。 2、核心原理 diamond核心原理主要包括server集群的数据同步、client获取server地址、client从server获取数据、client运行时感知server的数据变化这四部分。 a. server集群的数据同步 diamond-server将数据存储在mysql和本地文件中mysql是一个中心diamond认为存储在mysql中的数据绝对正确除此之外server会将数据存储在本地文件中。 同步数据有两种方式 server写数据时先将数据写入mysql然后写入本地文件写入完成后发送一个HTTP请求给集群中的其他server其他server收到请求从mysql中dump刚刚写入的数据至本地文件。 server启动后会启动一个定时任务定时从mysql中dump所有数据至本地文件。 b. client获取server地址 diamond-client在使用时没有指定server地址的代码地址获取对用户是透明的。server地址存储在一台具有域名的机器上的HTTP server中我们称它为地址服务器diamond-client使用前需要在本地进行正确的域名绑定启动时它会根据域名绑定去对应环境的地址服务器上获取diamond-server地址列表。获取的地址列表会保存在client本地当出现网络异常无法从网络获取地址列表时client会使用本地保存的地址列表。client启动后会启动一个定时任务定时从HTTP server上获取地址列表并保存在本地以保证地址是最新的。 c. client从server获取数据 client调用getAvailableConfigInfomation() 即可获取一份最新的可用的配置数据获取过程实际上是拼接http url使用http-client调用http method的过程。为了避免短时间内大量的获取数据请求发向serverclient端实现了一个带有过期时间的缓存client将本次获取到的数据保存在缓存中在过期时间内的所有请求都返回缓存内的数据不向server发出请求。 d. client运行时感知server的数据变化 这是diamond最为核心的一个功能。这个特性是通过比较client和server的数据的MD5值实现的。server在启动时会将所有数据的MD5加载到内存中MD5根据某算法得出保证数据内容不同MD5不同MD5存储在mysql中数据更新时会更新内存中对应的MD5。client在启动并第一次获取数据后会将数据的MD5保存在内存中并且在启动时会启动一个定时任务定时去server检查数据是否变化。每次检查时client将MD5传给serverserver比较传来的MD5和自身内存中的MD5是否相同如果相同说明数据没变返回一个标示数据不变的字符串给client如果不同说明数据变了返回变化数据的dataId和group给client. client收到变化数据的dataId和group再去server请求一次数据拿回数据后回调监听器。 3、diamond架构 diamond服务是一个集群是一个去除单点的协作集群。如下图所示 对该图进行一些说明 a. 作为一个配置中心diamond的功能分为发布和订阅两部分。因为diamond存放的是持久数据这些数据的变化频率不会很高甚至很低所以发布采用手工的形式通过diamond后台管理界面发布订阅是diamond的核心功能订阅通过diamond-client的API进行。 b. diamond服务端采用mysql加本地文件的形式存放配置数据。发布数据时数据先写到mysql再写到本地文件订阅数据时直接获取本地文件不查询数据库这样可以最大程度减少对数据库的压力。 c. diamond服务端是一个集群集群中的每台机器连接同一个mysql集群之间的数据同步通过两种方式进行一是每台server定时去mysql dump数据到本地文件二是某一台server接收发布数据请求在更新完mysql和本机的本地文件后发送一个HTTP请求通知到集群中的其他几台server其他server收到通知去mysql中将刚刚更新的数据dump到本地文件。 d. 每一台server前端都有一个nginx用来做流量控制。 e. 图中没有将地址服务器画出地址服务器是一台有域名的机器上面运行有一个HTTP server其中有一个静态文件存放着diamond服务器的地址列表。客户端启动时根据自身的域名绑定连接到地址服务器取回diamond服务器的地址列表从中随机选择一台diamond服务器进行连接。 4、容灾机制 diamond容灾机制涉及到client和server两部分主要包括以下几个方面 a. server存储数据的方式 server存储数据是“数据库 本地文件”的方式集群间的数据同步我们在之前的文章中讲过请参考专题二的原理部分client订阅数据时访问的是本地文件不查询数据库这样即使数据库出问题了仍然不影响client的订阅。 b. server是一个集群 这是一个基本的容灾机制集群中的一台server不可用了client发现后可以自动切换到其他server上进行访问自动切换在client内部实现。 c. client保存snapshot client每次从server获取到数据后都会将数据保存在本地文件系统diamond称之为snapshot即数据快照。当client下次启动发现在超时时间内所有server均不可用可能是网络故障它会使用snapshot中的数据快照进行启动。 d. client校验MD5 client每次从server获取到数据后都会进行MD5校验数据保存在response bodyMD5保存在response header以防止因网络故障造成的数据不完整MD5校验不通过直接抛出异常。 e. client与server分离 client可以和server完全分离单独使用diamond定义了一个“容灾目录”的概念client在启动时会创建这个目录每次主动获取数据即调用getAvailableConfigInfomation()方法都会优先从“容灾目录”获取数据如果client按照一个固定的规则在“容灾目录”下配置了需要的数据那么client直接获取到数据返回不再通过网络从diamond-server获取数据。同样的在每次轮询时都会优先轮询“容灾目录”如果发现配置还存在于其中则不再向server发出轮询请求。 以上的情形 会持续到“容灾目录”的配置数据被删除为止。 根据以上的容灾机制我们可以总结一下diamond整个系统完全不可用的条件 数据库不可用 所有server均不可用 client主动删除了snapshot client没有备份配置数据导致其不能配置容灾目录 本人在公司的线上环境仔细分析过同时满足这四点条件的概率那是相当小
三、总结 通过对diamond源码的阅读及架构的分析可以得出这样一个结论diamond简单、可靠、易用的特点是相辅相成的即diamond之所以简单是因为使用的都是一些最常用的技术以及产品它之所以表现得非常稳定跟其架构简单是分不开的当然稳定的另一个主要原因是它具备一套比较完善的容灾机制。