You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Citus-Postgres自定义分片分布逻辑:按region指定Worker节点

在Citus-Postgres中实现自定义分片路由(按region指定Worker节点)

完全可以在Citus内部实现这种自定义路由逻辑,无需在应用层处理。以下是具体实现步骤:

1. 确认Worker节点信息

首先查询所有Worker节点的node_id,后续会用这个ID指定分片放置位置:

SELECT node_id, node_name FROM pg_dist_node;

假设查询结果中,对应ca、us、au、eu的Worker节点ID分别为1、2、3、4。

2. 创建分布式表并指定分布键

先创建user表,再将其转为分布式表,指定region作为分布键:

CREATE TABLE "user" (
    id INT PRIMARY KEY,
    first_name TEXT,
    last_name TEXT,
    region TEXT CHECK (region IN ('ca', 'us', 'au', 'eu'))
);

SELECT create_distributed_table('"user"', 'region');

添加CHECK约束是为了限制region的取值范围,避免出现无法路由的未知值。

3. 替换默认分片为自定义分片

Citus默认会自动创建分片,我们需要先删除这些默认分片,再为每个region单独创建分片并指定到对应Worker节点:

-- 查看当前默认分片
SELECT shardid, shardstate FROM pg_dist_shard WHERE logicalrelid = '"user"'::regclass;

-- 删除所有默认分片
SELECT delete_shard(shardid) FROM pg_dist_shard WHERE logicalrelid = '"user"'::regclass;

-- 为每个region创建分片并指定Worker节点
SELECT create_shard('"user"', 1, ARRAY[1]); -- ca对应node_id=1
SELECT create_shard('"user"', 2, ARRAY[2]); -- us对应node_id=2
SELECT create_shard('"user"', 3, ARRAY[3]); -- au对应node_id=3
SELECT create_shard('"user"', 4, ARRAY[4]); -- eu对应node_id=4

create_shard的第二个参数是自定义的分片ID(需唯一),第三个参数是目标Worker节点的ID数组。

4. 配置分片路由规则

为每个分片绑定对应的region值,确保Citus能将指定region的数据路由到对应分片:

SELECT update_shard_range('"user"', 1, '["ca", "ca"]');
SELECT update_shard_range('"user"', 2, '["us", "us"]');
SELECT update_shard_range('"user"', 3, '["au", "au"]');
SELECT update_shard_range('"user"', 4, '["eu", "eu"]');

这里的区间设置为["值", "值"],表示该分片仅处理等于该值的分布键数据。

注意事项

  • 若后续新增region或Worker节点,需手动重复步骤3和4,添加对应的分片与路由规则。
  • 此方案适用于region取值固定且数量较少的场景,过多分片会增加集群管理复杂度。
  • 插入或查询数据时,Citus会自动根据region值路由到对应Worker节点,应用层无需额外处理。

内容的提问来源于stack exchange,提问作者Gagandeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:03:09