数据存储是后台服务系统永远绕不开的知识
笔者希望能够从宏观的角度出发,思考数据存储系统的共性和设计方案,尝试从Mysql和RocketMQ的角度去思考谈谈系统存储架构的设计哲学

前置的知识
什么是RocketMQ、什么是Mysql,他们对于后端系统的主用途有什么差异

RocketMQ本质上就是一个消息的中间件——强调的应该是消息的处理能力,对于整个消息的吞吐更为关系,如何高效率的完成MQ消息的收、存、发是MQ这个组件的核心思考

MySQL本质上是一个数据源,存放的是主数据——强调于DB的数据存储修改的能力,与业务系统的交互的ACID的能力,如何有更丰富的功能进行数据的查找和存储,也就是他对于数据的规则化甚至于大小会有更高的要求

这个两个主要用途的差异其实就造成了他们实际存储于磁盘的差异,也注定其实Mysqld的存储系统和存储结构会更加的复杂和全面

从RocketMQ入手来纵观这个消息中间件
RocketMQ的一个重要的特性
1. 顺序写——极致的顺序写(话说如果是这要不是分割的任务要落到服务端这个样子性能会高是怎么做到的)
2. 任务是流式任务——我不关心任务是什么东西,我只关心任务能不呢发出去能不呢存下来

所以RocketMQ本身的行为就是较为粗暴的——同时也是非常厉害的一个架构设计
将所有的元数据信息全部由一个文件存在一起,有一个msglen表明这个文件的长度——然后用msgbody进行分割

这个情况下其实存在一个非常明显的缺点
整个文件的元数据都放在一个文件里了,如果后续的消息增多了他的体积其实特别大
其次是因为极致的顺序写,如果后续消费者订阅的时候就需要额外的空间建立Index(也就是我们的consumequeueIndex)进行消息体的查询
无疑这个方案就是空间换时间的思想

试想一下,我们的Mysql的数据库中,能允许这个粗暴的方案吗?答案肯定是否定的
也就是这个Mysql因为对于空间的压缩(因为是主数据源),同时考虑到后期需要根据某些条件进行相关的查询,所以我们引入了一个逻辑的B+树的结构和一个优化存储的方法
而且数据的表结构是能变更的,数据的内容也要变更的,概括来说就是“数据可靠为基石,数据查询效率要高”

对于表结构的元数据,Mysql会专门分出一个数据结构表,每一张表都会有一个.frm的文件,这个存储元数据结构,数据的顺序,索引信息和相关——建立的是相关表结构的定义

对于数据库实际的行存储来看
MySQL其实是存储的是Compact化后的信息

我们再此不讨论他的一个业务细节,了解思想即可
变长字段长度列表其实存储的是varchar()的相关信息,因为存储的时候的长度并不是确定的,需要一个变长的列表进行整个空间的说明,NULL标志位其实就是标记NULL值得——这里可以用bit进行表示(0表示一种状态、1表示一种状态),记录头信息这个东西比较重要的——稍后我也将从这个点去说明为什么我们需要记录整个行所占得字节,列数据就是实际的数据了(这里得详细信息推荐看小林CodingMySQL 一行记录是怎么存储的? | 小林coding)

记录头信息有什么?它需要做到什么?
在回答这个问题之前先看看Mysql的逻辑的B+树吧

不难发现——行和行之间是有单向的指针相接的——那底层真的是指针吗?
显然是不可能得
那InnoDB要怎么存这个信息呢?——一般来说根据存储来看都是希望进行相对位置得偏移量得计算来得出最终的位置得——Mysql也是这样做的
来看看Compact头吧

在这个Compact头得基础下配合上.frm表结构元数据文件,InnoDB存储引擎能将相关得空间压缩到极致

从存储消息性能的角度理解结构的差异——为什么一个采取分页分区分段一个采用顺序写
RocektMQ存储模式与MySQL存储模式选型得核心差异和设计哲学——本质上就是存储文件的修改与否决定的——RocketMQ是典型的写优先的模型,后续数据不会修改;但是对于Mysql这种数据库来说读写改的操作相对就是平衡的,不存在所谓的写优先的场景的

修改的时候Mysql是以页为基本单位的,后续调整要是超过了相关的页存储的空间,会进行整页的复制,将数据记录复制到新的页中
这个时候的读写相对是平衡的

从存储本身的需求理解结构的差异——为什么行两个系统的存储的元数据结构差异较大
对于Mysql来说DB需要为每一个数据定一个结构——这就是为什么有.frm这个表结构元数据的原因
存在表结构的元数据,结构就有一定格式
进而这就是为什么可以用相关的转义字段进行优化——节省空间内存
有NULL值的存在,所以这就是为什么希望有一个bit能对这个NULL存的优化
数据库的基本能力是要有事务保证即ACID
Mysql的undolog是保证原子性的基础——这也就是为什么数据结构会有roll-ptr指针的核心
为了实现隔离性、Mysql底层会依赖于MVCC极致——这个时候trx-id其实发挥了很重要的作用
希望满足B+树的范围查询——所以我们会有逻辑指针指向下一个节点的关系

