《A1 A Distributed In-Memory Graph Database》论文阅读
A1是微软的一篇SIGMOD 2020年“分布式内存图数据库”的论文,其中关于图系统的讨论,以及新技术的运用,值得我们学习和借鉴
本文将按照以下几个方面透彻介绍A1的方方面面
一、Background
1.历史背景
- 有钱 : 便宜的DRAM
- 有技术:商业应用的RDMA
- bypass local kernel
- bypass remote CPU
- tcp中可靠传输和拥塞控制特性,由网卡、交换机实现
- 利用unreliable datagrams (UD) 进行时钟同步
2.技术背景
FaRM 微软在2014年发表了《FaRM: Fast Remote Memorys》
特征
- 线性一致性
- 支持事务
- 支持生成索引
- 提供基本数据结构,如BTree
架构设计
- 主从同步,3副本设计
- 2PC,支持事务
- MVCC实现线性一致性
- 一群运行FaRM进程的机器 + Configuration Manager(负责机器管理 + data placement(可以理解为MMU))
- 每2G内存作为一个region,每个region一个ID
- 可申请并管理 64B - 1M 的object,由64位寻址,32位为region id,32位为region offset
API
- alloc:带有hint参数
- 默认参数本机申请内存
- hint为别的object的地址时,则尽量在一个region
- read
- write
- free
二、System Structure
1.架构图
- 后4层: FaRM
- 前面几层: 定义图的数据结构,定义查询引擎
2.设计原则
- 多用指针
- 如链表,BTree等
- 只存有用数据
- 例如不存图片等信息
- 关注位置
- 可能一起访问的数据存在一台机器
- 处理某个节点时,到相应的机器上处理
- realloc的时候传递旧地址
- 高并发
- 避免热点
3.实际部署方式
- SLB(Software Load balancer)
- 负载均衡
- Frontend
- 路由
- 限流
- Backend
- 执行查询
- 数据处理等
三、 Data structure and query engine
1.点和边的定义
如上图,点和边具有一些相同的定义
- 异构图,必须有type
- 属性图,可以定义kv属性,v的类型多样
- 第二张图片可以理解为pb
- 此pb支持的数据类型有int float string等基本类型,数组 map等类型,同时支持嵌套
点的多出限制
- 必须有主键,非空且唯一
- 由type + primary key唯一标识
边的唯一标识
- src vertex + edge type + dst vertex
和传统数据库的类比如下
2.Catalog
作用
- 寻址全局变量
用法
- 是个map
- key为全局变量的name,value为该变量的64位地址
- 也存在FaRM
- 各个机器可以cache找到的数据,ttl后renew
例如
若要寻找全局BTree a
可以在 Catalog 中找到由key为a时的value,也即Btree a的64位地址,由此可以找到BTree的根节点
3.数据布局
点
点的表示分为两部分
- 点指针
- 点的type
- 入边列表指针
- 出边列表指针
- 点的数据指针
- 点的数据指针
- 点的序列化后的数据
点可以由两种途径找到
- 索引找到
- 边的遍历过程中找到
边
普通节点
边的表示由两个半边组成:出边和入边,数据表示分为两部分
- 出边列表指针
- 边的type
- 入点的指针
- 边的数据指针
- 数据大小
- 由以上4项循环组成list
- 边的数据指针
- 边的序列化后的数据
边可以由一种途径找到
- 由点的出入边列表指针找到
点可以通过边找到
- 出边列表指针中包含入点的指针
超级节点
定义
- 代表边数超过1000条的边
方案
- 全部存在全局 BTree
- key是<src vertex pointer, edge type, dest vertex pointer>
- value是边的数据指针
4.Query
场景
- 读多写少
流程
- client 请求发到SLB,负载均衡
- SLB 转发给 frontend,路由和限流
- frontend 转发给 backend,处理请求
- 生成 logical plan
- 生成 physical plan
- 执行 physical plan
- 2PC:处理请求的 backend 作为 coordinator
- 写请求,本机利用RDMA去读写数据
- 读请求,分散计算到相应的机器,汇总所有的结果,类似Map Reduce
例如
查询和斯皮尔贝格合作的演员,可以有如下查询语句(A1自研的查询语言,为json格式)
查询的执行过程如下,为两跳查询
- 通过 index 找到起始点 (斯皮尔伯格)
- 通过 RDMA 读取点 (斯皮尔伯格) 的出边列表值,并在本地遍历 (点数较少时,在本地计算)
- 分散遍历得到的点 (斯皮尔伯格的电影) 到点所在的机器,进行 谓词运算 & 边的遍历 (点数较多时,分散计算)
- 汇总结果 (符合条件的演员)
- 分散上述结果 (符合条件的演员) 到点所在的机器,进行谓词运算 (反序列化,筛选等)
- 汇总结果,返回客户端,查询完成
四、 Disaster recovery
1.方案
- 三副本,主从同步 (需要参考FaRM实现)
- 持久化
2.实现
这里只提及持久化的实现
- 写WAL,WAL 也写在 FaRM 内存中,3副本
- update事务处理之前,写WAL
- update事务commit之后,把WAL异步apply到持久化存储中
- 有后台线程,按照FIFO顺序,及时apply WAL到持久化存储中
由此
- 内存有副本保留时,使用副本恢复
- 内存3副本均丢失时,使用持久化存储恢复
- 此时,永久丢失的数据就是还没有 apply 到持久化存储的 WAL
关于持久化存储
- 包含两个table
- vertex table 存储所有的点
- edge table 存储所有的边
3.恢复过程
当有内存副本时,因为主从强一致,所以我们使用内存副本恢复;故只考虑3内存副本均丢失,由持久化存储恢复的过程,包含两个恢复模式
consistent recovery
- 相对事务而言,事务一致
best-effort recovery
- 相对 graph 而言,图内数据一致
我们举个例子说明这个过程
存在事务:写入点A,写入点B,写入A到B的边,事务提交
当出现故障,3副本均丢失后,持久化存储中只有点A 和 A到B的边,没有点B
consistent recovery
- 为事务一致,删除点A 和 A到B的边
best-effort recovery
- 为图一致,因为B点不存在,删除 A到B的边,保留A点
由此可见,best-effort recovery 比 consistent recovery 更新
由于不同的恢复,对持久化数据有不同的要求
best-effort recovery
数据格式为 key -> value
Update由事务时间戳判断数据新旧
- 时间戳更新的数据 apply
- 时间戳更旧的数据 丢弃
- created无条件执行
- lazy删除
- 等待GC
- 或者重新创建
consistent recovery
数据格式为 key + ts -> value
- 持续持久化TR,代表当前未apply的log的最小时间戳,也表示小于该时间戳的数据,其所属事务均apply
- 恢复时,小于TR的数据形成事务一致性snapshot
4.优化
方案一:进程地址空间 和 存储数据地址空间 分离
- PyCo (a kernel driver) 在机器启动时,占据一块连续的内存,作为数据存储区域
- 在 FaRM 启动时,FaRM进程获取PyCo的地址空间,在此空间存取数据,逻辑上类似于把内存分为了 内存 + SSD的分布
- 由此,FaRM进程挂掉,并不影响本机数据,但不能防止机器挂掉
- CM监控进程故障
- 非所有副本进程故障时
- 重启FaRM进程,FaRM进程或获取PyCo的内存数据
- 有PyCo中的WAL,处理PyCo中未完成事务
- 所有副本进程故障时
- 暂停整个集群服务,此时不可用
- 等待重启进程,进行上述操作
- 非所有副本进程故障时
五、Performance evaluation
场景
- 数据规模
- 37亿个点,value序列化之后220B
- 62亿条边
- 机器规模
- 245台机器,由此 99.6% (244 / 245) 的点在其他机器
- 机器配置
- two Intel E5-2673 v3 2.4 GHz processors
- 128G DRAM,80G用于存储
- Mellanox Connect-X Pro NIC with 40Gbps bandwidth
- 集群位置
- 位于15个机架
- 4个T1交换机,连接所有机架
- client 和 cluster 在一个数据中心
测试一
- 查询和斯皮尔贝格合作的演员
- 2跳
- 1785次遍历结果,类似于放大
- delay 控制在 10ms 以内
测试二
- 查询演过BatMan的演员
- 3跳
- delay也在10ms
测试三
查询斯皮尔伯格导演,Tom Hanks参演的动作电影
3跳
含有筛选
- delay也在10ms
RDMA测试
RDMA总延时和RDMA次数成正比
拓展性测试
机器数目越多,delay平稳承受的qps越高
以上就是我对于A1主要内容的理解,如有不对之处,烦请批评指正
欢迎有兴趣的同学一起交流讨论
《A1 A Distributed In-Memory Graph Database》论文阅读相关推荐
- 《基于卷积神经网络的深度迁移学习,用于燃气轮机燃烧室的故障检测》论文阅读
目录 突出 抽象 引言 1.1动机 1.2文献综述获得的结论 1.3贡献 1.4组织 2方法 2.1燃汽轮机组故障知识共享 2.2迁移学习 2.3 基于卷积神经网络的深度迁移学习 2.4用于燃气轮机燃 ...
- 基于卷积神经网络和投票机制的三维模型分类与检索 2019 论文笔记
作者:白静 计算机辅助设计与图形学学报 1.解决的问题 由于三维模型投影得到的视图是由不同视点得到,具有相对独立性,这种像素级的融合运算并没有直接的物理或者几何意义,更有可能造成图像有益信息淹没和混淆 ...
- TextCNN——基于卷积神经网络的文本分类学习
1.CNN基础内容 CNN的全称是Convolutional Neural Network,是一种前馈神经网络.由一个或多个卷积层.池化层以及顶部的全连接层组成,在图像处理领域表现出色. 本文主要学习 ...
- 读懂深度迁移学习,看这文就够了 | 赠书
百度前首席科学家.斯坦福大学副教授吴恩达(Andrew Ng)曾经说过:迁移学习将是继监督学习之后的下一个促使机器学习成功商业化的驱动力. 本文选自<深度学习500问:AI工程师面试宝典> ...
- 一种基于卷积神经网络的图像去雾研究-含matlab代码
目录 一.绪论 二.去雾卷积网络 2.1 特征提取 2.2 多尺度映射 2.3 局部均值 2.4 非线性回归 三.实验与分析 四.Matlab代码获取 一.绪论 雾是一种常见的大气现象,空气中悬浮的水 ...
- 机械臂论文笔记(一)【基于卷积神经网络的二指机械手 抓取姿态生成研究 】
基于卷积神经网络的二指机械手 抓取姿态生成研究 论文下载 摘要 第1章 绪论 1.1 抓取生成国内外研究现状 1.1.1已知物体抓取生成 1.1.2相似物体抓取生成 1.1.3 未知物体抓取生成 1. ...
- 毕业设计 - 基于卷积神经网络的乳腺癌分类 深度学习 医学图像
文章目录 1 前言 2 前言 3 数据集 3.1 良性样本 3.2 病变样本 4 开发环境 5 代码实现 5.1 实现流程 5.2 部分代码实现 5.2.1 导入库 5.2.2 图像加载 5.2.3 ...
- 基于卷积神经网络与迁移学习的油茶病害图像识别
基于卷积神经网络与迁移学习的油茶病害图像识别 1.研究思路 利用深度卷积神经网络强大的特征学习和特征表达能力来自动学习油茶病害特征,并借助迁移学习方法将AlexNet模型在ImageNet图像数据集上 ...
- Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)
Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...
- 基于卷积神经网络实现图片风格的迁移 1
卷积神经网络详解 一.实验介绍 1.1 实验内容 Prisma 是最近很火的一款APP,它能够将一张普通的图像转换成各种艺术风格的图像.本课程基于卷积神经网络,使用Caffe框架,探讨图片风格迁移背后 ...
最新文章
- 蓝桥杯:入门训练 序列求和
- mybatis中sqlSession的设计与实现
- linux双屏显示不同内容,LINUX下双屏显示问题
- buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)
- vue中动态设置style样式和使用filters过滤器设置样式
- 一名毕业生的自述:我知道我必须写论文,但没聪明到可以写出来......
- day14(xml 编写及解析)
- html5的canvas绘制时钟
- attention :为什么要用attention机制
- THUPC2019划水记
- Win7 安装程序时报错 error 1935 HRESULT 0x80070422
- 自己SSD近来经常掉盘,一看这一段时间SSD涨价很多啊
- Atitit 学习一项技术的方法总结 目录 1. 自己动手实现学习法	1 2. 七步学习法 —— 如何高效学习一项技能	1 3. 如何快速学习一项技能-十步学习法 - HugoLester - 博客
- 教之初计算机考试试题,教之初题库管理系统操作教程-考题处理
- md快捷键(win)
- h5学习笔记 左右布局
- FlashFXP,小编带你认识什么是FlashFXP软件
- 华为大数据研发第1轮面试
- [ Vue.js ] 报错 ‘scope‘ is defined but never used vue/no-unused-vars
- sklearn基础(一)文本特征提取函数CountVectorizer()和TfidfVectorizer()
热门文章
- idea中使用yapi插件自动生成yapi接口文档
- android 屏蔽 广播,Android中使用BroadcastReceiver打开和关闭WIFI
- 专访衍生品平台BitWell :涨幅350倍之后,DeFi期权财富效应能否延续?
- JavaEE初阶---Tomcat
- 指数和对数的转化利用
- Application Performance Management(APM)
- Linux-5.10源代码之CPU架构简介
- 笔记本电池待机时间变短了|修复笔记本电池|笔记本电池放电软件
- 为学习Hadoop使用VMware准备3台一模一样的Linux虚拟机的详细搭建过程1
- 电脑右键新建没有txt文本