Citus 与分布式 Postgres
使用 Citus 将 Postgres 转变为分布式数据库,并了解共置表和引用表
Citus 与分布式 Postgres 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是 Citus
Citus 是 PostgreSQL 的扩展,可将 PostgreSQL 服务器集群转换为分布式数据库。您可以对协调节点执行 SELECT/INSERT;Citus 会透明地将请求路由到正确的工作节点分片。
架构
有两个角色:
- 协调节点——接收查询,保存集群的元数据,并负责路由和聚合
- 工作节点——保存分片数据,执行实际查询
设置
在协调节点和工作节点上安装扩展,然后注册工作节点:
CREATE EXTENSION citus;
-- On the coordinator, add worker nodes:
SELECT * FROM master_add_node('worker1', 5432);
SELECT * FROM master_add_node('worker2', 5432);分布式表
按某一列将表标记为分布式表:
CREATE TABLE orders (
id BIGSERIAL,
user_id BIGINT NOT NULL,
total NUMERIC(10,2),
...
);
SELECT create_distributed_table('orders', 'user_id');
-- Citus splits orders into shards by hash(user_id).引用表
复制到每个工作节点的小型表——JOIN 可以保持在本地:
CREATE TABLE countries (id INT, name TEXT);
SELECT create_reference_table('countries');
-- Every worker has a full copy of countries.共置
使用相同分布列的表会共置:给定 user_id 的行始终位于同一个工作节点上。在 user_id 上执行的 JOIN 可以保持在本地:
SELECT create_distributed_table('orders', 'user_id');
SELECT create_distributed_table('events', 'user_id', colocate_with => 'orders');单租户查询
Citus 会将按 user_id 过滤的查询路由到正确的工作节点——速度很快:
SELECT * FROM orders WHERE user_id = 42;
-- Goes to one worker shard, returns in milliseconds.分布式聚合
Citus 会在各个工作节点上并行执行 COUNT/SUM:
SELECT user_id, SUM(total) FROM orders GROUP BY user_id;
-- Each worker computes locally; coordinator concatenates.重新平衡
添加一个工作节点,然后重新平衡分片:
SELECT * FROM citus_add_node('worker3', 5432);
SELECT * FROM rebalance_table_shards('orders');
-- Citus moves some shards onto the new worker.限制
- 跨非共置表的事务受到限制
- 某些 PostgreSQL 功能不适用于分布式表
- 架构变更会传播,但需要协调
Citus Cloud / Azure
Citus 已被 Microsoft 收购——现在属于 Azure Database for PostgreSQL — Hyperscale (Citus) 的一部分。同时它仍然是开源项目。
替代方案
- YugabyteDB——与 PG 兼容的分布式数据库
- CockroachDB——与 PostgreSQL 协议兼容的分布式数据库
- Pgvector / TimescaleDB——单节点专用方案
Citus 的适用场景
多租户 SaaS,其中每个租户的查询彼此隔离。按租户和时间进行分区的时间序列数据。使用并行聚合的分析任务。
总结
Citus 让 PostgreSQL 实现分布式。
- 协调节点 + 工作节点
- 按列进行分布;通过共置实现本地 JOIN
- 使用引用表保存共享维度
- 最适合的场景:多租户 SaaS
快速检查
在 Citus 中,将两个分布式表按同一个键进行“共置”有什么好处?
常见问题解答
「Citus 与分布式 Postgres」课时是免费的吗?
是的 — 「Citus 与分布式 Postgres」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「Citus 与分布式 Postgres」这节课中我会学到什么?
使用 Citus 将 Postgres 转变为分布式数据库,并了解共置表和引用表 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Citus 与分布式 Postgres」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 分片策略:范围、哈希与目录
- 跨分片查询:棘手的问题
- Citus 与分布式 Postgres
- 何时不应分片