Gestión de secuencias en la replicación activa-activa - Amazon Relational Database Service

Gestión de secuencias en la replicación activa-activa

Una instancia de base de datos de RDS para PostgreSQL con la extensión pgactive utiliza dos mecanismos de secuencia diferentes para generar valores únicos.

Secuencias globales

Para usar una secuencia global, cree una secuencia local con la instrucción CREATE SEQUENCE. Utilice pgactive.pgactive_snowflake_id_nextval(seqname) en lugar de usingnextval(seqname) para obtener el siguiente valor único de la secuencia.

En el siguiente ejemplo se crea una secuencia 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');
Secuencias particionadas

En las secuencias divididas o particionadas, se utiliza una secuencia PostgreSQL normal en cada nodo. Cada secuencia se incrementa en la misma cantidad y comienza con diferentes desplazamientos. Por ejemplo, con el paso 100, el nodo 1 genera una secuencia como 101, 201, 301, etc., y el nodo 2 genera una secuencia como 102, 202, 302, etc. Este esquema funciona bien incluso si los nodos no pueden comunicarse durante períodos prolongados, pero requiere que el diseñador especifique un número máximo de nodos al establecer el esquema y requiere una configuración por nodo. Los errores pueden provocar fácilmente la superposición de secuencias.

Es relativamente sencillo configurar este enfoque con pgactive creando la secuencia deseada en un nodo de la siguiente manera:

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

A continuación, llame a setval en cada nodo para dar un valor inicial de desplazamiento diferente, de la siguiente manera.

app=> -- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);