对于RocketMQ来说完全没有这个需求
msgLen 进行整个消息的总长度的划定
queueID指明队列的ID
queueOffset指明队列的逻辑偏移量
physicalOffSet指明的是commitlog中的偏移量——物理偏移量
bodyLength指明消息体的长度
body转存具体的内容

结合文件的偏移量+长度(size)我们完全可以轻而易举的提取到整个文件

对于MQ来说只要能提取出来,其他的修改和划页存储都不重要了——当然他因为用顺序存取,所以希望划分结构也是很困难的事情更重要的是它不需要把整个系统划分更细致的数据结构


 

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

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

相关文章

MySQL 面试题系列(二)

目录1: SQL 中常见的 JOIN 类型有哪些?请分别说明其连接逻辑和适用场景。2: UNION 和 UNION ALL 有什么区别?它们各自的适用场景是什么?3: 什么是视图 (View)?它的作用和优缺点是什么?4: 什么是索引 (Index)&#xff1…

PostgreSQL诊断系列(2/6):锁问题排查全攻略——揪出“阻塞元凶”

🔗 接上一篇《PostgreSQL全方位体检指南》,今天我们深入数据库的“神经系统”——锁机制,解决最令人头疼的“卡顿”问题。 你是否经历过: 某个SQL执行着就不动了?应用界面卡在“加载中”?UPDATE 语句迟迟不…

crc16是什么算法

核心概念​CRC16​ 是一种循环冗余校验算法,属于哈希函数的一种。它的核心目的是检测数据的错误,通常用于数字网络和存储设备中,来验证数据在传输或存储后是否依然完整、无误。你可以把它想象成一个数据的“指纹”或“摘要”。发送方计算出一…

Day8--HOT100--160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点

Day8–HOT100–160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点 每日刷题系列。今天的题目是力扣HOT100题单。 链表题目。 160. 相交链表 思路【我】: 1,计算链表长度 2,令A为较短链&am…

Rust面试题及详细答案120道(58-65)-- 集合类型

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性 (Unity、Unreal Engine、Three.js与Godot)

在上一篇博客中,我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题,深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分,旨在实现灵活…

模块化设计+微米级精度,GelSight Modulus 触觉型3D轮廓仪深入检测“盲区”

当航空航天工程师在精密舱体中搜寻微米级缺陷,汽车检查员在车间复杂结构里排查隐患,能源领域创新者尝试突破检测边界时,深耕视触觉 3D 显微技术的企业——GelSight,正以全新研发的GelSight Modulus触觉型3D轮廓仪(简称…

Pytorch安装详细步骤

第一步:检查显卡支持的的CUDA版本 1.打开NVIDIA控制面板 首先鼠标右击桌面-显示更多选项-NVIDIA控制面板-点击弹出界面右上角的(系统信息)-点击弹出界面的(组件) 2.查看驱动版本 打开系统信息 点击组件,查看 以观测到红色方框内的信息可以看到(NVIDIA CUDA 13.0.…

2025职场进阶:低门槛技能实用手册

每到年初,都会有人问:如果只能投入有限的时间与预算,先考哪一两本证书更划算?本文把近两年的岗位需求、学习可获得性与花费周期做了综合权衡,给出一个以“先提升通用能力,再叠加行业资质”为主线的组合方案…

SDC命令详解:使用set_timing_derate命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定降额比例 指定降额对象列表/集合 指定沿 指定最大、最小条件 指定早、晚条件 指定路径的类型 指定降额类型 指定约束 指定增量 写在最后 由于制造…

C++语言程序设计——03 进制ASCII码

目录一、进制表示与转换(一)不同进制表示(二)进制转换方法二、ASCII 码(一)ASCII 码表(二)ASCII 码转换(三)大小写英文字母转换【总结:如何记忆AS…

AtCoder Beginner Contest 420-Toggle Maze

题目描述 有一个 H行 W 列的网格。用 (i,j) 表示位于第 i 行(从上往下数)第 j 列(从左往右数)的格子。每个格子的状态用字符 Ai,j表示,含义如下: . :空格子。 #’ :障碍格子。 S &am…

20、DMA----释放CPU压力,加快传输

1、DMA介绍DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使…

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘,独俱普惠AI鸿力。一台融合存储、计算、检索功能,满足小型园区、社区、银行网点、超市等场景安防需求,小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机:最终版2》续作震撼登场!经典横版射击全面升级:3D 画面炫目、关卡与机体海量扩充,只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题,通常不应该被捕获或处理,程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格,通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体,强调真实、自然的生活瞬间。调色核心在于低饱和暖…