云原生数据库的存算分离架构如何实现
云原生数据库的存算分离架构本质上是将传统单体数据库拆解为可独立伸缩、故障隔离的微服务化组件,并通过云原生的标准接口(如对象存储、块存储服务)进行高效协作。这种架构是数据库充分释放Kubernetes和云基础设施潜力的关键设计。
🏗️ 架构核心:三层解耦与K8s实现
下图清晰地展示了存算分离架构在云原生环境下的核心组成与数据流:
flowchart LR
subgraph C [计算层<br>(无状态, 弹性)]
C1[计算实例 Pod<br>(执行引擎/查询层)]
C2[计算实例 Pod]
C3[计算实例 Pod]
end
subgraph S [存储层<br>(有状态, 持久)]
direction TB
S1[(分布式存储集群<br>或云存储服务)]
end
subgraph M [元数据与协调层<br>(轻状态, 高可用)]
M1[元数据服务 Pod]
M2[元数据服务 Pod]
M3[元数据服务 Pod]
end
C -- “读写数据块” --> S
C -- “获取数据位置<br>与事务版本” --> M
M -- “管理数据分布<br>与状态” --> S
这个架构在Kubernetes上的具体实现,依赖于对三种工作负载的精准定义:
1. 计算层:无状态服务化
- 形态:通常由
Deployment管理的一组Pod。每个Pod内运行数据库的查询引擎、SQL解析器、优化器、事务锁管理等。 - 特性:完全无状态,任何Pod都能处理任何请求。其本地缓存(如热数据页)在Pod重启后失效并重建。
- K8s实现:通过
Service(如ClusterIP或LoadBalancer)对外提供统一入口,流量可被均匀分发到所有健康的计算Pod。HPA可基于CPU或QPS等指标,自动对Deployment进行副本数伸缩,实现秒级弹性。
2. 存储层:共享与持久化
- 形态:这是架构的核心。有多种实现模式:
- 分布式块存储集群:如TiKV、Ceph RBD。通常由
StatefulSet管理,每个Pod提供一块分布式存储,共同构成一个全局共享的、强一致的数据块存储池。 - 云原生对象/文件存储:直接对接AWS S3、Google Cloud Storage或S3兼容的对象存储。计算层通过HTTP协议(如S3 API)访问。
- 分布式块存储集群:如TiKV、Ceph RBD。通常由
- 特性:数据强一致、高持久、容量近乎无限扩展。存储层本身不负责SQL处理,只提供简单的块或键值对读写接口。
- K8s实现:使用
StorageClass和PersistentVolume抽象底层存储。对于分布式块存储,通常有专属的CSI驱动实现高效挂载和扩容。
3. 元数据层:大脑与协调器
- 形态:一个轻量级但强一致、高可用的分布式服务,如PD、etcd等。由
StatefulSet管理。 - 职责:管理数据分布(哪些数据块在哪个存储节点)、全局时间戳分配(用于MVCC)、锁协调、集群拓扑感知等。它是计算层访问存储层的“导航图”。
- K8s实现:需要稳定的网络标识(Headless Service)和持久化存储,是
StatefulSet的典型应用场景。
⚡ 数据读写路径示例
以一次简单的查询为例:
- 客户端请求到达计算层Pod。
- 该Pod向元数据层查询所需数据的位置和最新版本。
- 计算层Pod根据元数据,直接通过网络向一个或多个存储层节点发起数据块读取请求(通常使用gRPC等高效协议)。
- 存储层节点将数据块返回,计算层在内存中完成连接、过滤等计算,将结果返回客户端。
🎯 核心优势与挑战
优势:
- 独立极致弹性:计算层可快速应对流量尖峰,存储层可平稳应对数据增长。
- 资源利用率与成本优化:计算和存储可按需独立计费和伸缩,避免“为存储付费但计算闲置”或反之。
- 高可用与故障隔离:计算节点故障无数据丢失风险,秒级重建;存储层节点故障由副本机制保障,影响范围可控。
- 统一存储底座:数据可被多个计算引擎(如同时服务于OLTP和OLAP)共享,避免冗余。
挑战与应对:
- 网络延迟与带宽:网络成为关键路径。解决方案包括:1) 计算与存储同可用区部署;2) 使用RDMA等高速网络;3) 计算层设计智能缓存(如缓存热数据页)。
- 事务一致性:在分布式环境下更复杂。依赖于元数据层提供的全局授时(TrueTime-like API或分布式TSO)和存储层的多版本控制来实现跨节点的一致性快照。
- 存储层性能:对象存储的延迟较高。因此,对延迟敏感的OLTP数据库通常会选择分布式块存储集群作为存储层,而非直接使用S3。
🔍 典型产品实现
-
TiDB:是此架构的典范。
- 计算层:TiDB Server(
Deployment),无状态。 - 存储层:TiKV(
StatefulSet),分布式键值存储,数据按Region分片。 - 元数据层:PD(
StatefulSet),管理Region调度和授时。
- 计算层:TiDB Server(
-
AWS Aurora:将存算分离推向主流的商业数据库。
- 计算层:数据库实例(兼容MySQL/PostgreSQL)。
- 存储层:多副本、跨AZ的分布式存储卷,计算层仅向存储层写入日志,极大减少了网络IO,是其高性能关键。
-
CockroachDB/YugabyteDB:计算层与存储层在物理上共存于每个节点(
StatefulSet),但在逻辑上分离,支持每个Pod独立扩缩容。
总结来说,存算分离不是简单地将数据库拆成两部分,而是通过云原生的设计思想,重构为一个松耦合、可独立演进的微服务系统。它让数据库真正拥抱了云的弹性,其实现深度依赖于Kubernetes对无状态、有状态工作负载的精细化管理和云基础设施提供的高质量网络与存储服务。
浙公网安备 33010602011771号