citus

Citus 分布式数据库

概览

扩展包名版本分类许可证语言
citus14.1.0OLAPAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2400cituspg_catalog
2401citus_columnarpg_catalog
相关扩展pg_partman plproxy columnar pg_fkpart timescaledb pg_duckdb tablefunc hll
下游依赖documentdb_distributed

conflict with hydra

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY14.1.01817161514citus-
RPMPIGSTY14.1.01817161514citus_$v-
DEBPIGSTY14.1.01817161514postgresql-$v-citus-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PGDG 13.0.0
el8.x86_64.pg14 : citus_14
citus_14-13.0.0-1PGDG.rhel8.x86_64.rpm PGDG · 13.0.0 · 814.2KiB citus_14-12.1.6-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.6 · 813.6KiB citus_14-12.1.5-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.5 · 812.5KiB citus_14-12.1.4-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.4 · 812.5KiB citus_14-12.1.3-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.3 · 812.3KiB citus_14-12.1.2-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.2 · 811.1KiB citus_14-12.1.1-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.1 · 811.0KiB citus_14-12.1.0-2PGDG.rhel8.x86_64.rpm PGDG · 12.1.0 · 810.5KiB citus_14-12.0.0-1PGDG.rhel8.x86_64.rpm PGDG · 12.0.0 · 813.4KiB citus_14-11.3.0-2.rhel8.x86_64.rpm PGDG · 11.3.0 · 796.7KiB citus_14-11.2.1-1.rhel8.x86_64.rpm PGDG · 11.2.1 · 776.9KiB citus_14-11.2.0-1.rhel8.x86_64.rpm PGDG · 11.2.0 · 776.0KiB citus_14-11.1.5-1.rhel8.x86_64.rpm PGDG · 11.1.5 · 765.6KiB citus_14-11.1.4-1.rhel8.x86_64.rpm PGDG · 11.1.4 · 765.3KiB citus_14-11.1.3-1.rhel8.x86_64.rpm PGDG · 11.1.3 · 765.1KiB citus_14-11.1.2-1.rhel8.x86_64.rpm PGDG · 11.1.2 · 764.4KiB citus_14-11.1.1-1.rhel8.x86_64.rpm PGDG · 11.1.1 · 762.6KiB citus_14-11.0.6-1.rhel8.x86_64.rpm PGDG · 11.0.6 · 701.4KiB citus_14-11.0.5-1.rhel8.x86_64.rpm PGDG · 11.0.5 · 700.3KiB citus_14-11.0.4-1.rhel8.x86_64.rpm PGDG · 11.0.4 · 699.6KiB citus_14-11.0.3-1.rhel8.x86_64.rpm PGDG · 11.0.3 · 699.5KiB citus_14-11.0.2-1.rhel8.x86_64.rpm PGDG · 11.0.2 · 698.6KiB citus_14-10.2.5-1.rhel8.x86_64.rpm PGDG · 10.2.5 · 618.5KiB citus_14-10.2.4-1.rhel8.x86_64.rpm PGDG · 10.2.4 · 618.6KiB citus_14-10.2.3-1.rhel8.x86_64.rpm PGDG · 10.2.3 · 618.5KiB citus_14-10.2.2-1.rhel8.x86_64.rpm PGDG · 10.2.2 · 615.3KiB citus_14-10.2.1-1.rhel8.x86_64.rpm PGDG · 10.2.1 · 614.8KiB citus_14-10.2.0-1.rhel8.x86_64.rpm PGDG · 10.2.0 · 614.0KiB
el8.aarch64
el9.x86_64
PGDG 13.0.0
el9.x86_64.pg14 : citus_14
citus_14-13.0.0-1PGDG.rhel9.x86_64.rpm PGDG · 13.0.0 · 803.4KiB citus_14-12.1.6-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.6 · 802.9KiB citus_14-12.1.5-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.5 · 800.4KiB citus_14-12.1.4-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.4 · 800.6KiB citus_14-12.1.3-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.3 · 800.1KiB citus_14-12.1.2-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.2 · 798.9KiB citus_14-12.1.1-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.1 · 798.9KiB citus_14-12.1.0-2PGDG.rhel9.x86_64.rpm PGDG · 12.1.0 · 798.9KiB citus_14-12.0.0-1PGDG.rhel9.x86_64.rpm PGDG · 12.0.0 · 802.0KiB citus_14-11.3.0-2.rhel9.x86_64.rpm PGDG · 11.3.0 · 787.6KiB citus_14-11.2.1-1.rhel9.x86_64.rpm PGDG · 11.2.1 · 767.2KiB citus_14-11.2.0-1.rhel9.x86_64.rpm PGDG · 11.2.0 · 766.5KiB citus_14-11.1.5-1.rhel9.x86_64.rpm PGDG · 11.1.5 · 756.8KiB citus_14-11.1.4-1.rhel9.x86_64.rpm PGDG · 11.1.4 · 755.9KiB citus_14-11.1.3-1.rhel9.x86_64.rpm PGDG · 11.1.3 · 755.8KiB citus_14-11.1.2-1.rhel9.x86_64.rpm PGDG · 11.1.2 · 755.4KiB citus_14-11.1.1-1.rhel9.x86_64.rpm PGDG · 11.1.1 · 754.1KiB citus_14-11.0.6-1.rhel9.x86_64.rpm PGDG · 11.0.6 · 691.3KiB citus_14-11.0.5-1.rhel9.x86_64.rpm PGDG · 11.0.5 · 690.5KiB citus_14-11.0.4-1.rhel9.x86_64.rpm PGDG · 11.0.4 · 690.0KiB citus_14-11.0.3-1.rhel9.x86_64.rpm PGDG · 11.0.3 · 689.8KiB citus_14-11.0.2-1.rhel9.x86_64.rpm PGDG · 11.0.2 · 689.0KiB citus_14-10.2.5-1.rhel9.x86_64.rpm PGDG · 10.2.5 · 612.1KiB citus_14-10.2.4-1.rhel9.x86_64.rpm PGDG · 10.2.4 · 613.7KiB citus_14-10.2.3-1.rhel9.x86_64.rpm PGDG · 10.2.3 · 613.7KiB
el9.aarch64
el10.x86_64PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64
d12.aarch64
d13.x86_64PIGSTY MISS
d13.aarch64
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 13.2.0
PIGSTY MISS
u22.x86_64
u22.aarch64
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 13.2.0
PIGSTY 13.0.0
u24.x86_64
u24.aarch64
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 14.1.0
PIGSTY 13.2.0
PIGSTY 13.0.0
u26.x86_64PIGSTY MISSPIGSTY MISS
u26.aarch64PIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 citus 扩展的 RPM / DEB 包:

