写点什么

大规模 Neo4j 集群中的因果一致性

  • 2017-04-19
  • 本文字数:1084 字

    阅读完需:约 4 分钟

在 QCon 2017 伦敦大会上,Neo4J Technology 首席科学家 Jim Webber 介绍了 Neo4J 是如何实现因果一致性的。他的演讲内容包括:高层概览Neo4J 集群的架构、使用 Raft 实现共识机制,以及用于实现“写后读”(RAW,read-after-write)一致性的“书签”(Bookmarking)模式。

据 Webber 介绍,为将集群问题分而治之,Neo4J 提供了两类角色不同的节点,分别称为核心(Core)节点和只读(Read)节点。在集群中,核心节点用于写操作,并提供了集群的持久性保证。只读节点是核心集群的只读异步副本,实现在“多读少写”(Read-heavy)负载场景下的扩展。

,Webber 进一步介绍了为达成持久性保证,核心节点是如何实现 Raft 共识算法的。一旦一个事务写入到一个核心节点,Raft 就会对事务做日志,并将事务到复制到集群中所有其余的核心节点。Raft 并非等待事务被完全复制,而是等待大多数选举(Majority Vote),这足以保证写操作的持久性。

Webb 还介绍了 Raft 在性能上和弹性上的优点。对于性能而言,Raft 只需等待大多数复制,因此阻塞的时间更短,进而降低了查询延迟。从弹性的角度看,即使一些节点故障,只要大多数依然可以选举,核心集群就仍然正常工作。

Webber 对 Raft 和 Paxos 做了比较,Raft 相对更简单,而且更易于实现,这就是 Neo4J 选择 Raft 的原因。他认为 Raft 降低了软件故障出现的可能性,提高了应用的可维护性。

据 Webber 介绍,图数据库通常是一类“多读少写”的数据库。即使在写操作期间,也必须读取和遍历图数据。这就是在 Neo4J 集群中通常只读节点要多于核心节点的原因。因为只读节点不参与共识提交,这意味着只读节点适用于自动扩展,并且更易于按需部署或调配。

考虑到事务是被异步复制到只读节点的,Webber 给出了一个简单应用场景,对此机制进行了展示。如果用户需要在创建数据后就立刻读取它们,即便写操作具有持久性保证,但还是有可能无法发现这些数据。这是由于数据是最终一致的,可能数据尚未复制到被查询的节点上。

要解决这一“写后读”一致性问题,Webber 介绍了 Neo4J 中提供的一种因果一致性模式,称为“书签”。

书签模式的第一阶段包含一次写操作,写操作完成后将返回相应的事务标识给客户端。第二阶段是一次读操作,客户端在查询中发送事务的标识。通过使用事务标识,被读取的节点将可以阻塞给定的事务。

Webber 用一个代码例子展示了书签模式,强调了在他看来,实现书签模式是非常简单的。在这个例子中,客户端接收一个事务标识,然后传递给此后的查询。

要了解更多的细节,可以从此处在线完整观看该演讲。Webber 还推荐阅读一下Raft 的论文

查看英文原文: Causal Consistency for Large Neo4j Clusters

2017-04-19 19:002633
用户头像

发布了 227 篇内容, 共 85.3 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

时代变了,企业网站应该这么策划内容

石头IT视角

LeetCode-21. 合并两个有序链表(java)

bug菌

9月日更 Leet Code 9月月更

小程序能否成为电商的突破口

Geek_99967b

小程序 小程序开发

小程序容器技术加入到混合App开发队伍

Geek_99967b

小程序 混合开发

MVCC

急需上岸的小谢

9月月更

DDD领域驱动设计

源字节1号

软件开发 前端开发 后端开发 软件设计思想

业务应用小程序化,一种潜在的技术趋势

Speedoooo

小程序 移动开发 小程序容器

围绕“开源+深耕”策略和数字化监控手段,动态管理场景生态价值

易观分析

银行 易观 场景金融

SAP系统和微信集成的系列教程之二:如何通过微信公众号消费API

汪子熙

API 系统集成 SAP 微信开发 9月月更

动态规划-编辑距离

wing

数据治理的内核:数据质量

小鲸数据

数据治理 数据质量管理 数据质量 数据生命周期

[极致用户体验] 在微信大字号模式下,网页样式乱了怎么办?

HullQin

CSS JavaScript html 前端 9月月更

SD-WAN网络可靠性设计

阿泽🧸

9月月更 网络可靠性设计

边缘服务网格 osm-edge 数据平面基准测试

Flomesh

Service Mesh 服务网格

SAP系统和微信集成的系列教程之一:微信开发环境的搭建

汪子熙

系统集成 SAP 微信开发 微信平台 9月月更

分布式中灰度方案实践

Java 架构

数据治理(九):Atlas界面操作

Lansonli

数据治理 Atlas 9月月更

LeetCode-26. 删除有序数组中的重复项(java)

bug菌

9月日更 Leet Code 9月月更

2022-09-06:以下go语言代码输出什么?A:Hi All;B:Hi go All;C:Hi;D:go All。 package main import “fmt“ func app() f

福大大架构师每日一题

golang 福大大 选择题

在小程序中开启直播的解决方案

Geek_99967b

小程序容器 小程序开发

计算机网络——速率相关的性能指标

StackOverflow

计算机网络 编程‘ 9月月更

深入学习SAP UI5框架代码系列之四:HTML原生事件 VS UI5 Semantic事件

汪子熙

JavaScript SAP SAP UI5 ui5 9月月更

深入学习SAP UI5框架代码系列之三:UI5 控件的渲染器

汪子熙

JavaScript 前端框架 SAP UI5 ui5 9月月更

为什么要用小程序容器做小程序生态

Geek_99967b

小程序 小程序容器 小程序开发

技术团队如何高效落地代码CR

慕枫技术笔记

架构 后端 9月月更

「工作小记」接口请求数据的缓存实践

叶一一

前端 设计思维 9月月更

C++学习------iso646.h与limits.h头文件的源码学习

桑榆

c++ 9月月更

Vue基础语法--插槽(Slot)基础使用

Sam9029

Vue 前端 基础 9月月更

剖析智能运维的五大应用场景

穿过生命散发芬芳

智能运维 9月月更

跟着卷卷龙一起学Camera--AWB

卷卷龙

ISP 9月月更

你真的理解C语言的灵魂 “ 指针 ” 吗?(初阶篇)

Albert Edison

指针 C语言 野指针 9月月更

大规模Neo4j集群中的因果一致性_架构_Andrew Morgan_InfoQ精选文章