淘宝Diamond架构分析

花了两天的时间研究了下Diamond,因为写得比较急,而且并没有使用过,只是单纯的做逆向建模,所以难免会有细节缺失,后面会时不时过来看看,然后做些补充。

背景知识

比较早的时候,应用一般都是单体的,配置修改后,只要通过预留的管理界面刷新进行reload即可。

慢慢的,应用都主动或被动被拆分,从单一系统拆分成多个子系统,每个子系统还会对应多个运行实例。此时就面临多个问题:

1. 配置分散在多个业务子系统里,对同一配置的翻译在多个子系统里经常不一致。比如订单和购物车都有货币类型的配置,如果购物车上了一种新的货币类型而订单却没有相应同步增加配置项就会造成程序错误。

2. 将配置收敛成一个公有服务后,以上情况开始好转,但是又带来其他问题。在复杂应用里,修改一个配置项后,无法确切的知道需要刷新哪些相关子系统。最终只能做全量刷新,甚至是停机发布。这对于一些停机敏感的行业例如电商几乎是无法接受的。

3. 配置收敛后,成为了应用中的单点,配置如果挂了,相应的应用也会跟着产生异常甚至也挂掉,配置服务器需要保证高可用。

Diamond就是为了解决这些问题而产生的。

Diamond的配置类型

配置是Diamond的核心域,也是Diamond致力于去解决的问题。首先看下Diamond的两个主要配置类型– single和aggr。二者结构如下:

ConfigInfo ConfigInfoAggr

dataId dataId

group group

content content

md5 datumId

appName appName

Aggr没有md5多一个datumId。md5是用于校验数据是否一致对配置数据进行md5编码生成的字符串。Aggr显然不是一个完整的配置项,因为没有md5就无法校验配置是否改变。Aggr会通过后台的定时任务转成single,最后一节会做具体介绍。

整体架构设计

下图是Diamond的组件视图。Diamond主要有ops, sdk, client和server 4个组件。Ops是运维用的配置工具,主要用于下发以及查询配置等;server则是Diamond的后台,处理配置的一些逻辑;sdk则是提供给ops或者其他第三方应用的开发工具包;client则是编程api,它和sdk乍看有点像,其实差别很大,sdk是用于构建前台运维配置程序的,本质是对数据的维护,而client则是这些数据的消费者,事实上准确的说是diamond的消费者们(各子系统)都是通过client组件对server访问。

配置是保存在mysql数据的,为了避免数据库被峰值访问压垮,Diamond server通过local file做本地缓存,来自各子系统访问压力都被分摊到了server集群的各个节点。

Diamond server是无中心节点的逻辑集群,这样就能避免单点故障。Diamond的同质节点之间会相互通信以保证数据的一致性,每个节点都有其它节点的地址信息,其中一个节点发生数据变更后会响应的通知其他节点,保证数据的一致性。

为了保证高可用,client还会在app端缓存一个本地文件,这样即使server不可用也能保证app可用。Client不断长轮询server,获取最新的配置推送,尽量保证本地数据的时效性。

长轮询

Client默认启动周期任务对server进行长轮询感知server的配置变化,server感知到配置变化就发送变更的数据编号,客户端通过数据编号再去拉取最新配置数据;否则超时结束请求(默认10秒)。拉取到新配置后,client会通知监听者(MessageListener)做相应处理,用户可以通过Diamond#addListener监听。

服务端通过AsyncContext对请求做非阻塞处理,通过定时任务感知配置变化。

详细描述下上图,

1. server收到请求后启动AsyncContext,并基于它构造ClientLongPulling。ClientLongPulling除了AsyncContext还有一个超时回复任务对长轮询请求做超时处理

2. 之后ClientLongPulling被加入等待列表。LongPullingService关联一个感知数据变化的定时任务,当有数据变化时,就会循环等待列表里的ClientLongPulling,推送数据变化回客户端。

4. Dump是抽象出来的一块儿概念,server的数据变化都会触发响应的dump task,并会发送相应的事件,由server感知,DataChangeTask也是一个事件监听者,能感知local file的数据变化。

服务端架构设计

再来看一下server的架构设计。第二节介绍过Diamond集群是去中心化的,并且会通过通知机制保证集群各节点数据一致。

1. Diamond集群内每个节点都有其他节点的地址信息,当一台节点对配置做了修改后会触发ConfigDataChangeEvent,从而触发通知所有节点数据变更的任务。这里需要注意的一点是通知所有节点也包括自己,下发配置的请求只会更新数据库,并不会更新本地文件缓存。

2. 通知发送到所有节点后,通过dump更新local file,更新完毕后发送LocalDataChangeEvent,之后就是上节提到的过程。

为了保证Diamond的数据一致性,server还会run一些其他任务,如下图:

1. DumpAllTask会6小时run一次做全量dump,删除老的缓存数据,全量生成新缓存。

2. DumpChangeTask做增量dump。通过和数据库的配置做md5对比,删除被移除配置的文件缓存,更新有md5不一致的文件缓存等等。

3. 清除历史数据是用于清除1周前的数据库his表数据。

4. merge把dataId相同的aggr合并成单条single,插入到数据库,并触发相应的配置变更事件,见上节。

5. 心跳任务用于记录心跳时间,节点服务重启时会判断距离上次心跳时间是否已经超过一小时,超过一小时则做全量dump,否则做增量。

