PolarDB 存算分离
背景
随着互联网业务规模不断扩大,传统关系型数据库架构逐渐暴露出一些瓶颈,例如扩展能力不足、存储成本高、读写压力集中等问题。为了应对这些挑战,云厂商开始设计一种新的数据库架构模式:存算分离(Storage-Compute Decoupling)。
PolarDB 是阿里云推出的一款云原生数据库,其核心设计理念之一就是 计算层与存储层解耦。这种架构使数据库具备更强的弹性扩展能力和更高的资源利用率。 ()
本文将从架构角度分析 PolarDB 的存算分离设计,并与 AWS Aurora 以及传统 MySQL 架构进行对比。
传统 MySQL 架构的问题
在传统 MySQL 架构中,数据库通常运行在单个服务器上:
MySQL Server
├── CPU
├── Memory
└── Local Disk
计算和存储都在同一台机器上。
这种架构在早期互联网时代已经足够,但随着业务规模扩大,会出现几个明显问题:
1 存储扩展困难
数据库数据通常存储在本地磁盘中,当数据量增长时,只能通过:
- 升级磁盘
- 更换更大的机器
这种方式扩展能力有限。
2 读扩展成本高
MySQL 常见的扩展方式是 主从复制:
Master
├── Slave1
├── Slave2
└── Slave3
每个只读节点都需要一份完整的数据副本。
随着读节点增加:
- 存储成本会快速增长
- 数据同步压力增加
3 高可用复杂
如果主节点故障:
- 需要手动或自动进行主从切换
- 可能存在复制延迟
- 数据一致性需要额外处理
PolarDB 的存算分离架构
PolarDB 的核心设计是:
计算节点与存储节点完全解耦。
架构大致如下:
+--------------------+
| Compute Node |
| (MySQL / PG / ORA) |
+---------+----------+
|
+---------+----------+
| Distributed Storage|
| (PolarStore) |
+--------------------+
计算节点负责:
- SQL解析
- 查询执行
- 事务处理
存储层负责:
- 数据存储
- 日志管理
- 副本复制
所有计算节点共享同一份分布式存储。
这种架构被称为:
Shared Storage Architecture
存算分离解决了什么问题
这种设计主要解决了传统数据库的几个核心问题。
1 弹性扩展能力
在传统数据库中:
增加计算能力必须升级服务器。
而在 PolarDB 中:
可以直接增加计算节点:
Storage Layer
↑
│
Compute1
Compute2
Compute3
所有节点共享同一份数据。
因此可以实现:
- 读扩展
- 分布式计算
- 秒级扩容
2 存储成本降低
传统 MySQL 读节点需要完整数据副本。
PolarDB 的存算分离架构下:
多个计算节点共享同一存储系统。
因此:
- 不需要复制完整数据
- 存储成本显著降低
3 高可用能力更强
PolarDB 的存储层通常使用分布式副本机制,例如:
Storage Node
├── Replica1
├── Replica2
└── Replica3
当某个节点故障时:系统可以极快的进行恢复。
这种设计可以实现:
- 自动故障恢复
- 高可用架构
- 数据持久化保障
4 极致性能
PolarDB 存储层通常采用:
- 分布式日志结构
- 并行 I/O
- SSD 云存储
这种方式可以大幅提升数据库性能。主要瓶颈从存储层变化为了内部网络IO层。
polarDB 的劣势
虽然存算分离架构有很多优势,但也存在一些挑战。
1 网络延迟
计算层与存储层分离意味着:
数据访问需要通过网络。
相比本地磁盘:
会增加一定延迟。
2 架构复杂度高
存算分离架构需要设计:
- 分布式存储系统
- 网络协议
- 数据一致性机制
实现难度远高于传统数据库。
3 对云基础设施依赖强
这种架构高度依赖:
- 高性能网络
- 分布式存储
- 云平台调度能力
因此通常只适用于云环境。
PolarDB vs AWS Aurora
PolarDB 和 Aurora 的整体设计理念非常接近,二者都是典型的 云原生数据库架构,都采用了 存算分离(Compute + Storage Decoupling) 的设计。
Aurora 也是一种 存算分离数据库。
Aurora 将计算节点与一个分布式存储集群分离,多个计算节点共享同一存储系统。
架构示意:
Writer Node
|
+-------+-------+
| |
Reader1 Reader2
| |
+-----------------------+
| Distributed Storage |
+-----------------------+
Aurora 的分布式存储通常跨多个可用区部署,以提升可用性。
但在具体实现上,两者仍然存在一些重要差异。
首先是 存储架构设计差异。
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 的日志方式更大。
第二个差异是 读节点架构。
Aurora 的读节点主要是 Reader Instance,读节点通常只负责读取数据,而写操作集中在 Writer Node。
PolarDB 则支持一种叫做 Reader Node + 主节点共享存储 的模式,多个节点可以直接访问共享存储,从而实现更灵活的读扩展。
第三个差异是 生态与兼容性策略。
Aurora 是 AWS 深度改造后的数据库引擎,虽然兼容 MySQL / PostgreSQL,但底层实现已经发生了较大变化。
PolarDB 则更加注重 原生数据库兼容性:
- PolarDB MySQL
- PolarDB PostgreSQL
- PolarDB Oracle
因此很多应用迁移到 PolarDB 时,修改成本会更低。