图数据库 | 10、图数据库架构设计——高性能图存储架构(上)
老夫在之前的三大篇内容中,介绍了图数据库的三大组件—图计算、图存储以及图查询语言。(都归拢在图数据库原理、架构与应用这个专栏中了,感兴趣的朋友可以在去找阅读。)
接下来,老夫还将继续深化这三大组件,因为这三者是相辅相成的,这也是图数据库架构设计关键所在,也是需要读者去厘清的。
今儿我们先聊高性能存储架构,严格意义上说任何数据库都需要存储引擎,它承载着数据持久化的职责。
在这个数字化转型、分布式架构概念随处可见的时代,似乎是唾手可得的。然而,曾经很长一段时间Apache Hadoop系统也被认为是数据处理的“神器”,很多从业者甚至认为Hadoop系统也是高性能的,但所有系统只有在真实场景中对标才会分出性能高低、稳定与否、拓展性如何、实操易用性如何。
和所有其他类型数据库的相同之处是,设计高性能的图数据库至少需要关注3大环节:计算、存储和查询解析与优化。
数据库的计算层(或计算组件、计算环节)要解决的问题是,根据查询指令对数据库中存储的数据进行必要的(计算)处理后,返回给请求发起方。具体步骤如下:
1)客户端从数据库服务器端发起查询请求;
2)服务器端收到该查询请求,解析及优化查询指令;
3)从存储引擎读取数据(部分数据可能需要进入内存);
4)中央处理器进行相应的计算(各种聚合、排序、过滤等数学运算);
5)返回相应的结果。
结合下图,对于一个高性能系统而言,以上5步最核心的是在第3、4步,即存储层和计算层。本篇内容主要介绍存储环节,计算、查询解析与优化在后面进行介绍。

1.高性能存储系统的特点
高性能存储系统有3大特点,即存储高效、访问高效和更新高效。
存储高效主要指两个方面:一方面是写入效率高,传统意义上写入可以等同于落盘(持久化在硬盘文件系统上),但是随着持久化内存等新技术的出现,“落盘”这个概念并不准确,读者需要注意区分,写入效率可以体现为TPS(Transactions Per Second),即每秒钟写入的记录(或交易笔数)的数量;另一方面是存储这些数据记录(Payload)产生的额外开销小。
关于存储效率,有两个方面在工业界经常被关注:空间换时间和性价比。空间换时间是提升存储效率的一种常见做法,不仅仅是狭义的存储操作,还包括访问、更新等各类操作。NoSQL类型的很多数据库设计理念都采用了用更大存储空间来提升存储引擎时效性的策略,例如使用一些中间过渡的数据结构来实现更高的并发写入性能,即更高的TPS;还有存储放大的情况,例如数据会有多份拷贝,在满足数据安全的同时实现访问效率(避免实时迁移所带来的IO压力)的提升;当然也有一些数据库采用写拷贝(copy-on-write)的方式,通过使用倍增的存储空间来实现并发的读写操作。
在商业化场景中,存储系统的性价比问题也常被关注。在对延时不敏感的场景中就会采用价格低廉的硬件和软件解决方案,反之则会根据业务需求设计高性能、高成本的方案。
访问高效指的是用最小的时耗(或者是最少的操作步数、最低的算法复杂度)来定位并读取需要的数据记录。更新操作的高效性指的是当有记录需要更新或有增量的数据写入或旧记录删除的时候,在存储引擎层面的操作复杂度最低(最小规模的更新、最低数量的更新步骤)。
存储引擎的复杂度在不同的存储硬件层面上是不同的。内存层面的数据结构的设计复杂度要低于硬盘级的数据结构;而硬盘级的基于固态硬盘(SSD)的数据结构设计和基于磁盘(HDD)的数据结构设计也有很大差异。可以说,没有任何一种针对某一类存储介质优化的存储引擎设计可以普适、泛化到全部其他类的存储介质,通常都会因为存储介质的变化而导致某些读或写性能的大幅改变。这也是存储引擎的架构设计复杂的地方之一。
为了更好地解释存储介质的多样性和复杂性,我们用下图的7层模型示意图帮助分析,理解什么样的存储架构、数据结构的组合可实现高性能的存储(与计算)。

