首页
解决方案
技术服务
专业数据库维保服务 大数据维保服务
一体机
Oracle数据库一体机 PolarDB数据库一体机 瀚高数据库一体机 崖山数据库一体机 海扬数据库一体机 高斯数据库一体机 金仓数据库一体机
产品
CLup乘数云统一平台 CData高性能数据库云一体机 CPDA高性能双子星数据库机 CBackup数据库备份恢复云平台 CMiner: PostgreSQL中的CDC CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品 APCC: Greenplum管理平台
文档
文章
客户及伙伴
中启开源
关于我们
登录
×
修改密码

RisingWave 技术文档(三)

特性篇:核心优势与一致性保障

“在分布式系统中,「正确性」和「性能」往往是一对矛盾。RisingWave 通过精巧的架构设计,在多个维度上实现了鱼与熊掌的兼得。”


3.1 四大一致性保障

快照读取(Snapshot Read)

当用户在同一时间点读取 Materialized View 和 Table 时,RisingWave 保证返回完全一致的数据。

RisingWave 的内部状态管理使用 Epoch-based versioning。每个数据变更都带有一个 Epoch 编号。当用户发起查询时,系统会选取一个「已确认」的 Epoch,所有数据都基于这个 Epoch 进行读取。

原子写入(Atomic Write)

当上游数据库(如 PostgreSQL)通过 CDC 写入 RisingWave 时,一个业务事务可能产生多条变更日志。RisingWave 能够重放(Replay)这些日志,保证在目标端的事务原子性。

回填(Backfill)

当用户创建一个新的 Materialized View 时,物化视图需要「追上」基表的当前状态。这个过程叫做 Backfill。Backfill 是分布式可恢复的——如果创建过程中节点故障,系统可以从断点继续。

Checkpoint

Checkpoint 是 RisingWave 实现容错的核心机制,基于经典的 Chandy-Lamport 算法,在不停机的情况下获取分布式系统的全局一致快照。

默认配置下,Checkpoint 间隔为 10 秒——这意味着系统故障后最多丢失 10 秒的数据。


3.2 高可用与故障恢复

秒级故障恢复

当一个 Compute 节点宕机时,RisingWave 的恢复流程:

  1. Meta 检测到节点心跳超时
  2. 将该节点的任务调度到其他节点
  3. 新节点从 Hummock 读取 Checkpoint 状态
  4. 新节点从 Checkpoint 位置继续消费数据
  5. 物化视图「追上」最新状态

关键在于:新节点启动时不需要「恢复」整个状态,而是以「缓存缺失」的方式按需加载。

Exactly-Once 语义

RisingWave 通过三种机制实现 Exactly-Once:

  1. 幂等 Sink:写入下游时,附带唯一 ID,允许去重
  2. 事务性输出:每个 Epoch 的输出作为原子批次提交
  3. Checkpoint 恢复:故障后从最近 Checkpoint 重放

3.3 弹性扩缩容

存算分离:扩缩容的基础

RisingWave 能够实现秒级扩缩容的根本原因在于存算分离架构:

动态负载均衡

当某个 Compute 节点的负载过高时,Meta 可以将部分 Fragment 迁移到其他节点。整个迁移过程对用户透明——查询不会中断,物化视图持续更新。


3.4 SQL 能力

RisingWave 的 SQL 能力不是「流处理子集」,而是完整的 PostgreSQL 兼容

完整的查询优化器

RisingWave 实现了 Volcano-style 查询优化器,包含 87+ 条优化规则

物化视图的增量维护

当基表数据发生变化时,RisingWave 会增量更新物化视图,而不是全量重算。


3.5 Multi-way Join

多流 Join 是流处理中最具挑战性的场景之一。

传统流处理的困境

在 Apache Flink 等系统中,多流 Join 的状态存储在本地磁盘,状态大小受限于单机磁盘容量。

RisingWave 的方案

RisingWave 的状态存储在 Hummock (S3),每个节点的本地只是缓存。可以支持 10-20 个流甚至更多的 Join


3.6 UDF 支持

Python UDF

  1. CREATE FUNCTION obfuscate_email(email VARCHAR)
  2. RETURNS VARCHAR
  3. LANGUAGE python AS $$
  4. def obfuscate_email(email):
  5. parts = email.split('@')
  6. if len(parts) == 2:
  7. return parts[0][:2] + '***@' + parts[1]
  8. return '***'
  9. $$;

Java UDF

  1. CREATE FUNCTION calculate_distance(lat1 DOUBLE, lon1 DOUBLE, lat2 DOUBLE, lon2 DOUBLE)
  2. RETURNS DOUBLE
  3. LANGUAGE java AS $$
  4. public class GeoUtils {
  5. public static double haversine(...) { ... }
  6. }
  7. $$;

3.7 小结

特性 说明 优势
快照读取 Epoch-based 一致性 跨表/视图查询总是一致的
原子写入 事务性 CDC 回放 不会看到「半个事务」
回填 增量构建 MV 新 MV 快速追上最新状态
Checkpoint 10 秒间隔 故障最多丢失 10 秒数据
秒级恢复 Cache-aside 启动 节点故障秒级恢复
Exactly-Once 幂等 + 事务 端到端不重不漏
存算分离 状态在 Hummock 扩缩容无需迁移状态
资源隔离 资源组 物化视图不影响查询
完整 SQL PG 兼容 + 优化器 87+ 优化规则
Multi-way Join 10-20+ 流 支持复杂业务逻辑
UDF Python/Java 扩展 SQL 表达能力

下一篇预告

在理解了核心特性之后,我们将进入实战场景。你将了解到:

敬请期待:《应用篇:实战场景与案例分析》


想了解更多?