ZooKeeper和Diamond有什么不同

本文主要是讨论下两个类似产品: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目前不支持,只有覆盖写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础如何系统自学Python

零基础系统自学Python 学习前的准备 明确学习目标 Python 一共有两大版本,即 Python2 以及 Python3,Python2 已停止维护,强烈建议直接上手 Python3。Python 可以说是无所不能,主要有以下几大方向,建议选择自己感兴趣…

递归神经网络 (RNN) 及其变体 LSTM (长短期记忆) 和 GRU (门控循环单元)

递归神经网络(RNN, Recurrent Neural Networks)是一类用于处理序列数据的神经网络,特别适合于时间序列数据、语音、文本等连续数据的处理。RNN之所以独特,是因为它们在模型内部维持一个隐藏状态,该状态理论上可以捕获到…

【国产MCU】-CH32V307-SysTick中断与延时功能实现

SysTick中断与延时功能实现 文章目录 SysTick中断与延时功能实现1、SysTick介绍2、SysTick中断使用3、SysTick实现微秒和毫秒延时功能CH32V307的RISC-V内核控制器自带的一个64位可选递增或递减的计数器,用于产生SYSTICK异常(异常号:15),可专用于实时操作系统,为系统提供“…

LabVIEW高精度天线自动测试系统

LabVIEW高精度天线自动测试系统 系统是一个集成了LabVIEW软件的自动化天线测试平台,提高天线性能测试的精度与效率。系统通过远程控制测试仪表,实现了数据采集、方向图绘制、参数计算等功能,特别适用于对天线辐射特性的精确测量。 在天线的…

20 easy 70. 爬楼梯

//假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 // // 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? // // // // 示例 1: // // //输入:n 2 //输出:2 //解释:有两种方法可以爬到楼顶。 /…

uniapp H5 $el.querySelectorAll is not a function

在监听是否在可视区域遇到问题&#xff08;网页端&#xff09; 解决方案 <view class"container"> ...省略 业务代码... </view>参考 &#xff1a; https://blog.csdn.net/qq_18841969/article/details/134620559

ZJGSU 1737 链表

题目描述 请根据输入数据构造一个带头结点的单链表&#xff0c;链表结点的数据结构为struct node {int data; struct node *next;}&#xff0c;试设计算法&#xff1a;按递增次序输出单链表中各结点的数据元素&#xff0c;并释放结点所占用的存储空间。 要求&#xff1a;不允…

裸机编程的几种模式、架构、缺陷

目录 裸机编程模式/架构 1&#xff1a;初始化代码的编写 裸机编程模式/架构 2&#xff1a;轮询模式 裸机编程模式/架构 3&#xff1a;轮询加中断执行模式 裸机编程模式/架构 4&#xff1a;中断定时器主循环的前后台架构 裸机编程模式/架构 5&#xff1a;前后台 状态机架构…

常见的几种echarts类型

一&#xff1a;折线图 let option {tooltip: {},animation: false,grid: {top: "20%",bottom: "33%", //也可设置left和right设置距离来控制图表的大小left: 5%,right: 5%},xAxis: {boundaryGap:false,data: [1,2,3,4,5],axisLine: {show: true, //隐藏X轴…

Leetcode : 147. 对链表进行插入排序

给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。 每次迭代中&#xff0c;插入排序只从输…

(科目三)简答题汇总

模块一 信息和计算机基础 一、简述信息的的特征 【记忆技巧】普传功夫真驾驶 普遍性&#xff1a;信息是无时不有的&#xff0c;无时不在的载体依附性:信息不能独立存在&#xff0c;必须有载体。价值性:同一则信息&#xff0c;对不同的人来说&#xff0c;价值不同。时效性:同…

【AIGC调研系列】在AIGC发展背景下数据标注领域的机会

数据标注领域拥抱AIGC的发展主要通过以下几个方面实现&#xff1a; 市场规模的快速增长&#xff1a;随着AIGC技术的应用和发展&#xff0c;特别是在数据标注领域&#xff0c;市场规模呈现出爆炸式增长。预计未来几年内&#xff0c;中国AIGC数据标注产业的市场规模将达到百亿量…

如何快速的搭建一个小程序

要快速搭建一个小程序&#xff0c;你可以按照以下步骤进行&#xff1a; 明确目标和需求&#xff1a;在开始搭建小程序之前&#xff0c;首先明确你的小程序的主要功能、目标用户以及希望实现的业务需求。这将帮助你更好地规划和设计小程序。选择小程序平台&#xff1a;根据你的…

【Leetcode】字符串 string 补充知识

有限状态机 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假…

windows 两个服务器远程文件夹同步,支持文件新增文件同步、修改文件同步、删除文件同步,根据文件大小和时间戳判断文件是否修改 python脚本

在Python中实现Windows两个服务器之间的文件夹同步&#xff0c;包括文件新增、修改和删除的同步&#xff0c;可以使用paramiko库进行SSH连接以及SFTP传输&#xff0c;并结合文件大小和时间戳判断文件是否发生过变化。以下是包含删除文件同步逻辑的完整脚本示例&#xff1a; im…

二十五、剖析HashMap

剖析HashMap 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 1.1 Map 接口 Map是映射&#xff0c;有键和值的概念&#xff0c;映射表示键和值之间的对应关系&#xff0c;一个键映射到一个值&#xff0c;Map按照键存储和访问值&#x…

leetcode 3.5

普通数组 1.最大子数组和 最大子数组和 前缀和pre 动态规划 pre保留的是当前包含了当前遍历的最大的前缀和&#xff0c;如果之前的pre 对结果有增益效果&#xff0c;则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果&#xff0c;需要舍弃&#xff0c;则 pre 直接更新为…

贝叶斯树定义与构建的寻行数墨

Title: 贝叶斯树定义与构建的寻行数墨 —— Notes for “The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping” 文章目录 I. 前言II. 贝叶斯树的定义1. 贝叶斯树的背景2. 贝叶斯树的特点3. 贝叶斯树的定义 III. 贝叶斯树的构建1. 贝叶斯树的构建算法2…

CTP-API开发系列之接口对接准备

CTP-API开发系列之接口对接准备 CTP-API开发系列之接口对接准备CTP-API文件清单CTP-API通用规则命名规则Spi与Api CTP-API通讯模式开发语言选择 CTP-API开发系列之接口对接准备 CTP-API文件清单 文件名说明ThostFtdcTraderApi.h交易接口&#xff0c;C头文件&#xff0c;包括 …

紧跟潮流,再整一个短剧搜索网站

前面一大批的转存量太大了&#xff0c;有些小伙伴用不上&#xff0c;所以整了个搜索网站&#xff0c;输入关键词搜索即可。 搜短剧 http://wjsyyx.top/sdj/ 界面依旧主打朴实无华&#xff0c;搜索一步到位。 ▼ 网站界面 ▼ 搜索结果 剩下的就都会了。 ▼ 往期推荐 【Python】…