剩下的都很好理解,不再一一介绍,需要注意的是,这些任务里并不是所有的都是定时做,有些事事件触发的,例如DumpTask;还有些是Diamond服务启动时触发的,如merge,DumpChangeTask。

时间: 2024-10-09 06:19:00

淘宝Diamond架构分析的相关文章

淘宝网系统架构分析以及数据库架构简介

一个成熟的大型网站(如淘宝.京东等)的系统架构需要考虑诸多复杂的因素,因为像淘宝这种大型网站数据量比一般的网站要大的多,所以在设计架构方面也要复杂的多,既要考虑成本因素也要考虑访问速度安全性等.这里我简单的对淘宝的网站系统架构进行一个简单的分析. 淘宝作为一个大型购物网站,其数据量是很大的,所以不像一般网站,淘宝需要用各种方法来保证服务器的正常运行以及用户购买时的良好体验.主要由以下方式:1.应用.数据.文件分离 2.利用缓存改善网站性能 3.使用CDN和反向代理提高访问速度 4.使用分布式文件

淘宝网架构分析——反向代理

一 .概述 反向代理方式是指以代理服务器来接受Internet上的连接请求,将该请求转发给内部网络上的服务器,之后将内部服务器的结果返回给客户端. 通常的代理服务器,只用于代理内部网络对Internet的连接请求,需要在Internet上搜寻多个不确定的服务器.因此,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中. 反向代理服务器能够代理外部网络上的主机,针对Internet上多个客户机的请求访问某一个固定的服务器.  二 .反向代理服务器模型 反向

从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)

从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇,而神奇的东西常能勾起我的兴趣,在看过介绍它们的文章或论文之后,认为Hadoop是一项富有趣味和挑战性的技术,且它还牵扯到了一个我更加感兴趣的话题:海量数据处理. 由此,近期凡是空暇时,便在看"Hadoop","MapReduce""海量数据处理"这方面的论文.但在看论

淘宝网质量分析

淘宝网质量分析,质量属性的六个场景(quality attribute scenario): 可用性(availability):淘宝网在我使用的时候没有出现崩溃现象,但是有时会在访问量过多时不能正确显示界面,会提示页面出现错误,需要刷新一下. 刺激源:用户 刺激:网站登录用户过多,不能显示出相应页面 制品:商品页面 环境:超载环境 响应:请用户刷新页面,来显示正确的网页 响应度量:刷新一下,在2s以内即可恢复网页 可修改性(modifiability):淘宝网店家经常换一些商品 刺激源:淘宝店

淘宝的架构

淘宝用的是JBoss,框架是iBATIS,缓存服务器是自己开发的,基本遵循SNA架构,水平扩展,数据库是Oracle,阿里集团的DBA几乎是国内最强悍的.目前淘宝的系统架构正在重构,计划用两到三年时间重写,目标有两个:1.水平扩展已经不满足需求了,还需要水平加垂直扩展 2.开放API,让店家可以把外部网站资源集成到淘宝,不必直接在淘宝开店淘宝首席架构师是原来JBoss的Ben Wang,现在正在招募技术高手加盟,从事这项很有挑战性的工作:设计下一代开放性.支撑数十亿访问量的在线电子商务网站 淘宝

淘宝店铺装修教程之下载淘宝视频及分析视频地址中的高逼格信息

摘要: 关于淘宝视频方面的教程,艺灵已写过好几篇了,唯独没有下载的教程,然后群内小伙伴也一直问这个问题,所以特写此教程,内含信息量巨大,看官慎入...... 一.起因 还是因为刚有群友在群里问这个问题,已会的神人请无视这篇基础教程. 在讲如何下载淘宝视频之前,不得不把之前写的几篇教程拿出来,要不然那谁又该问:怎么上传淘宝视频.怎么获取淘宝视频链接.店铺中怎么安装淘宝视频.详情页中怎么放淘宝视频等等问题.如果看官对刚提的几点有疑惑,请先看完下面几篇教程文章后再回来继续看这篇文章. 二.淘宝视频相关

从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)

从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇.而神奇的东西常能勾起我的兴趣.在看过介绍它们的文章或论文之后,认为Hadoop是一项富有趣味和挑战性的技术,且它还牵扯到了一个我更加感兴趣的话题:海量数据处理. 由此,近期凡是空暇时,便在看"Hadoop"."MapReduce""海量数据处理"这方面的论文.但在看论

海量数据处理之从Hadoop框架与MapReduce模式中谈海量数据处理(淘宝技术架构)

几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,觉得它们很是神秘,而神秘的东西常能勾起我的兴趣,在看过介绍它们的文章或论文之后,觉得Hadoop是一项富有趣味和挑战性的技术,且它还牵扯到了一个我更加感兴趣的话题:海量数据处理. 由此,最近凡是空闲时,便在看"Hadoop","MapReduce""海量数据处理"这方面的论文.但在看论文的过程中,总觉得那些论文都是浅尝辄止,常常看的很不过瘾,总是一个东

淘宝整体架构

一应用无状态(淘宝session框架) 假如在session中保存了大量与客户端的状态信息,保存状态信息的server宕机时 通常通过集群解决,不仅有负载均衡,更重要的是要有失效恢复failover tomcat用集群节点广播复制,jboss用配对复制等session状态复制策略,但严重影响系统的伸缩性,不能通过增加更多的机器达到良好的水平伸缩 因为集群节点间session通信随着节点的增多而开销增大,因此要想做到应用本身的伸缩性,要保证应用无状态,这样集群中的各个节点来说都是相同的,使系统更好