ZooKeeper和Diamond有什么不同

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文主要是讨论下两个类似产品:ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond,顾名思义,寄寓了开发人员对产品稳定性的厚望,希望它像钻石一样,提供稳定的配置访问。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的基本数据结构包含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。

数据追加与聚合

Diamond支持对数据的追加与聚合功能,即对同一个dataid的写入操作,可以设置为追加。而ZooKeeper目前不支持,只有覆盖写。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
Java
Mac下安装JDK11(国内镜像)
Mac下安装JDK11(国内镜像)
5999 0
|
存储 运维 Dubbo
HSF:阿里RPC框架
HSF:阿里RPC框架
2514 0
|
缓存 运维 容灾
阿里配置中心Diamond探索
Diamond作为配置中心中间件在阿里内部非常常用,diamond不仅适用于业务应用,各种中间件也能看到它的身影,可见其“配置管理”、“动态配置推送”能力十分重要。这里我将记录学习diamond的过程,秉承着知其然知其所以然的想法,来探索这个🐂🍺的中间件底座。 学习之前需要先带着几个问题,为什么会诞生diamond?diamond的原理是什么?用了diamond需要注意什么?
10368 4
|
消息中间件 运维 监控
MetaQ 消息中间件介绍及使用
MetaQ是阿里云中间件团队设计和研发的一款分布式、队列模型的消息中间件。有如下几个特点:1. 有push、pull两种消费模式 2. 支持严格的消息顺序...
5792 50
MetaQ 消息中间件介绍及使用
|
容灾 网络协议 大数据
阿里巴巴为什么不用 ZooKeeper 做服务发现?
服务发现,ZooKeeper 真的是最佳选择么?而回望历史,我们也偶有迷思,在服务发现这个场景下,如果当年 ZooKeeper 的诞生之日比我们 HSF 的注册中心 ConfigServer 早一点会怎样?
12305 6
|
Java 应用服务中间件 HSF
走进HSF源码
前言本文源自一次组内分享,于是接着这个机会,将HSF的源码阅读过程记录下来,以供自己温故而知新。如果有哪些地方理解不到位的,还请诸位批评指正!简介HSF (High-speed Service Framework),高速服务框架,是在阿里巴巴内部广泛使用的分布式RPC服务框架。众所周知,HSF一款与我们的日常生活密不可分的RPC框架;所谓RPC——远程过程调用,就是指像调用本地方法一样调用远程的方
1596 0
走进HSF源码
|
存储 消息中间件 缓存
本地缓存之王,Caffeine保姆级教程
本地缓存之王,Caffeine保姆级教程
|
消息中间件 存储 缓存
消息队列之 MetaQ 和 Kafka 区别和优势详解
本篇文章介绍MetaQ和Kafka这两个消息队列的区别和优势。
|
监控 Java 测试技术
Mockito教程
Mockito教程
2353 0
Mockito教程
|
XML 前端开发 Java
面试必问|Spring @bean 和 @component 注解有什么区别?
Spring 中的一些注解 1. @Component 和 @Bean 的区别是什么? 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、 @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。
3816 1
面试必问|Spring @bean 和 @component 注解有什么区别?