pig build pkg citus         # 构建 RPM / DEB 包

安装

您可以直接安装 citus 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install citus;          # 当前活跃 PG 版本安装
pig ext install -y citus -v 18  # PG 18
pig ext install -y citus -v 17  # PG 17
pig ext install -y citus -v 16  # PG 16
dnf install -y citus_18       # PG 18
dnf install -y citus_17       # PG 17
dnf install -y citus_16       # PG 16
apt install -y postgresql-18-citus   # PG 18
apt install -y postgresql-17-citus   # PG 17
apt install -y postgresql-16-citus   # PG 16

预加载配置

shared_preload_libraries = 'citus';

创建扩展

CREATE EXTENSION citus;

用法

来源:

Citus 通过把表分片到多个 worker 节点,把 PostgreSQL 扩展成分布式数据库,同时保留 PostgreSQL SQL、索引、扩展、事务和运维工具作为主要使用界面。它常用于多租户 SaaS、实时分析、时间序列/事件数据和分布式微服务 schema。

Pigsty 本地 catalog 中包名和主扩展名都是 citus;同一个包还包含 citus_columnar。Citus 是 preload 扩展,每个节点都需要先加载库,再创建扩展。

启用 Citus

shared_preload_libraries = 'citus'

在 coordinator 和 worker 上重启 PostgreSQL,然后在数据库中创建扩展:

CREATE EXTENSION IF NOT EXISTS citus;
SELECT citus_version();

多节点集群中,在 coordinator 上注册 coordinator 与 worker:

SELECT citus_set_coordinator_host('coord-1', 5432);
SELECT * FROM citus_add_node('worker-1', 5432);
SELECT * FROM citus_add_node('worker-2', 5432);

SELECT * FROM citus_get_active_worker_nodes();

分布式表

