Tugraph的设计和源码初步解析

news2024/12/23 16:16:54

1. Tugraph

Tugraph是一款开源的性能优秀的图数据库,该图数据库使用多版本的B+Tree作为数据的存储引擎,同时设置了点边数据在这个存储引擎上的布局(主要考虑数据的局部性),从而达到高性能查询的目的。本文主要从Tugraph使用的存储引擎和Tugraph的设计角度进行一些分析。TuGraph的源码仓库:GitHub - TuGraph-family/tugraph-db: TuGraph is a high performance graph database.

2. LMDB

2.1 LMDB的特点:

优点:

  • 基于B+树的key/value存储
  • 支持事务(ACID),隔离界别为Serializable 
  • 支持多版本控制,读操作不会阻塞写操作
  • 使用memory-mapped映射文件,不需要调整cache的参数,冲突重启不需要恢复数据
  • 使用CacheLine对齐的数据结构,对CPU的缓存友好
  • 支持并发操作,支持多进程或者多线程,Writer不会阻塞Reader,同样Reader不会阻塞Writer
  • 在多CPU机器上读操作可以实现真正的线性扩展,没有死锁的问题
  • 完全隔离的多版本并发(实现中两个版本),Serializable的隔离等级,可以实现事务的嵌套(Tugraph没有实现事务的嵌套)
  • 可以批量写
  • 使用Copy-on-Write,数据不会被覆盖,只会Append写入,两个版本保证旧数据会空间会被回收复用;
  • 无需WAL,DB崩溃后无需恢复,没有commit的数据视为无效数据无需恢复
  • 使用单级存储(Single-Level Store)
  • 读操作直接饮用MMAP指针,没有数据拷贝开销
  • 写操作直接写入MMAP映射到磁盘,没有buffer,也不需要buff的调参。依赖于OS的pageCache,在应用层没有cache的浪费

缺点:

  • 任意时刻只能一个线程写数据
  • 对于长时间事务来说,多版本树可能会蜕变成append-only树,导致写入后数据无限增长;
  • 没有compaction机制,导致数据不能做TTL的回收
  • 使用操作系统来管理内存,数据库的性能会收到系统的影响比较大
  • 使用mmap,频繁缺页产生中断,会对性能产生影响

2.2 LMDB的实现原理

Append only tree:

如下图有个三层结构的B+Tree结构

 他在硬盘上的存储结果如下所示:

每个方框的是一个page的大小,由于磁盘测存储是一维的,所以这里会按照page Flat成一位的存储,Mata存在在文件的最尾部,他记录的root的pageID,从Meta中就可以将整棵树遍历,一般Meta在内存中;当我们修改Leaf8中的数据的时候,会有如下的变化:

由于我们采用COW的方式,因此并不会in-place的修改leaf8上的数据,而是将leaf8 copy到一个新的page,由于file中增加的新的page,改变了树的结构,因为这个修改会将leaf8的父节点,一直到根节点复制一份。新的父节点指向新的叶子结点(这里是leaf12),对于没有修改的leaf还保持指向不变。此时会有两个版本的数据同时存在,如果此时有读tranaction指向leaf8,他读到的数据还是之前的老版本数据,一直到其tranction结束;当修改leaf12的事务完成写的时候,整个修改在磁盘上的形式如下所示:

可以看到,修改一个page的数据需要增加4个page的数据append到文件的尾部,会带来一定的写放大,以及磁盘空间的浪费。但是这种顺序的写入相比随机in-place的写入效率会高很多,并且这种写入不需要事务日志,因为数据本文件本身就是日志;这种Append-Only的形式带来的问题就是旧版本数据的会积累的越来越多,文件大小会无限的增加上去,为了解决这个问题,LMDB采用每个root维护两个B+Tree的方式;其中一个存储用户的数据,另一个存储给定的事务中空闲的pageID 列表,这样就的一些老的page可以被重复利用,从而保证数据库无限制的增加,同时也减少了Compaction的过程(注意这里是有条件的,旧的page不被其他事务引用的情况下才会进行服用旧的闲置的page);

LMDB的实现方式