目前,业界掀起一股自2015年前后开始的“存储与计算分离”潮流,这一说法最早是全球存储巨头EMC公司提出的,在逻辑上指的是随着大数据与云计算的蓬勃发展,存储不应仅限于一台机器的本地存储,而应实现存储层与网络层的逻辑分离,也就是说存储资源可以相对独立地(水平)扩展。显然,存储与计算分离隐含的是存储远离计算。
当存储远离计算,即数据在进行计算的时候,它需要经过一个迁移路径才能被CPU所处理,而这个迁移路径的长短有指数级的性能落差,例如在上图中,最下层的网络存储模块中的数据与最上层的CPU中的数据之间有着百万级的性能落差。如果任何一个数据库的查询操作需要触发如此远离CPU的一组网络存储层的操作,那么这个操作的时耗之大可想而知。另一方面,我们不可能把所有数据都堆叠在CPU的缓存层中(尽管理论上这是最低延迟的操作),也不太可能把全量数据都压缩在动态内存之内(尽管业界的持久化内存发展有这个趋势)。
分层存储的逻辑给了我们一个很好的启发,事实上,这是所有数据库都会用到的存储引擎设计逻辑:
·全量数据持久化在“尽可能快的”存储介质上;
·使用内存时采用索引、缓存等快速定位寻址的加速类型的数据结构;
·当内存无法承载后,溢出到持久化层,充分利用持久化层的存储介质访问的特点(区分HDD、SSD、PMEM等)来进行访问加速;
·尽可能利用CPU多核、多线程并发能力;
·尽可能利用数据库查询规律等特征来优化CPU的多级缓存利用率(命中率)。
最后两点是图计算加速的重要设计思路(传统意义上的数据库存储引擎部分是默认包含计算逻辑的,但是图数据库中有必要把图计算引擎部分作为一个独立的逻辑功能模块介绍,因为在存储与计算分离的大趋势下,计算层有其相对独立的特征),我们会在下一篇文章中展开分析。本篇着重分析前三点。
2.高性能存储架构设计思路
存储架构以及核心数据结构的设计思路通常围绕如下4个维度来进行:
·外存与内存使用占比(角色分配及分配比例);
·是否利用缓存,如何优化缓存;
·是否进行数据或记录的排序,如何排序;
·是否允许数据或记录的更改(可变性),以及如何更改。
先开个头,高性能存储架构设计思路要聊的东西很多、很细,需要另起一篇着重介绍一下。今天先这样,周末继续更。
· END ·
(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)
相关文章:
图数据库 | 10、图数据库架构设计——高性能图存储架构(上)
老夫在之前的三大篇内容中,介绍了图数据库的三大组件—图计算、图存储以及图查询语言。(都归拢在图数据库原理、架构与应用这个专栏中了,感兴趣的朋友可以在去找阅读。) 接下来,老夫还将继续深化这三大组件࿰…...
el-table 组件二次封装(vue2)
PublicTable.vue <!-- 公共表格组件 --> <template><div class"table-common"><el-table v-loading"loading" :ref"tableid" border style"width: 100%" :data"tableDatas" :row-key"rowKey&quo…...
张量并行和流水线并行在Transformer中的具体部位
目录 张量并行和流水线并行在Transformer中的具体部位 一、张量并行 二、流水线并行 张量并行和流水线并行在Transformer中的具体部位 张量并行和流水线并行是Transformer模型中用于提高训练效率的两种并行策略。它们分别作用于模型的不同部位,以下是对这两种并行的具体说…...
详解Qt pdf 之QPdfSelection 选择文本类
文章目录 QPdfSelection 类详解前言 详细说明公共函数说明1. 构造函数2. text3. boundingRect4. isEmpty5. startPage6. endPage 使用场景示例代码代码说明总结 QPdfSelection 类详解 前言 QPdfSelection 是 Qt PDF 模块中的一个类,用于表示在 PDF 文档中被选中的…...
一款支持80+语言,包括:拉丁文、中文、阿拉伯文、梵文等开源OCR库
大家好,今天给大家分享一个基于PyTorch的OCR库EasyOCR,它允许开发者通过简单的API调用来读取图片中的文本,无需复杂的模型训练过程。 项目介绍 EasyOCR 是一个基于Python的开源项目,它提供了一个简单易用的光学字符识别ÿ…...
matlab 中的 bug
在matlab中绘图,设置 axe 的背景颜色 axes_in3.Color #00235B ;打印的时候 print(figure_handle1,-dpng,-r300,"merge_yt_ey") ;此时保存的图片无法识别背景颜色 原因在于 matlab 中的 InverseHardcopy 将 InvertHardcopy 设置成 off 则可以解决这个问…...
【算法刷题指南】优先级队列
🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…...
android user版本默认usb模式为充电模式
android插入usb时会切换至默认设置的模式,debug版本为adb,user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…...
[极客大挑战 2019]HardSQL--详细解析
信息搜集 登录系统,有两个可能的注入点: 随便输一下看看传参类型: 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参,四种闭合方式只有单引号报错&a…...
java基础概念46-数据结构1
一、引入 List集合的三种实现类使用了不同的数据结构! 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点:先进后出,后进先出。 java内存容器: 3-2、队列 特点:先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…...
数学建模选MATLAB还是Python?
在进行数学建模时,选择合适的编程语言和工具对于建模的效率和效果至关重要。目前,MATLAB和Python是两个常用的数学建模工具,它们各自有优缺点,适用于不同的场景。本文将从多个维度对MATLAB和Python进行比较,帮助大家做…...
【C++】多线程
目录 一 概念 1 多线程 2 多进程与多线程 3 多线程理解 二 创建线程 1 thread 2 join() 和 detach() 3 this_thread 三 std::mutex 1 lock 和 unlock 2 lock_guard 3 unique_lock 四 condition_variable 五 std::atomic 一 概念 1 多线程 在C11之前࿰…...
【计算机网络】实验2:总线型以太网的特性
实验 2:总线型以太网的特性 一、 实验目的 加深对MAC地址,IP地址,ARP协议的理解。 了解总线型以太网的特性(广播,竞争总线,冲突)。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实…...
基于Matlab合成孔径雷达(SAR)回波信号建模与多指标质量评估
本研究基于合成孔径雷达(SAR)技术,建立了一个雷达回波信号的模拟模型,并通过多项评价指标对信号质量进行深入评估。首先,研究定义了与SAR系统相关的关键物理参数,如工作频率、平台速度、脉冲宽度、采样率等…...
spring boot3.3.5 logback-spring.xml 配置
新建 resources/logback-spring.xml 控制台输出颜色有点花 可以自己更改 <?xml version"1.0" encoding"UTF-8"?> <!--关闭文件扫描 scanfalse --> <configuration debug"false" scan"false"><springProperty …...
浅谈C#库之DevExpress
一、DevExpress库介绍 DevExpress是一个功能强大、界面美观的UI组件库,广泛应用于桌面应用程序和Web应用程序的开发中。它提供了丰富的控件和工具,帮助开发人员快速构建现代化的用户界面。DevExpress控件库以其功能丰富、应用简便、界面华丽以及方便定制…...
【webApp之h5端实战】项目基础结构搭建及欢迎页面的实现
这是一个实战项目的webapp,主要是使用原生js/css/html来实现我们的业务。预览下面的实战效果,我们将会从0到1实现这个系列的项目。包括大量的原生js知识,css3动画的开发,以及页面的交互实现。 效果预览 项目准备工作 封装的工具类,用于获取原生dom节点,处理原生dom事件的…...
生成树详解(STP、RSTP、MSTP)
目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A(Propo…...
C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现
沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…...
Matlab Simulink 电力电子仿真-单相电压型半桥逆变电路分析
目录 一、单相电压型半桥逆变电路仿真模型 1.电路模型 2.电路模型参数 二、仿真分析 三、总结 1.优缺点 2.应用场景 一、单相电压型半桥逆变电路仿真模型 1.电路模型 单相电压型半桥逆变电路是一种常见的逆变电路,主要用于将直流电源转换为交流电源。 &…...
在超表面中琼斯矩阵的使用
琼斯矩阵(Jones Matrix) 是一种线性代数方法,用于描述光的偏振状态和偏振变化,是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用,尤其是在设计和调控光与物质相互作用时,例如偏振控制、相位调制…...
threeJs学习 贴图 :地球
效果图: 贴图以后的效果: vue代码: <template><div class"scene_box"><p>创建纹理贴图TextureLoader</p><div class"canvas"></div></div> </template><script s…...
详解Rust多线程编程
文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全,同时避免运行时的开销&…...
Uniapp触底刷新
在你的代码中,使用了 scroll-view 来实现一个可滚动的评论区域,并且通过监听 scrolltolower 事件来触发 handleScrollToLower 函数,以实现“触底更新”或加载更多评论的功能。 关键部分分析: scroll-view 组件: scroll-view 是一…...
【前端】安装hadoop后,前端启动报错,yarn命令
新安装hadoop后,前端启动项目用yarn命令,报错。 报错:系统找不到指定的路径。 No HADOOP_CONF_DIR set. Please specify it either in yarn-env.cmd or in the environment. 解决:删掉hadoop目录下yarn的文件 检查:…...
T620存储安全方案SoC芯片技术手册
系统资源 集成32位国产CPU CK803S;最高工作频率260Mhz CK803S内置16KB I/D Cache,内置32KB DTCM 32KB ROM;256KB SRAM;8KB SRAM(系统专用) 512KB/1MB 片内Flash 安全算法 支持SM4数据加密,加密性…...
Rust循环引用与多线程并发
循环引用与自引用 循环引用的概念 循环引用指的是两个或多个对象之间相互持有对方的引用。在 Rust 中,由于所有权和生命周期的严格约束,直接创建循环引用通常会导致编译失败。例如: // 错误的循环引用示例 struct Node {next: Option<B…...
力扣 二叉树的锯齿形层序遍历-103
二叉树的锯齿形层序遍历-103 此题就是再二叉树层序遍历的基础上,加了反转当前层数组元素的函数reverse(),也可以不反转,直接在遍历当前层的所有节点的for循环里直接进行if判断,根据遍历方向,决定如何插入元素。 clas…...
PyCryptodome:Python中的密码学库
简介 PyCryptodome是一个功能强大的Python密码学库,提供了各种密码学算法的实现,包括对称加密、非对称加密、哈希函数、消息认证码等。它是对Python的Crypto库的一个现代化和增强版,提供了更好的性能和安全性。 Git地址 PyCryptodome的代码可…...
我眼中的“懂重构”(一)
初识重构 2017年的时候,领导让我看公司的一本书《重构——改善代码的既有设计》,这是一本JAVA版本的,前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂,然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入…...
Excel中日期格式“年月日 时间”修改为“年月日”
需求: 将Excel中“yyyy-mm-dd hh:mm:ss”格式的时间转换为“yyyy-mm-dd”格式的时间,选中转换后的时间时编辑栏中依然会显示“yyyy-mm-dd hh:mm:ss”格式。 方法一、在原数据列进行转换: 1、选中需要转换的数据列,右键--【设置…...
CSS底层基础:小白速来
1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观,包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素,并定义这些元素的具体样式属性。 基本结构示例: …...
【MySQL】库和表的基本操作
目录 库 库的增删查改 字符集与校验集 库的备份与恢复 表 表的创建和删除 用不同的存储引擎创建表的区别 查看表 修改表 添加删除属性 修改改变属性 上篇博客我们讲了数据库的基本理解,对数据库有了一个大致的概念,下面我们来介绍一下库和表的…...
5款AI智能办公工具丨提升办公效率‼️
办公效率低?工作压力大?别担心,这里有五款超实用的AI办公工具,帮你轻松搞定各种任务!🌟 简直不要太实用,快快收藏起来总有一天你会用得上~ 红薯通AI📝写作文案的好帮手,…...
华为HarmonyOS 让应用快速拥有账号能力 -- 3 获取用户手机号
场景介绍 当应用对获取的手机号时效性要求不高时,可使用Account Kit提供的手机号授权与快速验证能力,向用户发起手机号授权申请,经用户同意授权后,获取到手机号并为用户提供相应服务。以下只针对Account kit提供的手机号授权与快…...
lambda strem流表达式处理工具
一个通用的lambda stream流处理工具, 包含了工作中绝大部分场景常用的使用方式 import java.math.BigDecimal; import java.util.*; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.funct…...
Android 编译和使用libheif
项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接,需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题,多了一层路径&…...
新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲
(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架);…...
写NFC微信小程序跳转Uri标签
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8bEEGz&ftt&id615391857885 Dim dispstr As String Dim status As Byte Dim status1 As Byte Dim afi As Byte Dim myctrlword As Byte Dim mypiccserial(0 To 7) …...
Gradle vs. Maven: 到底哪个更适合java 项目?
ApiHug ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.https://apihug.com/ 首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版, 插件; 说到 Java 项目管理,有两个巨头脱颖而出&a…...
【赛博保安】安全日记之常用术语(一)
"企业的信息安全治理水平,直接取决于安全团队人员的技术专业度,而非运营经验值。所谓的技术,并非指渗透和挖洞的能力,而是指软件开发、IT 架构、网络拓扑相关的知识和经验。 站在乙方的角度来看,技术薄弱的安全人…...
设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...
008静态路由-特定主机路由
按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 …...
MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain
介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…...
VINS_MONO视觉导航算法【三】ROS基础知识介绍
文章目录 其他文章说明ROSlaunch文件基本概念定义用途 文件结构根标签常用标签\<node>\<param>\<rosparam>\<remap>\<include>\<arg>\<group> 示例基本示例嵌套示例 使用方法启动 *.launch 文件传递参数 总结 ROS topicTopic 的基本…...
Python 3 教程第13篇(集合)
Python3 集合 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集…...
cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection
原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection,构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…...
开发者如何使用GCC提升开发效率GUI操作
看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…...
什么是隐式类型转换?
隐式类型转换(Implicit Type Conversion)是指编译器在没有明确要求的情况下,自动地将一种类型的值转换为另一种类型。C 语言支持隐式类型转换,这通常发生在表达式运算或函数调用中,以确保操作数或参数的类型兼容性。 隐…...