第四部分:分布式数据库架构实战

第十四章 PostgreSQL 的分布式方案概览

第一节 Citus 扩展简介

目标:了解 PostgreSQL 从单机走向分布式的必要性,并重点介绍目前最主流、最成熟的开源分布式解决方案——Citus 扩展。

当单个 PostgreSQL 实例的计算、内存或存储资源达到瓶颈,无法通过垂直扩展(升级硬件)来满足业务增长需求时,我们就需要转向水平扩展(Scale-out),即通过增加更多的机器来构建一个分布式数据库集群。

在 PostgreSQL 生态中,Citus 是实现水平扩展的领先解决方案。


什么是 Citus?

Citus 是一个开源的 PostgreSQL 扩展,它通过**分片(Sharding)**技术将标准的 PostgreSQL 转变为一个强大的分布式数据库。Citus 于 2022 年被微软收购,并已完全开源,是目前最活跃、社区支持最广泛的 PostgreSQL 分布式方案。

Citus 的核心架构: Citus 集群由两种类型的节点组成:

  1. 协调器节点(Coordinator Node):这是集群的“大脑”和入口。应用程序连接到协调器,并向其发送标准 SQL 查询。协调器负责解析查询,将其分发给合适的工作节点,并汇总结果返回给应用。协调器本身也是一个完整的 PostgreSQL 节点。
  2. 工作节点(Worker Nodes):这些是实际存储数据分片(Shards)并执行计算的 PostgreSQL 节点。一个大表的数据会被打散,分布存储在多个工作节点上。

Citus Architecture 图片来源: Microsoft Azure 官方文档


Citus 的工作原理:透明分片

Citus 的魔力在于其**透明分片(Transparent Sharding)**机制。

  1. 分布式表(Distributed Table): 当你将一个普通表声明为分布式表时,你需要指定一个分布列(Distribution Column)。Citus 会根据这个列的值的哈希,来决定每一行数据应该存储在哪个工作节点的分片上。

  2. 查询路由与并行执行

    • 当一个查询到达协调器时,协调器会分析 WHERE 子句中的分布列。
    • 如果查询只涉及单个分片(例如 WHERE user_id = 123),协调器会直接将查询路由到拥有该分片的那个工作节点上执行,开销极小。
    • 如果查询需要跨越多个分片(例如 GROUP BY 聚合查询),协调器会将查询改写,并并行地发送到所有相关的工作节点上。每个工作节点在自己的数据分片上完成部分计算,然后将结果返回给协调器进行最终的合并。

这种并行执行的能力,使得 Citus 能够利用整个集群的 CPU 和内存资源,极大地加速了大型查询的速度。


Citus 的适用场景

Citus 特别适合以下两类应用场景:

1. 多租户 SaaS 应用 (Multi-Tenant SaaS)

  • 场景描述:每个租户(客户/公司)的数据都相对独立。查询通常只涉及单个租户的数据。
  • Citus 方案:使用 tenant_id 作为分布列。这样,同一个租户的所有数据都会被集中存放在同一个工作节点上。
  • 优势
    • 对单个租户的查询(如 WHERE tenant_id = 'abc')可以被高效地路由到单个工作节点,性能极高。
    • 可以轻松地将大客户迁移到专属的节点上。
    • 随着租户数量增多,可以平滑地增加新的工作节点来扩展集群。

2. 实时分析仪表盘 (Real-Time Analytics Dashboards)

  • 场景描述:需要对海量的事件数据(如用户行为、物联网传感器数据)进行快速的聚合和分析,为前端仪表盘提供数据支持。
  • Citus 方案:使用 user_iddevice_id 作为分布列。
  • 优势
    • 数据写入可以分散到所有工作节点,实现了高吞吐。
    • 大型的聚合查询(如 COUNT, AVG)可以被并行化到所有工作节点上,大大缩短了响应时间。

小结

Citus 通过将 PostgreSQL 从一个强大的单机数据库,转变为一个能够水平扩展的分布式数据库集群,极大地扩展了 PostgreSQL 的应用边界。

  • 它以扩展的形式实现,保留了 PostgreSQL 的原生体验和 SQL 兼容性。
  • 透明分片并行查询机制,为多租户和实时分析等场景提供了理想的解决方案。
  • 作为微软支持的开源项目,它拥有一个活跃的社区和可持续的发展路线图。

在下一节,我们将简要回顾一些其他的分布式方案,以更好地理解 Citus 在历史和技术演进中的地位。