Eu tenho o Citus que executo no docker-compose, peguei o yaml do site oficial e o executei inicialmente em 2 nós
docker-compose -p citus up --scale worker=2 -d
Depois adiciono a tabela
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
);
Eu chamo então um SELECT create_distributed_table('messages', 'shardId');
shardId que é um valor hash das variáveis 'from' e 'to' que variam de 0 a 31, até agora está tudo bem, vejo que cada chat tem seu próprio shard.
Mas então, quando tentei refragmentar meu cluster
set POSTGRES_PASSWORD=pass && docker-compose -p citus up --scale worker=5 -d
e reequilibrar dados por meio de nós
SELECT citus_rebalance_start();
Recebi o erro de que não posso rebalancear a tabela sem um pk, então adicionei um pk(id) e então recebi o erro de que não posso colocar um valor create_distributed_table sendo um pk ou sob restrição exclusiva
SELECT create_distributed_table('messages', 'shardId');
ERRO: não é possível criar restrição em "mensagens" DETALHE: Relações distribuídas não podem ter restrições UNIQUE, EXCLUDE ou PRIMARY KEY que não incluam a coluna de partição (com um operador de igualdade se EXCLUDE).
Então estou em um beco sem saída. O que posso fazer para manipular a chave no método create_distributed_table?
Supondo que você fez algo assim:
demo at db<>fiddle
Sua situação se assemelha à de uma tentativa de particionamento - tem o mesmo requisito
Ele até mesmo formula esse requisito de forma semelhante:
Como parece que você só adicionou
id
para satisfazer os requisitos de rebalanceamento do Citus, você pode simplesmente trocar a chave primária por uma chave primária composta - dê a ela dois campos e certifique-seshardId
de que um deles seja:Agora, tanto o sharding quanto o particionamento funcionam bem. Aqui está mais sobre isso, do Capítulo 5. Definição de Dados: 5.12. Particionamento de Tabelas, 5.12.2.3. Limitações :
Há também uma entrada no FAQ do Citus :
Citus laso menciona o PK composto acima em seu documento sobre gerenciamento de cluster :