从一到无穷大 #17 Db2 Event Store,A Purpose-Built IoT Database Engine

news2025/2/25 8:57:36

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

文章目录

  • 引言
  • Architectural overview
  • Data format and meta-data
  • Ensuring fast ingestion
  • Multi-tiered caching
  • Optimized query processing
  • Continuous Availability
  • 总结

引言

给我的感觉Db2 Event Store是一个私有的InfluxDB IOX,只不过没有InfluxDB IOX功能那么强大而已,其在写入流程,COS的利用,存储格式,以及架构上给我的感觉是后者好像也可以这么实现,只不过后者计算节点可以不挂盘,且控制面更为强大而已。

Db2 Event Store设计原则如下:

  1. 尽可能快地写入数据: 最小化完成持久化数据所需同步工作,确保节点故障时的持久性,并将数据提供给查询处理。
  2. Asynchronously refine and enrich data: 数据被写入后会以异步方式进一步优化数据格式,从而提高查询处理的效率。
  3. 高度优化查询处理: 利用了高度优化的数据格式Parquet;允许跳过部分数据的元数据;强大的查询优化器和runtime;通过在集群中的所有节点上并行运行以及在每个节点内多线程运行,充分利用所有可用硬件;
  4. 可用性: 最大限度减小单机故障时对于读写的影响

我认为的Db2 Event Store的优劣势如下:

优势:

  1. 基于IOT场景完全利用了云上廉价的基础设施,并设计多集缓存消除性能影响。
  2. 高效的写入流程,来源于创新的数据多级流转(这个思路类似于BytesSeries)。
  3. 重复使用已经构建和优化了几十年的Db2 SQL compiler, optimizer 以及 runtime,极大地减少了开发工作量,并立即提供了丰富的 SQL 支持和出色的运行时查询性能。
  4. 混合MPP shared nothing / shared disk cluster architecture,这样做的好处是将传统 MPP shared nothing 的线性可扩展性与shared everything的高可用性结合,存算分离,在公有云上售卖模型也清楚,隔离也简单,计费也容易。
  5. 天然支持高基数,因为不同的数据存储在不同的Parquet文件,index分离,还有synopsis文件记录表级别概要信息,允许在共享存储中合并,compact过程不影响查询。

劣势:

  1. 没有提到控制面,元数据完全基于Zookeeper,风险较高,能力相对较弱,无法适应复杂调度。
  2. 可用性差,单点故障会导致读短暂不可用。

Architectural overview

在这里插入图片描述
DB2混合了 MPP shared nothing / shared disk cluster architecture,这样做的好处是将传统 MPP shared nothing 的线性可扩展性与shared everything的高可用性结合。

如上图所示,Table数据根据用户定义的hash key被划分为micro-partitions,存储在可靠的共享存储介质上。集群中所有的计算节点都能完全访问整个数据集,从而实现存储与计算的解耦,并使每个节点都能独立扩展。

Zookeeper作为协调节点,在逻辑上将micro-partitions的归属划分给可用的计算节点。逻辑上每个micro-partitions在任何给定时间点都由一个计算节点拥有,任何该micro-partitions的读写请求都通过拥有该micro-partitions的计算节点,实现集群级别的读写并行化。在处理计算节点故障时,受影响的micro-partitions会在计算节点上重新分配映射关系,与需要进行数据迁移的模式相比,大大缩短了故障转移时间。

为确保元数据没有单点故障,系统采用了floating catalog的概念,将目录信息存储在可靠的共享存储中,并通过任意一台计算节点提供服务,一旦发生故障在任何计算服务器上重新启动。

数据首先被写入计算节点上本地存储介质(SSD 或 NVMe),并在提交之前进一步复制和写入至少另外两个计算节点的本地存储。这确保了数据在计算节点发生故障时的可用性。然后数据异步写入共享存储。这种模式可以避免了共享存储介质可能产生的任何额外延迟(尤其是在高延迟云对象存储的情况下),高效的处理各种负载的写入。

