淘宝分布式配置管理服务Diamond

在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理这些应用服务的配置问题。应用场景可概括为:

  zookeeper的一种应用就是分布式配置管理(基于ZooKeeper的配置信息存储方案的设计与实现)。百度也有类似的实现:disconf。

  Diamond则是淘宝开源的一种分布式配置管理服务的实现。Diamond本质上是一个Java写的Web应用,其对外提供接口都是基于HTTP协议的,在阅读代码时可以从实现各个接口的controller入手。

  分布式配置管理

  分布式配置管理的本质基本上就是一种推送-订阅模式的运用。配置的应用方是订阅者,配置管理服务则是推送方。概括为下图:

  其中,客户端包括管理人员publish数据到配置管理服务,可以理解为添加/更新数据;配置管理服务notify数据到订阅者,可以理解为推送。

  配置管理服务往往会封装一个客户端库,应用方则是基于该库与配置管理服务进行交互。在实际实现时,客户端库可能是主动拉取(pull)数据,但对于应用方而言,一般是一种事件通知方式。

  Diamond中的数据是简单的key-value结构。应用方订阅数据则是基于key来订阅,未订阅的数据当然不会被推送。数据从类型上又划分为聚合和非聚合。因为数据推送者可能很多,在整个分布式环境中,可能有多个推送者在推送相同key的数据,这些数据如果是聚合的,那么所有这些推送者推送的数据会被合并在一起;反之如果是非聚合的,则会出现覆盖。

  数据的来源可能是人工通过管理端录入,也可能是其他服务通过配置管理服务的推送接口自动录入。

  架构及实现

  Diamond服务是一个集群,是一个去除了单点的协作集群。如图:


服务之间同步

  Diamond服务集群每一个实例都可以对外完整地提供服务,那么意味着每个实例上都有整个集群维护的数据。Diamond有两种方式保证这一点:

  任何一个实例都有其他实例的地址;任何一个实例上的数据变更时,都会将改变的数据同步到mysql上,然后通知其他所有实例从mysql上进行一次数据拉取(DumpService::dump),这个过程只拉取改变了的数据

  任何一个实例启动后都会以较长的时间间隔(几小时),从mysql进行一次全量的数据拉取(DumpAllProcessor)

  实现上为了一致性,通知其他实例实际上也包含自己。以服务器收到添加聚合数据为例,处理过程大致为:

DatumController::addDatum // /datum.do?method=addDatum

PersistService::addAggrConfigInfo

MergeDatumService::addMergeTask // 添加一个MergeDataTask,异步处理

MergeTaskProcessor::process

PersistService::insertOrUpdate

