图数据库 | 10、图数据库架构设计——高性能图存储架构(上)

news2024/12/5 2:44:29

老夫在之前的三大篇内容中,介绍了图数据库的三大组件—图计算、图存储以及图查询语言。(都归拢在图数据库原理、架构与应用这个专栏中了,感兴趣的朋友可以在去找阅读。)

接下来,老夫还将继续深化这三大组件,因为这三者是相辅相成的,这也是图数据库架构设计关键所在,也是需要读者去厘清的。

今儿我们先聊高性能存储架构,严格意义上说任何数据库都需要存储引擎,它承载着数据持久化的职责。

在这个数字化转型、分布式架构概念随处可见的时代,似乎是唾手可得的。然而,曾经很长一段时间Apache Hadoop系统也被认为是数据处理的“神器”​,很多从业者甚至认为Hadoop系统也是高性能的,但所有系统只有在真实场景中对标才会分出性能高低、稳定与否、拓展性如何、实操易用性如何。

和所有其他类型数据库的相同之处是,设计高性能的图数据库至少需要关注3大环节:计算、存储和查询解析与优化

数据库的计算层(或计算组件、计算环节)要解决的问题是,根据查询指令对数据库中存储的数据进行必要的(计算)处理后,返回给请求发起方。具体步骤如下:

1)客户端从数据库服务器端发起查询请求;

2)服务器端收到该查询请求,解析及优化查询指令;

3)从存储引擎读取数据(部分数据可能需要进入内存)​;

4)中央处理器进行相应的计算(各种聚合、排序、过滤等数学运算)​;

5)返回相应的结果。

结合下图,对于一个高性能系统而言,以上5步最核心的是在第3​、4步,即存储层和计算层。本篇内容主要介绍存储环节,计算、查询解析与优化在后面进行介绍。

图1: 数据库管理系统架构分层示意图

1.高性能存储系统的特点

高性能存储系统有3大特点,即存储高效、访问高效和更新高效。

存储高效主要指两个方面:一方面是写入效率高,传统意义上写入可以等同于落盘(持久化在硬盘文件系统上)​,但是随着持久化内存等新技术的出现,​“落盘”这个概念并不准确,读者需要注意区分,写入效率可以体现为TPS(Transactions Per Second)​,即每秒钟写入的记录(或交易笔数)的数量;另一方面是存储这些数据记录(Payload)产生的额外开销小。

关于存储效率,有两个方面在工业界经常被关注:空间换时间和性价比。空间换时间是提升存储效率的一种常见做法,不仅仅是狭义的存储操作,还包括访问、更新等各类操作。NoSQL类型的很多数据库设计理念都采用了用更大存储空间来提升存储引擎时效性的策略,例如使用一些中间过渡的数据结构来实现更高的并发写入性能,即更高的TPS;还有存储放大的情况,例如数据会有多份拷贝,在满足数据安全的同时实现访问效率(避免实时迁移所带来的IO压力)的提升;当然也有一些数据库采用写拷贝(copy-on-write)的方式,通过使用倍增的存储空间来实现并发的读写操作。

在商业化场景中,存储系统的性价比问题也常被关注。在对延时不敏感的场景中就会采用价格低廉的硬件和软件解决方案,反之则会根据业务需求设计高性能、高成本的方案。

访问高效指的是用最小的时耗(或者是最少的操作步数、最低的算法复杂度)来定位并读取需要的数据记录。更新操作的高效性指的是当有记录需要更新或有增量的数据写入或旧记录删除的时候,在存储引擎层面的操作复杂度最低(最小规模的更新、最低数量的更新步骤)​。

存储引擎的复杂度在不同的存储硬件层面上是不同的。内存层面的数据结构的设计复杂度要低于硬盘级的数据结构;而硬盘级的基于固态硬盘(SSD)的数据结构设计和基于磁盘(HDD)的数据结构设计也有很大差异。可以说,没有任何一种针对某一类存储介质优化的存储引擎设计可以普适、泛化到全部其他类的存储介质,通常都会因为存储介质的变化而导致某些读或写性能的大幅改变。这也是存储引擎的架构设计复杂的地方之一。

