Gestione delle sequenze nella replica active-active - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Gestione delle sequenze nella replica active-active

Un'istanza database RDS per PostgreSQL con l'estensione pgactive utilizza due diversi meccanismi di sequenza per generare valori univoci.

Sequenze globali

Per utilizzare una sequenza globale, crea una sequenza locale con l'istruzione CREATE SEQUENCE. Utilizza pgactive.pgactive_snowflake_id_nextval(seqname) invece di usingnextval(seqname) per ottenere il valore univoco successivo della sequenza.

L'esempio seguente crea una sequenza globale:

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

Nelle sequenze suddivise o partizionate, viene utilizzata una normale sequenza PostgreSQL su ciascun nodo. Ogni sequenza incrementa della stessa quantità e inizia con offset diversi. Ad esempio, con il passaggio 100, il nodo 1 genera una sequenza come 101, 201, 301 e così via e il nodo 2 genera una sequenza come 102, 202, 302 e così via. Questo schema funziona bene anche se i nodi non possono comunicare per periodi prolungati, ma richiede che il progettista specifichi un numero massimo di nodi al momento di stabilire lo schema e richiede una configurazione per nodo. Gli errori possono facilmente portare alla sovrapposizione di sequenze.

È relativamente semplice configurare questo approccio con pgactive creando la sequenza desiderata su un nodo nel modo seguente:

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

Quindi richiama setval su ogni nodo per assegnare un valore iniziale di offset diverso nel modo seguente.

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