下面以进行四个transaction进行数据写入为例:

 可以看到LMDB的数据数据没有像Append-only Tree那样数据无尽的增长下去,这主要归功于lmdb的多版本的功能(目前只有两个版本),旧版本数据不在被读者使用的时候,就会释放空间,义工后续的数据写入;

3. Tugraph设计解析

Tugraph的数据是在lmdb的基础上使用page为单位存储点以及改点的临边的数据,这样可以保证能够快速读取某点以及某点所以临边的数据;

Tugraph的设计:

 如图所示,tugraph支持多图空间,用GraphManager来管理多个图,每个图里面分为schema模块,graph模块,索引管理模块,插件管理模块,以及全文索引管理模块等组成。其中schema模块主要管理数据的元信息,而真正的数据存储在graph中,这里面每个模块管理的数据都在对应到lmdb的一个表中。而tugraph的点边数据组成如下所示:

 4. 总结

        Tugraph采用lmdb作为存储引擎,也就具备了lmdb的优缺点,具有优秀的查询性能,但是尽管采用多版本的append-Only Tree和COW技术,使得在写入数据的时候具有明显的写放大行为;同时由于没有compaction的行为,使得Tugraph的数据只能不断的增长;

5. 参考文献

  1. how the append-only btree works
  2. LMDB API查询
  3. LMDB benchmark
  4. http://www.lmdb.tech/media/20141120-BuildStuff-Lightning.pdf  OpenLDAP Project LMDB
  5. Symas LMDB Tech Info | Symas
  6. https://arxiv.org/pdf/1910.05773.pdf  LiveGraph的原理介绍
  7. https://www.usenix.org/system/files/conference/osdi16/osdi16-zhu.pdf Gemini: A Computation-Centric Distributed Graph Processing System
  8. https://www.usenix.org/system/files/conference/fast15/fast15-paper-zheng.pdf
  9. https://www.usenix.org/system/files/conference/osdi12/osdi12-final-126.pdf
  10. MMap: Fast Billion-Scale Graph Computation on a PC via Memory Mapping - PMC  MMap: Fast Billion-Scale Graph Computation on a PC via Memory Mapping

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

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

相关文章

ubuntu系统登录密码重置方法

公司搬家,需要更改git服务器地址,发现服务器密码也忘记了,折腾了下,通过如下方法修改成功。 一、重启计算机并进入GRUB菜单(如果您的计算机没有显示GRUB菜单,请尝试按住Shift键或Esc键,直到出现…

手机安卓Termux搭建Hexo博客网站,并发布公网访问。

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章:安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

DAY04_JDBC快速入门JDBC API详解SQL防注入数据库连接池JDBC综合练习

目录 1 JDBC1.1 JDBC概念1.2 JDBC本质 1.3 JDBC好处 2 JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.4 ResultSet3.4.1 ResultSet案例 3.5 PreparedStatement3.5.1 SQL注入3.5.2 …

基于opencv实现两路yuv数据拼接合成一张大图

背景 实时音视频通话(RTC)越来越注重安全审核,特别是在1v1娱乐社交场景中,对于视频反垃圾的需求也越来越大。随之而来的是客户对审核成本降低的诉求日益强烈。针对1v1场景,将两路视频拼接成一张图片进行审核相比于分别…

大数据Doris(三十一):Broker Load导入HDFS json格式数据和注意事项

文章目录 Broker Load导入HDFS json格式数据和注意事项 一、导入HDFS json格式数据 1、创建Doris表

nginx(八十一)rewrite模块指令再探之(三)重定向

一 return和rewrite重定向再探 ① 前言 多种重定向跳转方式的差异 nginx与Location响应头细节探讨 本为不涉及讨论如下的绝对重定向1) return 301 http://www.wzj.com:6443/url?namewzj2) rewrite ... http://www.wzj.com:6443/url 2) rewrite ... http://www.wzj.com:64…

一分钟学一个 Linux 命令 - pwd

前言 大家好,我是 god23bin。欢迎大家继续围观《一分钟学一个 Linux 命令》,每天只需一分钟,记住一个 Linux 命令不成问题。本篇文章将聚焦于 pwd 命令,一个超级简单又常用的命令。在接下来的内容中,我将快速介绍 pwd…

