☰
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
2026/10/5 2:26:17 网站建设 项目流程

无索引邻接 · Cypher 执行 · Raft 集群

目 录

一、导读

二、原生图存储引擎

2.1 存储文件结构

2.2 无索引邻接(Index-free Adjacency)

2.3 固定大小记录与页缓存

三、Cypher 执行与事务引擎

3.1 查询生命周期

3.2 索引机制

3.3 ACID 事务

四、因果集群架构

4.1 Core Servers 与 Raft 共识

4.2 只读副本与读扩展

4.3 因果一致性与书签

4.4 Fabric 分析集群

五、架构要点对比

5.1 本篇小结

一、导读

第 01 篇认识了图数据库的定位与属性图模型。本讲以 Neo4j 为对象,逐层拆解其架构:底层是「原生图存储引擎」,把节点、关系、属性直接落盘并实现无索引邻接;中层是「Cypher 执行与事务引擎」,将声明式查询编译为执行计划并保证 ACID;上层是「因果集群」,用 Raft 协议构建高可用与水平扩展。三层递进,正是 Neo4j 性能与可靠性的来源。

二、原生图存储引擎

2.1 存储文件结构

Neo4j 的存储层由三类固定大小的记录文件构成,节点、关系、属性各司其职:

存储文件

记录内容

作用

neostore.nodestore.db

节点 ID + 标签指针 + 属性指针 + 关系指针

定位节点及其关联

neostore.relationshipstore.db

关系 ID + 类型 + 起始/终止节点 + 双向链表指针

维护关系拓扑

neostore.propertystore.db

属性键 + 值 + 下一个属性指针

存储键值属性

2.2 无索引邻接(Index-free Adjacency)

每个节点记录直接包含指向其第一条关系的指针,关系记录又通过 prev/next 指针构成双向链表,串起同一节点的所有关系。这意味着遍历一条关系仅需一次 O(1) 指针跳转,无需查询任何索引;而关系库执行多跳 JOIN 要反复扫描 B+ 树索引,开销随跳数指数增长。官方数据表明,多跳查询比关系库快约 1000 倍。

2.3 固定大小记录与页缓存

所有记录采用固定字节长度,带来两个关键收益:给定 ID 可直接按偏移算出磁盘位置(O(1) 寻址),无需查找页表;同时提升页缓存命中率,避免变长字段导致的缓存行污染。生产环境建议将页缓存(dbms.memory.pagecache.size)设为数据集的 70%–80%,并把数据文件与事务日志分置独立磁盘,规避 I/O 竞争。

三、Cypher 执行与事务引擎

3.1 查询生命周期

Cypher 是声明式查询语言,执行经历四步:解析 → 查询优化器(规划器)生成逻辑计划 → 转换为物理执行计划 → 由 Cypher Runtime 执行。规划器依赖统计信息(各标签节点数、各类型关系数、索引选择性)选择最有效执行方式,执行计划会被缓存复用。示例:

// 声明式描述模式,由规划器选择最优执行路径

MATCH (a:Person {name:"Alice"})

RETURN a

3.2 索引机制

Neo4j 5 提供多种索引:RANGE(范围)、POINT(空间)、TEXT(全文)、向量索引(加载于操作系统内存而非页缓存),以及基于属性的 B 树索引。索引选择性的统计会随数据变化在后台采样(db.resampleIndex() 可手动触发),供规划器生成高效计划。

3.3 ACID 事务

与其他 NoSQL 不同,Neo4j 是一个完全符合 ACID 的事务型数据库:写事务具备原子性、一致性、隔离性、持久性,事务中间状态与结果存于内存并在提交时落盘。运维可用 SHOW TRANSACTIONS 查看、TERMINATE TRANSACTIONS 终止运行中的事务,保障数据可靠性。

四、因果集群架构

4.1 Core Servers 与 Raft 共识

Neo4j 集群采用因果集群(Causal Clustering,自 3.1 起取代旧 HA 架构),核心服务器(Core Servers)是集群「大脑」,负责管理集群状态、领导者选举与事务处理。核心服务器间用 Raft 共识算法实现强一致:所有写入事务必须提交到当前领导者,领导者复制到多数派核心服务器后才认为提交成功,从而保证持久性。生产建议最小 3 个核心服务器。

4.2 只读副本与读扩展

只读副本(Read Replica Servers)异步从核心服务器拉取事务日志并重放,用于水平扩展读吞吐、隔离分析负载。写入仍走核心服务器,读可分流到只读副本,实现读写分离。

4.3 因果一致性与书签

集群的核心一致性保证是「因果一致性」:若客户端在事务 B 中看到了事务 A 的结果,则 B 之后的任何操作也一定能看到 A 的结果。这一保证通过传递事务书签(bookmark)实现,客户端用 neo4j:// URI 连接时可利用书签确保读到已确认写入的数据。

4.4 Fabric 分析集群

面向超大规模读扩展或隔离分析负载,Neo4j 提供 Fabric 复合图数据库:通过 Cypher 整合多个数据孤岛 / 分片进行联合查询,实现即时多集群查询与横向扩展,无需额外代理。

五、架构要点对比

维度

机制

作用

存储

原生图存储 + 无索引邻接

O(1) 关系遍历,多跳高效

缓存

Page Cache(堆外)

缓存热数据,降低磁盘 I/O

查询

Cypher 声明式 + 执行计划

规划器选最优路径

事务

ACID 事务

数据可靠,区别于其他 NoSQL

高可用

因果集群 + Raft

领导者选举、多数派提交

扩展

只读副本 + Fabric

读扩展、跨集群联合查询

5.1 本篇小结

本讲从存储、执行、集群三层拆解 Neo4j 架构:原生图存储以指针跳转实现无索引邻接;Cypher 经规划器编译为执行计划并以 ACID 事务保证可靠;因果集群用 Raft 共识支撑高可用与读写分离。理解这三层,是后续核心原理、部署与选型的基础。

下一篇进入核心原理,深入无索引邻接的物理实现、Cypher 模式匹配与图算法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询