为了更好地解释存储介质的多样性和复杂性,我们用下图的7层模型示意图帮助分析,理解什么样的存储架构、数据结构的组合可实现高性能的存储(与计算)​。

图2:数据库存储引擎的7层分层示意图

目前,业界掀起一股自2015年前后开始的“存储与计算分离”潮流,这一说法最早是全球存储巨头EMC公司提出的,在逻辑上指的是随着大数据与云计算的蓬勃发展,存储不应仅限于一台机器的本地存储,而应实现存储层与网络层的逻辑分离,也就是说存储资源可以相对独立地(水平)扩展。显然,存储与计算分离隐含的是存储远离计算。

当存储远离计算,即数据在进行计算的时候,它需要经过一个迁移路径才能被CPU所处理,而这个迁移路径的长短有指数级的性能落差,例如在上图中,最下层的网络存储模块中的数据与最上层的CPU中的数据之间有着百万级的性能落差。如果任何一个数据库的查询操作需要触发如此远离CPU的一组网络存储层的操作,那么这个操作的时耗之大可想而知。另一方面,我们不可能把所有数据都堆叠在CPU的缓存层中(尽管理论上这是最低延迟的操作)​,也不太可能把全量数据都压缩在动态内存之内(尽管业界的持久化内存发展有这个趋势)​。

分层存储的逻辑给了我们一个很好的启发,事实上,这是所有数据库都会用到的存储引擎设计逻辑:

·全量数据持久化在“尽可能快的”存储介质上;

·使用内存时采用索引、缓存等快速定位寻址的加速类型的数据结构;

·当内存无法承载后,溢出到持久化层,充分利用持久化层的存储介质访问的特点(区分HDD、SSD、PMEM等)来进行访问加速;

·尽可能利用CPU多核、多线程并发能力;

·尽可能利用数据库查询规律等特征来优化CPU的多级缓存利用率(命中率)​。

最后两点是图计算加速的重要设计思路(传统意义上的数据库存储引擎部分是默认包含计算逻辑的,但是图数据库中有必要把图计算引擎部分作为一个独立的逻辑功能模块介绍,因为在存储与计算分离的大趋势下,计算层有其相对独立的特征)​,我们会在下一篇文章中展开分析。本篇着重分析前三点。

2.高性能存储架构设计思路

存储架构以及核心数据结构的设计思路通常围绕如下4个维度来进行:

·外存与内存使用占比(角色分配及分配比例)​;

·是否利用缓存,如何优化缓存;

·是否进行数据或记录的排序,如何排序;

·是否允许数据或记录的更改(可变性)​,以及如何更改。

先开个头,高性能存储架构设计思路要聊的东西很多、很细,需要另起一篇着重介绍一下。今天先这样,周末继续更。

· END ·

(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)

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

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

相关文章

保护数据,构建信任:联邦学习与差分隐私在AI训练中的实践

文章目录 摘要引言什么是联邦学习?AI模型训练中的数据隐私挑战数据隐私面临的主要问题 联邦学习与差分隐私技术联邦学习的关键流程代码示例差分隐私技术联邦学习与差分隐私结合案例 QA环节总结参考资料 摘要 在人工智能快速发展的背景下,模型训练对数据…

【算法刷题指南】优先级队列

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

ThingsBoard规则链节点:Kafka 节点详解

引言 ThingsBoard 是一个开源的物联网平台,提供了设备管理、数据收集、处理和可视化等功能。规则链是 ThingsBoard 中的一个强大功能,允许用户定义复杂的业务逻辑来处理设备上报的数据。在规则链中,Kafka 节点用于将消息发送到 Apache Kafka …

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

阿里云 Elastic Enterprise 正式上线!

在数据驱动的商业环境中,企业面临着日益复杂的数据管理与分析挑战。阿里云Elasticsearch服务不仅免费提供了 Elastic 原厂的 Enterprise 版本功能,更凭借其增强的数据管理能力、智能AI分析、先进的搜索技术以及全面的安全特性,致力于为企业提…

