首页
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云PolarDB一体化解决方案
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品 APCC: Greenplum管理平台
文档
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源
登录
×
修改密码

RisingWave 技术文档(二)

架构篇:系统设计

“分布式系统的设计,从来不是在单点最优和全局效率之间做选择题。RisingWave 选择用 SQL 作为统一的抽象,让用户专注于业务逻辑,而非底层复杂性。”


2.1 设计理念

存算分离:云原生的必然选择

传统的大数据系统(如早期的 Apache Storm、Flink)采用存算耦合架构:计算节点本地存储状态,一旦节点宕机,恢复时需要把全部状态从远端拉回本地。这个过程可能需要数分钟甚至更长时间。

RisingWave 从第一天就选择了存算分离

  1. ┌─────────────────────────────────────────────────────────────────┐
  2. 传统架构
  3. ├─────────────────────────────────────────────────────────────────┤
  4. Compute Node 1 ──────── 本地磁盘(状态)
  5. Compute Node 2 ──────── 本地磁盘(状态)
  6. Compute Node 3 ──────── 本地磁盘(状态)
  7. 问题:扩缩容需要迁移本地状态,速度慢
  8. └─────────────────────────────────────────────────────────────────┘
  9. ┌─────────────────────────────────────────────────────────────────┐
  10. RisingWave 架构
  11. ├─────────────────────────────────────────────────────────────────┤
  12. Compute Node 1 ──缓存──▶ S3 / MinIO (Hummock)
  13. Compute Node 2 ──缓存──▶
  14. 共享存储
  15. Compute Node 3 ──缓存──▶ S3 / MinIO (Hummock)
  16. 优点:节点扩缩容无需迁移状态,启动即用
  17. └─────────────────────────────────────────────────────────────────┘

在 RisingWave 中,计算节点的本地状态只是缓存,真正的数据持久化在远端对象存储(S3、MinIO、HDFS)。当一个节点宕机重启时,它不需要拉回全部状态——它从空缓存开始,遇到 Cache Miss 时再从远端按需拉取数据。这就是秒级故障恢复的秘密。

SQL-First:降低流处理的门槛

Apache Flink 的出现让流处理变得更易用,但 Java/Python API 仍然有陡峭的学习曲线。

RisingWave 选择了纯 SQL 作为接口:

更重要的是,RisingWave 实现了一套完整的 SQL 优化器——它不只是把 SQL 翻译成执行计划,而是像传统数据库一样进行查询优化(谓词下推、列裁剪、Join 重排序等)。

弹性和可扩展性

在云原生时代,系统的弹性决定了对资源的利用率:


2.2 整体架构

RisingWave 采用四节点分离架构,每种节点各司其职:

  1. ┌─────────────────────────────────────────────────────────────────┐
  2. 客户端 (PostgreSQL Driver)
  3. └─────────────────────────────────────────────────────────────────┘
  4. ┌─────────────────────────────────────────────────────────────────┐
  5. Frontend Node
  6. ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌─────────────┐
  7. Binder │→ Optimizer │→ Planner │→ Stream Frag-
  8. (87+规则)│ menter
  9. └─────────┘ └──────────┘ └────────────┘ └─────────────┘
  10. └─────────────────────────────────────────────────────────────────┘
  11. ┌────────────────┐ ┌────────────────┐ ┌────────────────┐
  12. Meta Node Compute Node Storage
  13. ┌───────────┐ ┌───────────┐ ┌───────────┐
  14. Global Stream Hummock
  15. Barrier Manager State
  16. Manager └───────────┘ Store
  17. └───────────┘ ┌───────────┐ └───────────┘
  18. ┌───────────┐ Actor
  19. Catalog Manager
  20. Manager └───────────┘
  21. └───────────┘ ┌───────────┐
  22. ┌───────────┐ Batch
  23. Fragment Executor
  24. Scheduler └───────────┘
  25. └───────────┘
  26. └────────────────┘ └────────────────┘ └────────────────┘

Frontend:SQL 处理的大脑

Frontend 负责接收 SQL 请求,产出可执行的计划。它包含几个关键组件:

Binder:将 SQL 语句绑定到实际的 catalog 对象(表、视图、函数等)。当用户写 SELECT * FROM orders 时,Binder 会解析 orders 指向哪个表,它的列是什么。

Optimizer:应用 87+ 优化规则,将逻辑计划转化为更高效的物理计划。RisingWave 使用 Volcano-style 优化模型,类似于 PostgreSQL 和 ORCA。

