转载请注明:@ni掌柜 nileader@gmail.commysql
本文主要是讨论下两个相似产品:ZooKeeper和Diamond在配置管理这个应用场景上的异同点。算法
Diamond,顾名思义,寄寓了开发人员对产品稳定性的厚望,但愿它像钻石同样,提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核心产品之一,服务于集团线上不少核心应用。目前已经开源,开源地址在:http://code.taobao.org/p/diamond/wiki/index/。sql
数据持久性数据库
Diamond主要针对的是持久数据,这些数据有个共同的特色是:集群中一批机器都会使用,可是数据的更新频率不大,且但愿diamond可以永久存储。服务器
ZooKeeper便可以存储持久数据,也能够存储非持久数据。持久数据和diamond中的持久数据都相似,所谓的非持久数据是指这些数据的生命周期和数据建立者的会话生命周期绑定,一旦会话结束,那么这些非持久数据也会被清除。网络
推拉模型数据结构
本质上,两个产品都是“拉”模式的,即都是经过客户端本身去服务器获取最新数据。具体实现上,两个产品分别以下:运维
在Diamond中,客户端每隔15s轮询服务器,比对数据是否更新,从而获取最新数据。分布式
在ZooKeeper中,则是经过客户端对相应的数据path注册Watcher,当数据有更新的时候,服务器会有事件通知,注意,这个通知仅仅是告诉客户端对应的数据有更新了,具体数据内容须要客户端根据本身的状况来决定是否须要获取最新数据。所以在实时性方面,ZooKeeper比Diamond高一些。ide
服务器数据存储
在数据存储上,ZooKeeper和Diamond差异比较大。
首先来看下Diamond的数据存储。Diamond的数据存储以mysql数据库为中心,全部在mysql中的数据都是最新的,客户端的全部写请求,都会首先写入数据库,同时会dump数据到Server的本地文件中,全部读请求都是直接走这个静态文件。
在ZooKeeper中,全部运行时数据都是存储在内存中,客户端的全部读写操做都是针对这分内存数据来进行的。同时,内存中的数据,ZK会以快照的形式dump到指定文件中去,配合事务日志,帮助服务器在下次重启的时候,可以加载正确的数据到内存中去。
数据模型
Diamond的数据都是以行组织的,这也更便于它使用mysql来管理数据。Diamond的基本数据结构包含dataid,group和content,根据group,能够将一组相关的数据组合起来。
ZooKeeper中,使用树形结构来组织数据,每一个节点类型于一个文件系统的路径,一个节点下面也能够建立多个子节点来规则一些相关的数据。
容灾
在容灾方面,diamond作得至关的完备:
1.全部客户端的读请求,都是直接读取服务器端的本地静态文件,所以,即便数据库挂了,都不会影响diamond的读服务。而读服务在全部使用diamond的应用场景中,占到了绝大部分。
2.Diamond客户端还保存了数据的快照,客户端每次从服务器成功获取数据后,都会把这份数据保存到本地文件系统中,称为快照文件。这个快照文件是为了防止在服务器没法获取数据的时候,可以在这个快照中获取数据。
3.客户端还会有一个容灾目录,变个容灾目录是在服务器彻底不可用的时候,运维人员能够手动在这个容灾目录中建立相关目录结构的数据,diamond就就会优先从这个目录中获取数据。
4. 说到这里,咱们就能够给diamond的数据获取优先级做一个总结:
首先都会从容灾目录中获取数据——没法从容灾目录获取数据的话,就经过网络到服务器请求数据——若是没法从服务器获取数据,那么就从本地的snapshot中获取数据。
接下来看看ZooKeepe的容灾,作得不多,只有如下一点:
1.ZooKeeper实现了paxos算法,有效的解决了分布式单点问题。以一个3台机器构成的集群为例,任意一台ZK挂掉,都不会影响集群的数据一致性。
总结:在容灾方面,diamond有很大的优点,也符合了diamond的稳定性要求。
数据大小
Diamond对单个数据的大小,没有严格的限制,一般2M左右的数据大小都是没有问题的。而在ZooKeeper中,因为全量数据都是存储在内存中,而且需求进行集群机器间的数据两步,因此对单个数据的大小有严格的限制,默认单个数据节点的最大数据大小是1M。