宝塔系统怎么建设网站,app开发网站模板,熊掌号结合网站做seo,购物本文主要是讨论下两个类似产品#xff1a;ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond#xff0c;顾名思义#xff0c;寄寓了开发人员对产品稳定性的厚望#xff0c;希望它像钻石一样#xff0c;提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…本文主要是讨论下两个类似产品ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond顾名思义寄寓了开发人员对产品稳定性的厚望希望它像钻石一样提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核心产品之一服务于集团线上很多核心应用。目前已经开源开源地址在http://code.taobao.org/p/diamond/wiki/index/。
数据持久性
Diamond主要针对的是持久数据这些数据有个共同的特点是集群中一批机器都会使用但是数据的更新频率不大且希望diamond能够永久存储。
ZooKeeper即可以存储持久数据也可以存储非持久数据。持久数据和diamond中的持久数据都类似所谓的非持久数据是指这些数据的生命周期和数据创建者的会话生命周期绑定一旦会话结束那么这些非持久数据也会被清除。
推拉模型
本质上两个产品都是“拉”模式的即都是通过客户端自己去服务器获取最新数据。具体实现上两个产品分别如下
在Diamond中客户端每隔15s轮询服务器比对数据是否更新从而获取最新数据。
在ZooKeeper中则是通过客户端对相应的数据path注册Watcher当数据有更新的时候服务器会有事件通知注意这个通知仅仅是告诉客户端对应的数据有更新了具体数据内容需要客户端根据自己的情况来决定是否需要获取最新数据。
因此在实时性方面ZooKeeper比Diamond高一些。
服务器数据存储
在数据存储上ZooKeeper和Diamond差别比较大。
首先来看下Diamond的数据存储。Diamond的数据存储以mysql数据库为中心所有在mysql中的数据都是最新的客户端的所有写请求都会首先写入数据库同时会dump数据到Server的本地文件中所有读请求都是直接走这个静态文件。
在ZooKeeper中所有运行时数据都是存储在内存中客户端的所有读写操作都是针对这份内存数据来进行的。同时内存中的数据ZK会以快照的形式dump到指定文件中去配合事务日志帮助服务器在下次重启的时候能够加载正确的数据到内存中去。
数据模型
Diamond的数据都是以行组织的这也更便于它使用mysql来管理数据。Diamond的基本数据结构包含dataidgroup和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。
数据追加与聚合
Diamond支持对数据的追加与聚合功能即对同一个dataid的写入操作可以设置为追加。而ZooKeeper目前不支持只有覆盖写。