Lidar com sequências na replicação ativa-ativa
Uma instância de banco de dados do RDS para PostgreSQL com a extensão pgactive
usa dois mecanismos de sequência diferentes para gerar valores exclusivos.
Sequências globais
Para usar uma sequência global, crie uma sequência local com a instrução CREATE SEQUENCE
. Use pgactive.pgactive_snowflake_id_nextval(seqname)
em vez de usingnextval(seqname)
para obter o próximo valor exclusivo da sequência.
O exemplo a seguir cria uma rede global.
app=>
CREATE TABLE gstest ( id bigint primary key, parrot text );
app=>
CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
app=>
ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
Sequências particionadas
Em sequências divididas ou particionadas, uma sequência normal do PostgreSQL é usada em cada nó. Cada sequência é incrementada na mesma quantidade e começa com diferentes deslocamentos. Por exemplo, com a etapa 100, o nó 1 gera a sequência como 101, 201, 301 e assim por diante, e o nó 2 gera a sequência como 102, 202, 302 e assim por diante. Esse esquema funciona bem mesmo que os nós não possam se comunicar por longos períodos, mas exige que o designer especifique um número máximo de nós ao estabelecer o esquema e requer configuração por nó. Erros podem facilmente levar à sobreposição de sequências.
É relativamente simples configurar essa abordagem com pgactive
criando a sequência desejada em um nó da seguinte maneira:
CREATE TABLE some_table (generated_value bigint primary key);
app=>
CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
app=>
ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');
Em seguida, chame setval
em cada nó para fornecer um valor inicial de deslocamento diferente da forma a seguir.
app=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);