Dgraph是一个分布式图形数据库,它使用RAFT进行每个分片的复制,并使用自定义事务协议进行快照隔离的跨分片事务。Dgraph解决了我们2018年报告1.0.2版中的所有问题,并要求进行简短的后续行动。我们在版本1.1.1中发现了五个安全问题-其中一些是Dgraph已经知道的-包括观察到瞬时空值的读取、逻辑状态损坏和丢失确认的插入的大窗口。所有这些问题都涉及平板电脑..。
Dgraph是一个图形数据库,其目标是在带标签的有向图上提供可伸缩、高可用性和快照隔离的事务,同时最小化网络通信以提高性能。从概念上讲,Dgraph存储一组(实体、属性、值)三元组。实体(也称为主题)是紧凑的二进制UID。属性(也称为谓词)是命名边。值(也称为对象)可以是文字值,也可以是其他实体的UID。加在一起,这三个人.。
为了读取此图,Dgraph提供了一种改编自GraphQL的递归查询语言。突变是通过列出要在图中添加或删除的三元组来表示的。为方便起见,Dgraph还可以将与给定实体关联的所有三元组表示为将属性映射到值的JSON对象-其中值是其他实体,该实体的属性和值作为对象递归嵌入。
为了存储大型数据集,Dgraph按属性分割三元组集合,将属性分解为一个或多个图形输入板,并将每个图形输入板分配给一组节点。每个组使用RAFT在该组的三元组上提供复制的、顺序/线性一致的存储和查询。只要每个组的大多数服务器保持完好和连接,Dgraph就应该保持可用。1个。
为了提供跨不同RAFT组的事务隔离,Dgraph构建了一个自定义事务系统。存储节点(称为Alpha)由监控系统(称为Zero)控制。零节点形成单个RAFT集群,该集群监督由每个Alpha组形成的RAFT集群。零领导者在提交时分配事务时间戳和检测冲突,以及维护群集成员资格和平板电脑到组的映射。
作为我们合作的一部分,Dgraph在他们的公共文档中增加了一个关于一致性属性的部分,其中规定Dgraph中的事务确保快照隔离(SI)和实时安全属性:如果事务T1在T2开始之前提交,则T1的提交时间戳严格小于T2的开始时间戳。
当事务仅与单键交互时,Dgraph的实时保证意味着可线性化。然而,Dgraph事务通常是不可线性化的,因为线性化要求操作(即事务)看起来像是原子发生的,而快照隔离允许事务交织,只要它们的写入集是不相交的。原子事务上的线性化是严格的串行化:一种更强的属性。然而,快照的约束条件是.。
我们根据前面的分析回顾并更新了Jepsen测试套件,主要更新了错误处理例程,以适应自1.0.6以来的新Dgraph客户端和服务器行为。我们在LXC和EC2上的5节点Debian集群上运行了我们的测试,复制因子为3。Dgraph Alpha节点被组织成两组:一组具有三个副本,另一组具有两个副本。每个节点都运行Zero和Alpha的实例。
我们测量了Dgraph在各种故障模式下的行为,包括Alpha和Zero崩溃、平板电脑移动、时钟偏差以及具有传递和非传递拓扑的网络分区。
我们最基本的测试将一个唯一数字序列插入到Dgraph中,然后查询所有现有值。然后,我们检查每个成功确认的插入是否出现在最终读取中。我们运行了这项测试的两个变种。
第一个变体使用具有类型和值字段的模式,并且对于每个插入的值v,创建一个具有类型“element”和值v的新实体。要查询,我们搜索每个类型为“element”的对象,并返回其相应值。从类型到值属性的联接有助于验证Dgraph的类型索引是否正常工作。
第二个变体省略了type字段,而是使用单个实体;每次插入v都会创建该实体到v的三元组映射。这意味着我们可以查询与该特定UID相关联的每个值,这直接映射到Dgraph内部存储三元组的方式。Dgraph查找与值谓词相关联的组,在该组中查找该特定实体的UID,并返回所有匹配值,而不使用索引。
向上插入是一种常见的数据库操作,在该操作中,当且仅当对等记录尚不存在时,才会创建记录。例如,我们可能希望确保用户记录e