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?