1201作业

思维导图 作业 头函数 #include <myhead.h> #include"linklist.h" int main(int argc, const char *argv[]) {//调用创建链表函数node_ptr L list_create();if(NULL L){return -1;}//调用头插函数list_insert_head(L,Q);list_insert_head(L,W);list_insert…

【Code First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

大语言模型微调与 XTuner 微调实战

1 大语言模型微调 1.1 什么是微调 大语言模型微调&#xff08;Fine-tuning of Large Language Models&#xff09;是指在预训练的大型语言模型基础上&#xff0c;使用特定任务的数据进一步训练模型&#xff0c;以使其更好地适应和执行特定任务的过程&#xff0c;用于使LLM&am…

Vulnhub靶场 Matrix-Breakout: 2 Morpheus 练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件上传2. 提权 0x04 总结 0x00 准备 下载连接&#xff1a;https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 介绍&#xff1a; This is the second in the Matrix-Br…

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…

24.12.02 Element

import { createApp } from vue // 引入elementPlus js库 css库 import ElementPlus from element-plus import element-plus/dist/index.css //中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn //图标库 import * as ElementPlusIconsVue from element-plus/i…

vxe-table 设置树表格斑马线条纹样式

vxe-table 设置斑马线条纹样式&#xff0c;通过设置 stripe 参数 官网&#xff1a;https://vxetable.cn 表格 斑马线条纹&#xff0c;通过设置 stripe 参数 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> </…

力扣3366.最小数组和

力扣3366.最小数组和 题目 题目解析及思路 题目要求对于数组进行两种操作&#xff0c;使最终数组和最小 注意&#xff1a;每个元素可以同时执行两种操作 考虑动归&#xff0c;暴力的遍历每种情况 代码 记忆化搜索 class Solution { public:// minArraySum 函数用于计算在…

缓存穿透,缓存雪崩,缓存击穿

缓存穿透&#xff1a; 客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样的缓存永远不会生效&#xff0c;这些请求会直接打到数据库中&#xff0c;造成数据库压力过大 解决方法&#xff1a;1.缓存空对象 //TODO 此方法中解决了缓存穿透问题&#xff08;使用了缓存…

【C++boost::asio网络编程】有关异步读写api的笔记

异步读写api 异步写操作async_write_someasync_send 异步读操作async_read_someasync_receive 定义一个Session类&#xff0c;主要是为了服务端专门为客户端服务创建的管理类 class Session { public:Session(std::shared_ptr<asio::ip::tcp::socket> socket);void Conn…

atcoder abc 382 lazy_tag线段树

A Daily Cookie 代码&#xff1a; #include <bits/stdc.h> using namespace std;typedef long long ll;int main() {int n, d;cin >> n >> d;string s;cin >> s;int cnt d;for(auto t: s) if(t .) cnt ;cout << min(n, cnt); } B Daily Co…

【NLP 8、normalization、sigmoid,softmax归一化函数】

"燃尽最后的本能&#xff0c;意志力会带你杀出重围" —— 24.12.2 1. Normalization&#xff08;归一化&#xff09; 归一化是将数据转换为具有统一尺度的形式&#xff0c;通常用于数据预处理阶段。常见的归一化方法包括 Min-Max归一化、Z-Score 归一化和 L…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…

Matlab Simulink 电力电子仿真-单相电压型半桥逆变电路分析

目录 一、单相电压型半桥逆变电路仿真模型 1.电路模型 2.电路模型参数 二、仿真分析 三、总结 1.优缺点 2.应用场景 一、单相电压型半桥逆变电路仿真模型 1.电路模型 单相电压型半桥逆变电路是一种常见的逆变电路&#xff0c;主要用于将直流电源转换为交流电源。 &…

《Vue零基础入门教程》第十五课:样式绑定

往期内容 《Vue零基础入门教程》第六课&#xff1a;基本选项 《Vue零基础入门教程》第八课&#xff1a;模板语法 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事…