Elasticsearch总结

详细描述一下 Elasticsearch 搜索的过程? 1、搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch; 2、在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执…

chatgpt赋能python:使用Python关闭所有子进程

使用Python关闭所有子进程 如果您使用Python编写了多进程应用程序,那么您可能会遇到一些关闭所有子进程的问题。这种情况可能是您的主进程已经完成了,但是子进程却没有关闭,从而导致资源浪费和程序崩溃。在这篇文章中,我们将讨论…

STM32F1xx -- Systick 系统滴答定时器

1. SysTick 是一个向 CPU 提供定时中断信号的计数器,其计数速率是由 Cortex-M 系列处理器的系统时钟频率和 SysTick 计数器的重载值共同决定的。 1.1 Systick 时钟来源之一,Systick 一般设置为1ms 中断一次,为系统任务调度提供服务&#xff…

R语言:集卡活动概率测算模拟

背景:以支付宝集五福活动为代表的集卡类营销活动背后,每张卡出现的概率测算是非常重要的,假设我们可以预估有多少人参与活动以及大致每人能抽多少次,且限定一共有多少人能够集齐,在这些限定条件下,每张卡出…

CentOS 系统上安装 Jenkins

#######################注意我这里安装jenkins版本要求实际是要安装jdk11版本的~~~我一开始弄错了 您可以按照以下步骤在 CentOS 上安装 JDK: 1. 首先,打开终端并使用 yum 命令更新系统软件包列表。输入以下命令来执行此操作: sudo yu…

chatgpt赋能python:Python为什么闪退?

Python为什么闪退? Python作为一种高级编程语言,已经赢得了世界各地许多开发者的青睐。但是,有时候Python会因为各种原因而突然闪退,给开发者带来极大的困扰。那么,Python为什么会闪退呢? 1. 内存泄漏 内…

环境感知算法——2.CenterNet基于KITTI数据集训练

1. CenterNet简介 CenterNet采用了一种新的检测思路,即以目标中心点为基础,直接回归出目标的位置和大小。而传统的目标检测算法通常会先产生大量候选框(Anchor),再通过分类器进行筛选,这种方法比较复杂。C…

selenium浏览器自动化测试

Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中,可以模拟用户在浏览器上面的行为操作。 Selenium入门 下载驱动 查看谷歌浏览器版本 谷歌浏览器输入网址的地方输入:chrome://version 下载与浏览器对应(或相近&#x…

RK3588平台开发系列讲解(驱动基础篇)驱动模块传参

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、驱动模块传参简介二、驱动模块传普通参数三、驱动模块传数组沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在编写应用程序的时候,我们可以给 main 函数传递参数,比如 void main(int argc,char *argv[]…

【ChatGPT】如何利用ChatGPT来快速统计Excel数据?

系列文章目录 老板让你写个PPT没有头绪?没事,ChatGPT来帮你!传送门 文章目录 系列文章目录前言一、不会公式?帮你生成二、不会处理数据?帮你处理写在最后 前言 自从人工智能横空而出,它在人们的生活中产生…

Apache配置与应用与网页安全优化

Apache配置与应用与网页安全优化 构建虚拟Web主机httpd服务支持的三种虚拟机类型基于域名的虚拟主机Options指令解释AllowOverride指令解析 基于IP地址的虚拟主机基于端口的虚拟主机Apache连接保持构建Web虚拟目录与用户授权限制Apache 日志分割AWStats分析系统 网页压缩网页缓…

研发工程师玩转Kubernetes——多Worker Node部署

在之前的系列中,我们都是在单Node上“玩转”kubernetes,熟悉了它很多指令和特性。从本节开始,我们开始探索多Worker Node的相关特性。 部署虚拟机 因为desktop版ubuntu非常占用内存,而且我们已经熟悉了一些基本操作,…

电能质量监测装置在半导体公司“大放异彩”

摘 要:半导体生产制造业在国民经济中起着举足轻重的作用,相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证,还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…