该架构通过并行和优化存储技术的结合实现快速摄取。该系统采用headless集群架构,所有计算节点都扮演着head nodes 以及 data nodes(类似multi raft?)。在单独一个计算节点内部通过表级别hash partitioning将写入row映射到特定的micro-partitions,然后发送给拥有该分区的计算节点。(这里提一个问题,为什么不是每个计算节点都可以做写入呢?原因是为了保证一致性,这里的写入不是基于raft的,而是写三份,如果不存在一个单点写入的话可能存在三副本不一致

数据格式为Parquet,Parquet利用压缩的 PAX 存储格式,可被 Db2 的 BLU 列式runtime引擎用于分析处理,也可以允许Hive、Spark、Presto等直接查询数据。

云对象存储无法为可修改的数据提供强有力的一致性保证,为了利用对象存储的成本和可扩展性优势,db2利用了一种append-only immutable 存储模型,在这种模型中数据块永远不会被重写Synopsis metadata允许在查询处理过程中跳过数据(时间?first/last/min/max/count?),作为写入过程的一部分自动生成,并写入单独的 Parquet 文件,从而允许元数据与表数据分开访问和缓存。

索引利用 LSM 树风格的格式来满足append-only的要求。索引作为数据共享流程的一部分异步生成的,以尽量减少写入处理的延迟。所以异步生成意味着在异步共享处理过程中需要消除重复键,这里其实就是多写处理冲突,以前我做multi region写冲突处理时方案时做过这个,方案很多,LWW是最简单有效的一种。

高效的数据访问是通过多层缓存层实现的,该层将频繁访问的数据、元数据和索引缓存在内存中和计算节点本地存储介质中,以防止云对象存储可能产生的延迟。

Data format and meta-data

数据存储格式主要基于两个方面考虑:

  1. 考虑到处理分析工作负载时的性能优势,最好使用列式数据存储格式
  2. 使用开源格式,允许外部系统访问

所以最终选择Parquet作为存储格式。

Db2 Event Store 架构下表的最小粒度是micro-partitions。Parquet 文件属于micro-partitions,因此给定的 Parquet 文件正好包含一个micro-partitions的数据。Parquet 文件一旦写入就不可更改。micro-partitions的每个 Parquet 文件都分配有一个单调递增的数字,称其tablet identifier。Db2 Event Store runtime engine 以及 external readers 利用这一点来判断较新的数据。共享存储中 Parquet 文件的元数据由 Zookeeper 维护,比如每个micro-partitions的最新tablet identifier

在 Db2 Event Store,tuples 通过 Tuple Sequence Number (TSN)识别,TSN 是一个整数,可用于定位表中的tuple。Db2 Event Store 中的 TSN 包括tablet identifier, the zone,以及tuple在 Parquet 文件中的偏移量。

另外Db2 Event Store还为Parquet贡献了一项特性 Parquet Modular Encryption[1], 这个特性对每个模块分别加密,从而保留了加密数据的过滤功能和分析效率。它利用 CPU 硬件支持的 AES GCM 密码[2],在不减慢整体工作流程的情况下执行模块加密操作。AES GCM 还能保护存储数据的完整性,使其不会被恶意篡改文件内容。db2使用其他模块保存密码,Parquet 文件在发送到共享存储前已加密,这样做有两个好处:

  1. 存储后端无法查看加密密钥和明文数据
  2. 从共享存储检索加密文件后,DB2 Even Store 会使用 Parquet 模块化加密库验证已处理数据的加密完整性,SSD/NVMe 缓存层也使用 Parquet 加密格式,确保本地持久化文件免受内部人员攻击和硬件故障。

这样的做法可以看出db2的工程实现足够优秀,没有经验的团队不会有这样的决策的,因为很多现有的云系统因为性能的考究不会做全链路CRC,这意味着可能发生内存/CPU错误而导致比特跳变,进而导致数据损坏,如果用户侧不自己校验,很多时候根本无法感知这种问题(以我们团队的经验来看,基本几年就会发生一次)。

Ensuring fast ingestion

在这里插入图片描述
关键思路和现有的几个系统一样,减少写入流程上的开销,重操作异步执行,基本写入流程如下:

  1. 客户端可以连接到任何一个节点(连接的节点称为ingest coordinator)来执行写入,如果发生故障,会自动将批量插入重新写到任何其他计算节点。ingest coordinator将batch中数据哈希分割到对应的micro-partitions,然后将数据写入其中一个副本。
  2. 对应副本收到写后,会以log的形式将其放入Log Zone,持久化的同时会复制到其他计算节点,以确保数据的持久性和高可用性。没有索引。
  3. Log Zone to the Pre-Shared ZoneLog Zone可实现快速写入和持久性,但并不是查询的最佳选择。因此必须尽快将最近写入的数据转换为更便于查询的格式,并使用indexessynopsis来提高提高查询效率,这个过程有几秒的延迟。写入 Pre-Shared Zone的数据较小,因为每次只会把上一次持久化到现在的数据持久化到共享存储,因此对于查询并不理想。这个过程异步维护索引 Parquet文件。
  4. Pre-Shared Zone to the Shared Zone Pre-Shared Zone数据量足够时小文件便会合并,在所谓的Shared Zone生成更大的 Parquet 文件。文件越大代表查询处理效率越高,整体数据压缩效果也越好,因此合并后的文件大小一般在 64MB 左右。这个过程会合并索引。

数据的轮转对用户是透明的,所有这些Zone的数据都是不可变的。关键点是Log Zone不仅要写入本地存储(以保证持久性),还要直接用于处理查询结果。(log is database)

由于计算节点的micro-partitions分配是动态的,因此需要将索引数据都持久化到共享存储中,以便将micro-partitions从一个节点转移到另一个节点,当一个micro-partitions被重新分配给一个新的计算节点时时,数据库引擎会启动一个后台进程,为新的micro-partitionsleader做缓存预热,从而使索引访问能够尽快恢复到最高性能。

另外还有一个常规优化手段,为了表扫描时跳过不必要的数据,Db2 Event Store 会为每个表创建一个synopsis tablesynopsis table的每一行都涵盖相应用户表的行范围,并包含该行范围内列的最小值和最大值。数据synopsis块也采用 Parquet 格式。synopsis在数据合并到Shared Zone时填充,因此不包括预共享区和日志区的数据。维护这些区域的数据概要内容需要大量额外成本(对共享存储的额外写入),而且由于这些区域的数据量较小,数据跳过带来的价值不大。

Multi-tiered caching

一个通用的优化思路,即对象存储延迟较高(很好理解,COS本身分为三个模块COS前端,Partition layer,Stream layer,一个上传下载内部系统可能多达数十次网络通信,当然COS存小对象另说),价格低;而高性能存储延迟低,价格高(以腾讯云举例基于SSD的系统价格比COS高几十倍),所以如何利用价格低廉的存储并同时提供最佳性能?Db2 Event Store 选择多级缓存,既能利用内存,又能利用本地存储,使系统免受对象存储的高延迟影响。

Db2 Event Store使用了五种缓存机制:

  1. Multi-layered Caching: SSD/NVMe,RAM 均用于缓存数据块,索引以及synopsis
  2. Directed Caching:缓存访问可根据请求类型只定向到 RAM,或定向到本地 SSD/NVMe 设备(可选择放置在 RAM 缓存中);或者可以完全绕过缓存层直接访问云存储(确定冷数据)。
  3. Probabilistic Caching:利用被访问对象的不同表和索引数据总大小的统计数据,并计算相对于给定查询所使用数据被缓存的概率。常常与Directed Caching结合使用。
  4. Soft & Hard Limits:内存的限制。
  5. Epoch based eviction:一种巧妙的驱逐方式,我没太看明白。

Optimized query processing

在查询处理方面,Db2 Event Store 利用 Db2 的 BLU MPP 集群查询引擎,将 Db2 基于成本的 SQL 优化器和 Db2 的 BLU 加速列引擎的加速分析处理功能与 Db2 Event Store 数据管理层的快速写入和云本地存储功能相结合。这个确实不可模仿,这就是公司的底蕴吧。

计算引擎的优化我并不熟悉,很多内容没看懂。

不过Db2 Event Store 利用过去 30 年中开发和完善的 Db2 SQL compiler, optimizer 以及 runtime,证明了为公共云重新架构并不需要重写所有组件。也证明了计算引擎就根本不应该自己写,直接用现成的最好(Lindorm就使用了Apache Calcite作为计算引擎,InfluxDB IOX使用了DataFusion)。

Continuous Availability

其实对于文中Continuous Availability这个词我很疑惑,不知道怎么理解,用高可用性看吧,也不对,因为Db2 Event Store在计算节点宕机期间会影响读,也不可用,所以我暂且称它为基本可用吧。

  1. 写入:micro-partitions的所有副本都能处理写入,因此只要大部分副本仍然可用,当一个副本节点丢失时,摄取处理受到的影响不大,客户端处理这种故障在在不同的节点重新尝试操作就可以。
  2. micro-partitions上的其他操作对表leader的可用性有很高的依赖性。比如:查询,data movement between zonesdata enrichmentindex optimization processes。前面提到过data enrichmentindex optimization processes可以通过foller提供服务,所以调度算法只要让主从不要在一台机器上,后台任务就可以继续。读只能通过系统能够快速识别不可用的leader,并将故障计算节点micro-partitions等leader转移到其他节点,以继续处理查询。
  3. catalog:当catalog节点宕机时,系统仍能继续处理写入和查询,因为metadata数据是由数据节点本身缓存的,它们只依赖目录节点来执行初始缓存,而目录节点使用共享存储进行持久化,这使它可以故障转移到集群中的任何一台主机上,进而为新上架的节点提供缓存服务。(我们曾经有一次故障导致一个集群1000多个接入机70%不可用)
  4. Zookeeper :只要大部分 Zookeeper 节点存活,它就能持续可用。(我们曾遭遇过五副本mongo宕机的情况)

在这里插入图片描述
可以看到单点故障是影响查询的。

最后利用TSBS评估了 Db2 Event Store 与 Druid和TimecaleDB的读写性能,又是遥遥领先!

总结

参考:
5. https://issues.apache.org/jira/browse/PARQUET-1300
6. https://datatracker.ietf.org/doc/html/rfc5288

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

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

相关文章

【山河送书第十二期】:《巧用ChatGPT快速搞定数据分析》参与活动,送书两本!!

【山河送书第十二期】:《巧用ChatGPT快速搞定数据分析》参与活动,送书两本!! 关键亮点内容简介作者简介购买链接参与方式往期赠书回顾 关键亮点 用ChatGPT颠覆数据分析,1分钟生成数据分析结果! 30多个精心挑…

山洪灾害监测预警系统解决方案

一、方案背景 近几年我国频繁发生山洪灾害现象,造成大量的人员伤亡,使得洪涝灾害死亡总人数呈上升趋势,群死群伤事件时有发生。为了提高山洪灾害监测预警能力,加强灾害发生时的快速反应能力,我司研发出了山洪灾害监测预…

C语言利用联合体判断大小端

#include<stdio.h>#define SIZE(a) (sizeof(a)) union {/* data */short s;char c[SIZE(short)];short b;int d;char f; }un; int main(int argc,char **argv) {un.s 0x0102;if(SIZE(short) 2)//表示short是16位{printf("\n");printf("c[0] %d,c[1…

QT:使用行编辑器、滑动条、滚动条、进度条、定时器

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QSlider> //滑动条 #include <QScrollBar> //滚动条 #include <QProgressBar> //进度条 #include <QTimer> …

机器学习 day33(误差分析、添加数据、迁移学习)

误差分析 我们可以手动查看分类错误的子集样本&#xff08;通常为100个&#xff09;&#xff0c;并统计他们的错误类型在所有错误类型中&#xff0c;选择一种或几种最常见的错误&#xff0c;进行改进。这可以最高效的改进你的模型误差分析的一个限制是&#xff1a;它只能很好…

微服务08-认识和使用SpringAMQP

1.AMQP的认识 1.1 介绍 AMQP是什么&#xff1f;看完你就知道了_hello_读书就是赚钱的博客-CSDN博客_amqp 好处&#xff1a; 什么connection&#xff1a;消息队列的连接、channel&#xff1a;服务发送接收消息的通道、Queue&#xff1a;消息队列——>这些你都不需要自己编写…

Keil 5 或者Keil 4自定义主题颜色100%成功

文章目录 步骤一:代码内容解析&#xff1a;完整文件代码一效果图&#xff1a;黑主题Keil 原主题 步骤一: 找到keil 5或者Keil 4软件安装目录下的UV4文件夹下的global.prop文件&#xff0c;然后用记事本打开该文件&#xff0c;复制下面配置替换到global.prop文件里的所有内容保…

IO口电路种类

文章目录 参考1.高速振荡电路&#xff08;时钟IO引脚&#xff09;2.与 GPIO 功能共享的低速振荡电路&#xff08;子时钟IO&#xff09;3.CMOS 滞后输入引脚4.电源输入保护电路5.A/D 转换器 ref (AVRH)带保护电路的电源输入端6.CMOS 电平输出7.CMOS 电平输出&#xff0c;带有模…

键盘失灵按什么键恢复?详细方法分享!

“我的电脑键盘莫名其妙失灵了&#xff0c;试了好多方法都无法恢复。请问遇到键盘失灵的情况&#xff0c;应该按什么键才能恢复呢&#xff1f;” 键盘是计算机的重要输入设备之一&#xff0c;但有时候它可能会出现失灵的情况&#xff0c;让用户感到困惑和不知所措。但其实&…

软件设计师笔记系列(一)

&#x1f600;前言 在日常生活和工作中&#xff0c;我们依赖于各种各样的计算机系统来完成一系列复杂的任务。计算机系统不仅仅是硬件设备的集合&#xff0c;它还包括一系列用于协调硬件工作的软件和协议。了解计算机系统的基础知识&#xff0c;包括其构造和功能&#xff0c;是…

【已解决】模糊匹配导致一门课存在多个同名教师

[已解决] 模糊匹配导致一门课存在多个同名教师 问题 LEFT JOIN jsxxb ON XSKB.RKJSXM LIKE jsxxb.JZGXM || ‘%’ 思路 利用正则表达式解决 jsxxb.JZGXM 的字段示例如 李志勇,许蕤 需以&#xff0c;作为分割点&#xff0c;只匹配逗号前面的名字&#xff0c;或者是没有逗号&a…

CSS 学习笔记(基础)

用来控制网页表现的语言&#xff0c;CSS&#xff08;Cascading Style Sheet&#xff09;&#xff1a;层叠样式表。然后我们继续看看 W3C 标准&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS导入方式、选择器&属性 由于网页的框架…

【C++进阶】:哈希

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 l o g 2 N log_2N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的…

分布式/微服务---第四篇

系列文章目录 文章目录 系列文章目录一、分布式事务解决方案二、如何实现接口的幂等性一、分布式事务解决方案 XA规范:分布式事务规范,定义了分布式事务模型 四个角色:事务管理器(协调者TM)、资源管理器(参与者RM),应用程序AP,通信资源管理器CRM 全局事务:一个横跨多个数…

【数字通信原理】第三章—信源编码理论

文章目录 第三章 信源编码理论1.模拟信号的数字化概论2. 信源编码的基本原理2.1 抽样定理2.1.1 低通抽样定理2.1.2 带通抽样定理 2.2 脉冲振幅调制PAM2.2.1 自然抽样2.2.2 平顶抽样 第三章 信源编码理论 1.模拟信号的数字化概论 2. 信源编码的基本原理 2.1 抽样定理 2.1.1 低…

Win10 家庭版 - 解决应用程序无法启动,因为应用程序的并行配置不正确的问题(System Default Context”的激活上下文生成失败)

Win10 家庭版 - 解决应用程序无法启动&#xff0c;因为应用程序的并行配置不正确的问题&#xff08;System Default Context”的激活上下文生成失败&#xff09; 系统环境遇到问题试过过程解决办法 前天的时候&#xff0c;女盆友公司电脑遇到个问题&#xff1a;几乎所有的 exe …

Nginx 的优化思路有哪些?网站的防盗链如何做?附图文说明和完整代码步骤

Nginx 的优化思路有哪些?网站的防盗链如何做?实际工作中有哪些类似的安全经验?通过代码实践一步一步实现,附图文说明和完整代码步骤 实验拓扑图: 实验步骤 1、在Centos01上安装Nginx,设置网站根目录/www使用域名www.huhu.com访问 2、在Centos02上安装DNS使用域名访问Ce…

python读取.xls文件,绘制钻头外径磨损图

通过xlrd模块读取.xls文件&#xff0c;数据如下&#xff0c;总计162行16列&#xff1a; 读取与作图如下&#xff1a; from xlrd import open_workbook import matplotlib import matplotlib.pyplot as plt # 设置字体为微软雅黑&#xff0c;解决中文显示问题matplotlib.rc(&qu…

vue3项目学习三:配置登陆解决方案

配置登陆解决方案 配置环境变量封装axios封装接口请求模块封装登录请求触发登录动作本地缓存处理方案LocalStorage 登录鉴权退出登录方案主动退出被动退出 配置环境变量 在根目录创建开发模式和生产模式的两种baseURL 输入&#xff1a; ENVdevelopment# base api VUE_APP_BA…

国内首款研发领域 AI 项目管理工具发布:PingCode AI

PingCode的使命&#xff0c;始终是用技术驱动研发生产力。 过去几年&#xff0c;PingCode在研发管理领域持续引领创新&#xff0c;基于“自动化、数据化、智能化”的战略三部曲&#xff0c;先后发布了研发【自动化】引擎、【效能度量】引擎&#xff0c;而对于最后一步“智能化”…