PolarDB 存算分离
随着业务规模扩大,传统关系型数据库架构逐渐暴露出扩展能力不足、存储成本高、读写压力集中等瓶颈。云厂商为此设计了一种新的架构模式:存算分离(Storage-Compute Decoupling)。本文从架构角度分析 PolarDB 的存算分离设计,并与 AWS Aurora 以及传统 MySQL 架构进行对比。
背景
PolarDB 是阿里云推出的一款云原生数据库,其核心设计理念之一就是 计算层与存储层解耦。这种架构使数据库具备更强的弹性扩展能力和更高的资源利用率。

传统 MySQL 架构的问题
在传统 MySQL 架构中,数据库通常运行在单个服务器上,计算和存储都在同一台机器:
MySQL Server
├── CPU
├── Memory
└── Local Disk # 数据与计算绑定在同一台机器
这种架构在早期互联网时代已经足够,但随着业务规模扩大,会出现几个明显问题。
1) 存储扩展困难
数据库数据通常存储在本地磁盘中,当数据量增长时,只能升级磁盘或更换更大的机器,扩展能力有限。
2) 读扩展成本高
MySQL 常见的扩展方式是 主从复制:
Master
├── Slave1 # 每个从库都持有一份完整数据副本
├── Slave2
└── Slave3
每个只读节点都需要一份完整的数据副本。随着读节点增加,存储成本会快速增长,数据同步压力也随之上升。
3) 高可用复杂
如果主节点故障,需要手动或自动进行主从切换,期间可能存在复制延迟,数据一致性也需要额外处理。
PolarDB 的存算分离架构
PolarDB 的核心设计是:计算节点与存储节点完全解耦。架构大致如下:
+--------------------+
| Compute Node |
| (MySQL / PG / ORA) | # 计算层:SQL 解析、执行、事务
+---------+----------+
|
+---------+----------+
| Distributed Storage| # 存储层:数据、日志、副本
| (PolarStore) |
+--------------------+
计算节点负责 SQL 解析、查询执行和事务处理;存储层负责数据存储、日志管理和副本复制。所有计算节点共享同一份分布式存储,这种架构被称为 Shared Storage Architecture。
存算分离解决了什么问题
这种设计主要解决了传统数据库的几个核心问题。
1) 弹性扩展能力
传统数据库增加计算能力必须升级服务器,而在 PolarDB 中可以直接增加计算节点:
Storage Layer
↑
│
Compute1 # 新增计算节点无需复制数据
Compute2
Compute3
所有节点共享同一份数据,因此可以实现读扩展、分布式计算和秒级扩容。
2) 存储成本降低
传统 MySQL 的读节点需要完整数据副本,而在存算分离架构下,多个计算节点共享同一存储系统,不需要复制完整数据,存储成本显著降低。
3) 高可用能力更强
PolarDB 的存储层通常使用分布式副本机制:
Storage Node
├── Replica1 # 多副本保障数据持久化
├── Replica2
└── Replica3
当某个节点故障时,系统可以极快地进行恢复。这种设计可以实现自动故障恢复、高可用架构和数据持久化保障。
4) 极致性能
PolarDB 存储层通常采用分布式日志结构、并行 I/O 和 SSD 云存储,可以大幅提升数据库性能。主要瓶颈从存储层转移到了内部网络 I/O 层。
PolarDB 的劣势
虽然存算分离架构有很多优势,但也存在一些挑战。
1) 网络延迟
计算层与存储层分离意味着数据访问需要通过网络,相比本地磁盘会增加一定延迟。
2) 架构复杂度高
存算分离架构需要设计分布式存储系统、网络协议和数据一致性机制,实现难度远高于传统数据库。
3) 对云基础设施依赖强
这种架构高度依赖高性能网络、分布式存储和云平台调度能力,因此通常只适用于云环境。
PolarDB vs AWS Aurora
PolarDB 和 Aurora 的整体设计理念非常接近,二者都是典型的 云原生数据库架构,都采用了 存算分离(Compute + Storage Decoupling) 的设计。
Aurora 将计算节点与一个分布式存储集群分离,多个计算节点共享同一存储系统。架构示意:
Writer Node
|
+-------+-------+
| |
Reader1 Reader2 # 读节点共享底层存储
| |
+-----------------------+
| Distributed Storage |
+-----------------------+
Aurora 的分布式存储通常跨多个可用区部署,以提升可用性。但在具体实现上,两者仍然存在一些重要差异。
1) 存储架构设计差异
Aurora 的核心设计是 日志驱动存储(Log Structured Storage)。在 Aurora 中,计算节点并不会直接写入数据库页,而是将 redo log 发送到存储节点,存储层根据这些日志来重建数据页。简化后的流程如下:
Client
↓
Aurora Compute Node
↓
Redo Log # 只传输日志,不传输完整数据页
↓
Distributed Storage Nodes
↓
Storage Node 重建数据页
Aurora 的存储层通常由 6 个副本组成,分布在 3 个可用区(AZ):
AZ1 : Storage Node A / Storage Node B
AZ2 : Storage Node C / Storage Node D
AZ3 : Storage Node E / Storage Node F
写入时只需要 4/6 quorum 即可提交事务。这种设计带来了几个优势:
- 写入只需要发送日志,网络传输量更小
- 不需要完整复制数据库页
- 故障恢复速度更快
而 PolarDB 的存储实现方式略有不同。PolarDB 采用的是 共享分布式存储(Shared Storage) 架构,计算节点可以直接访问底层的 PolarStore / PolarFS 分布式文件系统,数据库页仍然以页的形式存储。简化结构如下:
Client
↓
Compute Node (MySQL / PG / Oracle)
↓
PolarFS / PolarStore # 分布式文件系统,页式存储
↓
Distributed Storage Nodes
这种设计更接近传统数据库的存储方式,因此数据页结构保持兼容,对数据库内核改动相对较小。但在写入路径上,网络传输的数据量可能比 Aurora 的日志方式更大。
2) 读节点架构
Aurora 的读节点主要是 Reader Instance,读节点通常只负责读取数据,写操作集中在 Writer Node。PolarDB 则支持一种 Reader Node + 主节点共享存储 的模式,多个节点可以直接访问共享存储,从而实现更灵活的读扩展。
3) 生态与兼容性策略
Aurora 是 AWS 深度改造后的数据库引擎,虽然兼容 MySQL / PostgreSQL,但底层实现已经发生了较大变化。PolarDB 则更加注重 原生数据库兼容性:
- PolarDB MySQL
- PolarDB PostgreSQL
- PolarDB Oracle
因此很多应用迁移到 PolarDB 时,修改成本会更低。
小结
存算分离的本质,是把数据库的计算能力和存储能力拆成两个可以独立扩展的层。PolarDB 通过共享分布式存储换来了秒级扩容、低成本读扩展和更强的高可用能力,代价则是网络延迟和更高的架构复杂度。与 Aurora 相比,两者理念相近,但 PolarDB 走的是共享文件系统路线,更贴近传统数据库的存储形态,兼容性更好;Aurora 则用日志驱动存储换取了更小的写入传输量。理解这两条路线的取舍,对评估云数据库选型很有帮助。
评论 / COMMENTS