Planner:将优化后的计划转换为可执行的形式。对于流处理任务,Stream Fragmenter 负责将计划拆分为多个「Fragment」,每个 Fragment 可以在不同节点并行执行。

Meta:集群协调的心脏

Meta 节点负责整个集群的协调工作,是名副其实的「大脑」:

GlobalBarrierManager:管理 Barrier 的生成和分发。Barrier 是 RisingWave 实现分布式快照和 Exactly-Once 语义的关键机制。

Catalog Manager:管理元数据(表、视图、函数、数据源等)。

Fragment Scheduler:将 Frontend 生成的执行计划调度到 Compute 节点。

Compute:数据处理的手

Compute 节点是实际执行计算的地方。每个 Compute 节点运行两个主要的执行引擎:

Stream Executor:处理流式数据,持续不断地消费输入数据并更新物化视图。

Batch Executor:处理用户发起的即时查询。

Storage:数据持久化的基石

Hummock 是 RisingWave 的存储引擎,构建在对象存储之上。它采用 LSM-tree 结构,提供高性能的读写能力,同时支持 MVCC 实现快照隔离。


2.3 流处理引擎

流处理引擎是 RisingWave 的核心,负责持续消费数据并更新物化视图。

Actor 模型

RisingWave 的流处理采用 Actor 模型

Executor 框架

每个 Actor 内部由多个 Executor 组成,每个 Executor 负责一种计算逻辑:

Executor 职责
Filter 行过滤
Project 列投影
HashJoin 流式 Hash Join
Aggregate 聚合运算
TopN Top-N 排序
WatermarkFilter 水印过滤
Source 数据源读取
Sink 数据输出
MView 物化视图维护

Barrier 同步机制

Barrier 是 RisingWave 实现分布式快照和 Exactly-Once 语义的核心机制。

Barrier 本质上是一个带有Epoch 编号的特殊消息。它在流经整个 DAG 时,同时携带了「在这个 Epoch 之前的所有数据都已经到达」的信号。

Chandy-Lamport 算法

RisingWave 的 Barrier 同步基于经典的 Chandy-Lamport 分布式快照算法。这个算法能够在不停止流处理的情况下,获取分布式系统的全局一致状态。

Checkpoint 频率

RisingWave 默认的 Checkpoint 间隔是 10 秒——这远低于业界通常的 1-3 分钟。


2.4 批处理引擎

分布式查询执行

Batch 查询的执行遵循「树形结构」:


2.5 SQL 前端

SQL 前端负责将用户输入的 SQL 转化为可执行的分布式计划。

查询规划流程

SQL Text → SQL Parser → Binder → Logical Plan → Optimizer → Physical Plan → Stream Fragmenter

优化规则示例

  1. 谓词下推(Predicate Pushdown):将 Filter 尽可能下推到 Scan 阶段执行
  2. 列裁剪(Column Pruning):只读取查询需要的列
  3. 分布式聚合(Two-Phase Aggregation):本地先做部分聚合,再全局聚合
  4. Join 重排序:根据统计信息选择最优的 Join 顺序

2.6 存储引擎:Hummock

Hummock 是 RisingWave 的核心存储引擎,它的命名来自《Donkeys》系列漫画中一只喜欢吃垃圾的小动物——寓意它善于处理「别人不要的垃圾」( compaction 的旧数据)。

LSM-tree 结构

Hummock 采用 LSM-tree(Log-Structured Merge-tree) 结构。

写入路径:

  1. 数据首先写入 MemTable(内存缓冲区)
  2. MemTable 写满后,转换为 L0 SST 文件
  3. 后台 Compactor 定期将 L0 与 L1 合并

读取路径:

  1. 先检查 MemTable(最新数据)
  2. 使用 Bloom Filter 快速定位可能包含数据的 SST
  3. 多层数据合并(Merge)

MVCC 多版本并发控制

Hummock 使用 Epoch-based MVCC 实现快照隔离。


2.7 小结

核心要点回顾:

  1. 四节点分离:Frontend、Compute、Meta、Storage 各司其职
  2. Actor 模型:分布式并行的基本执行单元
  3. Barrier 同步:Chandy-Lamport 算法实现全局快照
  4. 存算分离:计算无状态,状态在 Hummock
  5. 完整 SQL 优化:87+ 规则,Volcano-style 优化器
  6. LSM-tree 存储:Hummock 提供高性能持久化

下一篇预告

在理解了架构之后,我们将深入 RisingWave 的核心特性。你将了解到:

敬请期待:《特性篇:核心优势与一致性保障》


想了解更多?