EventDispatcher.fireEvent(new ConfigDataChangeEvent // 派发一个ConfigDataChangeEvent事件

NotifyService::onEvent // 接收事件并处理

TaskManager::addTask(..., new NotifyTask // 由此,当数据发生变动,则最终创建了一个NoticyTask

// NotifyTask同样异步处理

NotifyTaskProcessor::process

foreach server in serverList // 包含自己

notifyToDump // 调用 /notify.do?method=notifyConfigInfo 从mysql更新变动的数据

DatumController::addDatum // /datum.do?method=addDatum

PersistService::addAggrConfigInfo

MergeDatumService::addMergeTask // 添加一个MergeDataTask,异步处理

MergeTaskProcessor::process

PersistService::insertOrUpdate

EventDispatcher.fireEvent(new ConfigDataChangeEvent // 派发一个ConfigDataChangeEvent事件

NotifyService::onEvent // 接收事件并处理

TaskManager::addTask(..., new NotifyTask // 由此,当数据发生变动,则最终创建了一个NoticyTask

// NotifyTask同样异步处理

NotifyTaskProcessor::process

foreach server in serverList // 包含自己

notifyToDump // 调用 /notify.do?method=notifyConfigInfo 从mysql更新变动的数据

  虽然Diamond去除了单点问题,不过问题都下降到了mysql上。但由于其作为配置管理的定位,其数据量就mysql的应用而言算小的了,所以可以一定程度上保证整个服务的可用性。

  数据一致性

  由于Diamond服务器没有master,任何一个实例都可以读写数据,那么针对同一个key的数据则可能面临冲突。这里应该是通过mysql来保证数据的一致性。每一次客户端请求写数据时,Diamond都将写请求投递给mysql,然后通知集群内所有Diamond实例(包括自己)从mysql拉取数据。当然,拉取数据则可能不是每一次写入都能拉出来,也就是最终一致性。

  Diamond中没有把数据放入内存,但会放到本地文件。对于客户端的读操作而言,则是直接返回本地文件里的数据。

  服务实例列表

  Diamond服务实例列表是一份静态数据,直接将每个实例的地址存放在一个web server上。无论是Diamond服务还是客户端都从该web server上取出实例列表。

  对于客户端而言,当其取出了该列表后,则是随机选择一个节点(ServerListManager.java),以后的请求都会发往该节点。

  数据同步

  客户端库中以固定时间间隔从服务器拉取数据(ClientWorker::ClientWorker,ClientWorker::checkServerConfigInfo)。只有应用方关心的数据才可能被拉取。另外,为了数据推送的及时,Diamond还使用了一种long polling的技术,其实也是为了突破HTTP协议的局限性。如果整个服务是基于TCP的自定义协议,客户端与服务器保持长连接则没有这些问题。

  数据的变更

  Diamond中很多操作都会检查数据是否发生了变化。标识数据变化则是基于数据对应的MD5值来实现的。

  容灾

  在整个Diamond系统中,几个角色为了提高容灾性,都有自己的缓存,概括为下图:

  每一个角色出问题时,都可以尽量保证客户端对应用层提供服务。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-07-30 11:49:03

淘宝分布式配置管理服务Diamond的相关文章

淘宝快速支付服务已关闭怎么回事?

  截至目前,登录手机淘宝购买彩票快速支付功能仍无法正常使用,并直接跳转至页面提示"淘宝快速支付服务已关闭",据了解,此情况已持续数小时. 支付宝解释称,原因是支付宝和淘宝彩票关于快速支付的协议到期了.这个续签就可以继续使用,稍后便可恢复.淘宝方面人士表示用户暂时可通过其他支付渠道进行彩票购买.

加入淘宝网消费者保障服务才可投保

华泰保险推出一款为淘宝卖家量身打造的退货运费保险受买家追捧.CFP供图 记者从淘宝网了解到,在当前的退款交易纠纷中,有42%是由于买卖双方对退货邮费问题协商不一致产生的,尤其是母婴.服装等由于产品特性造成退货相对较多行业的卖家.近日,华泰保险推出一款为淘宝卖家量身打造的退货运费保险,投保该款保险的淘宝卖家,一旦发生退货,退货运费将由保险公司承担.对此险的推出,淘宝买家.卖家看法不一,退货运费险,真的可以共赢吗? 加入淘宝网消费者保障服务才可投保 据介绍,该款保险的保费根据卖家前三个月的退货率确定

淘宝分布式框架fourinone

淘宝分布式框架fourinone 彭渊 •分布式幵行计算•分布式协调•分布式缓存•消息队列•FTTP分布式文件操作•分布式作业调度平台•应用场景:上亿数据排序 淘宝分布式框架fourinone

党代表在淘宝上卖服务

浙江在线04月21日讯这几年来,杭州市基层党建里头冒出来的一些新做法,比如上城区的"湖滨晴雨"http://www.aliyun.com/zixun/aggregation/6918.html">工作室,拱墅区的"党代表网上工作室"等,获得好评如潮,"有事找党代表",也成了许多人的"口头禅". 4月20日,杭州的13位区.县(市)委书记就2011年度履行基层党建工作责任制的情况进行述职,并通过网络进行直播,说说

淘宝消保服务升级 卖家大额保证金不再冻结

1.淘宝消保服务升级 卖家大额保证金不再冻结 淘宝网的消保服务规则日前进行了升级,卖家缴纳保障金,可以选择通过现金方式进行缴纳或者通过购买"保险计划"实现.该保险计划是由众安保险为淘宝集市卖家量身订做的保证金保险.即卖家在缴纳少量保费后,卖家无需在支付账户冻结消保保证金,即可获得消费者保障服务资格. 2.手机淘宝引入第三方导购平台 提供个性化推荐 近日,手机淘宝开始尝试与果库.想去等第三方导购平台进行合作,并引入专业的第三方"导购员",为手机网购用户提供个性化的购物

站长网每日播报:视频价格战难结束 淘宝推地图服务

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 站长网每日播报:视频业价格战难结束 淘宝推地图服务 1.影视剧版权价格"假摔" 视频业价格战难言结束 视频网站今年年中开始向外释放的"版权价格大跳水"信号可能只是"局部真相",断言视频业版权价格战"彻底结束"或许为时尚早. "影视剧版权价格大幅回落三分之二","以前一部剧180万/每集,现在最高50万""视频业版权大战已无

7万实名阿姨入手机淘宝 不满意服务可打差评

手机淘宝可以预约家政服务了,找阿姨像手机话费充值一样简单外,还可以根据服务满意不满意,给好评或差评了.3月25日,http://www.aliyun.com/zixun/aggregation/7792.html">手机淘宝宣布正式推出便捷可靠的 家政服务平台--生活家.首批开通北京.上海.广州.深圳.杭州.武汉.天津.太原.西安.运城.吉林.济南.南通.绵阳.自贡15个城市,7万名家政阿 姨实名认证入驻手机淘宝.通过手机淘宝APP下单,只需30秒,就能找到经过正规培训的阿姨,为你提供家政

电商巨头再发力 淘宝推出地图服务

中介交易 SEO诊断 淘宝客 云主机 技术大厅 苹果上月在iOS 6中弃用谷歌地图的决定看来不仅为一干小众公司创造了机会,无论是导航服务公司高德,还是中国搜索巨头百度公司都为苹果的这一决策感到欣慰,因为他们能够凭借自己深耕中国市场多年的技巧与经验为大陆消费者带来更加贴心的体验.不过,随着中国电子商务巨头阿里巴巴的贸然闯入,巨头间的地图战争似乎还会持续更久. 作为谷歌在中国市场最强劲的竞争对手之一,百度在谷歌地图搁浅之后的几天内迅速推出了升级版的地图服务--百度地图4.0,这一产品目前已在苹果的A

淘宝分布式数据处理实践

近日,由中科院计算所主办的"Hadoop 中国2010云计算大会"在北京召开,今年已是第四届举办.包括百度.淘宝和中移动在内的诸多企业都展示了基于Hadoop的应用.在本次大会上淘宝数据平台及产品部基础研发组周敏介绍了淘宝对Hadoop的功能扩展和改造,分布式数据仓库的构思,并着重介绍了对Hive实践以及改造.以下是周敏在本次大会的ppt节选. 淘宝数据图 淘宝望目前有会员2亿左右,日均UV高达4000万,日交易量高达数亿元,每天产生大量的数据,所以部署了一个大规模的Hadoop集群,