分布式表通过分片键分布。相同分片键值的行会协同定位到同一个 shard,因此租户内 join 和点查可以保持本地执行。

CREATE TABLE events (
  tenant_id  bigint,
  event_id   bigserial,
  event_at   timestamptz DEFAULT now(),
  kind       text,
  payload    jsonb,
  PRIMARY KEY (tenant_id, event_id)
);

SELECT create_distributed_table('events', 'tenant_id');

也可以显式设置 shard 数量和 colocation:

SELECT create_distributed_table(
  'events',
  'tenant_id',
  shard_count  := 64,
  colocate_with := 'default'
);

带分布列过滤的查询可以路由到单个 shard:

SELECT *
FROM events
WHERE tenant_id = 42
ORDER BY event_at DESC
LIMIT 50;

跨 shard 查询会被规划为分布式任务,在 worker 上并行执行:

SELECT kind, count(*)
FROM events
WHERE event_at >= now() - interval '1 hour'
GROUP BY kind
ORDER BY count DESC;

引用表

引用表会完整复制到所有 worker,适合需要和多个分布式表 join 的小型维表。

CREATE TABLE countries (
  code text PRIMARY KEY,
  name text NOT NULL
);

SELECT create_reference_table('countries');

基于 Schema 的分片

当每个租户或服务拥有独立 schema 时,可以使用 schema-based sharding。Citus v14.1.0 增加了从任意节点执行多类 schema 分片 DDL 的支持,包括 CREATE SCHEMADROP SCHEMAALTER SCHEMA RENAMEALTER SCHEMA OWNER,以及分布式 schema 内的表级 DDL。

CREATE SCHEMA tenant_42;
SELECT citus_schema_distribute('tenant_42');

CREATE TABLE tenant_42.orders (
  id bigserial PRIMARY KEY,
  amount numeric,
  created_at timestamptz DEFAULT now()
);

共享表通常使用行分布模型;每租户 schema 布局可以使用 schema 分片。不要在没有检查 colocation 和 SQL 支持限制的情况下随意混用两种模型。

节点与 Shard 运维

-- 添加或禁用节点。
SELECT * FROM citus_add_node('worker-3', 5432);
SELECT * FROM citus_disable_node('worker-2', 5432);
SELECT * FROM citus_activate_node('worker-2', 5432);

-- 排空并移除节点。
SELECT * FROM citus_drain_node('worker-1', 5432);
SELECT * FROM citus_remove_node('worker-1', 5432);

-- 重平衡 shard。
SELECT citus_rebalance_start();
SELECT * FROM citus_rebalance_status();
SELECT rebalance_table_shards('events');

-- 查看表和 shard。
SELECT * FROM citus_tables;
SELECT * FROM citus_shards;

备份协调

Citus v14.1.0 增加了用于临时阻塞分布式 2PC 提交决策以及 schema/topology 变更的 UDF,方便在协调磁盘快照时获得一致性窗口。它们只应该出现在受控备份流程里,快照步骤结束后必须解除阻塞。

SELECT citus_cluster_changes_block();
SELECT * FROM citus_cluster_changes_block_status();

-- 此处执行协调后的文件系统或卷快照。

SELECT citus_cluster_changes_unblock();

这些函数仍然需要配合常规 PostgreSQL 备份纪律:一致 checkpoint、WAL 归档、跨节点快照顺序,以及经过验证的恢复流程。

注意事项

  • Pigsty 本地元数据当前跟踪 PostgreSQL 16-18 上的 Citus 14.x;Citus 14 已移除 PostgreSQL 15 支持。
  • 创建扩展前必须设置 shared_preload_libraries = 'citus'。新实例上单纯执行 CREATE EXTENSION citus 不够。
  • 分布列选择很关键。分布式表上的主键和唯一约束通常需要包含分布列。
  • 跨 shard join、repartition join、分布式 DDL 和多 shard 写入虽然强大,但规划、锁和失败语义都不同于单机 PostgreSQL。
  • Citus 通过 citus_columnar 提供自己的列式存储界面;Pigsty 元数据中它与 Hydra columnar 冲突。
  • cluster-change blocking 函数是备份运维工具。备份脚本失败后不要让集群长期保持阻塞状态。

最后修改 2026-07-02: extension update 2026-07-02 (d4da20c)