我有从 docker-compose 运行的 Citus,我从官方网站获取了 yaml,并最初从 2 个节点运行它
docker-compose -p citus up --scale worker=2 -d
之后我添加表格
CREATE TABLE IF NOT EXISTS messages (
text TEXT NOT NULL,
"from" CHARACTER VARYING NOT NULL,
"to" CHARACTER VARYING NOT NULL,
"shardId" CHARACTER VARYING NOT NULL
);
然后我调用SELECT create_distributed_table('messages', 'shardId');
shardId 来获取“from”和“to”变量的哈希值,范围从 0 到 31,到目前为止一切正常,我看到每个聊天都有自己的分片。
但当我尝试重新分片我的集群时
set POSTGRES_PASSWORD=pass && docker-compose -p citus up --scale worker=5 -d
并通过节点重新平衡数据
SELECT citus_rebalance_start();
我收到错误,说我无法在没有 pk 的情况下重新平衡表,因此我添加了一个 pk(id),然后我收到错误,说我无法将 create_distributed_table 的值设置为 pk 或在唯一约束下
SELECT create_distributed_table('messages', 'shardId');
错误:无法对“消息”创建约束详细信息:分布式关系不能具有不包含分区列的 UNIQUE、EXCLUDE 或 PRIMARY KEY 约束(如果是 EXCLUDE,则使用相等运算符)。
所以我走进了死胡同,我该怎么做才能操纵 create_distributed_table 方法中的密钥?
假设你做了这样的事情:
demo at db<>fiddle
你的情况类似于分区尝试 - 它有同样的要求
它甚至对这一要求进行了类似的表述:
因为看起来您只添加了
id
满足 citus 重新平衡要求的内容,所以您可以将其上的主键换成复合主键- 给它两个字段并确保shardId
其中之一:现在分片和分区都可以正常工作了。有关这方面的更多信息,请参阅第 5 章。数据定义:5.12。表分区,5.12.2.3。限制:
Citus 的常见问题解答中也有条目:
Citus laso 在其有关集群管理的文档中提到了上述复合 PK :