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);