Perché vedo un consumo elevato di spazio di archiviazione nel mio database PostgreSQL di origine quando eseguo un'attività CDC in AWS DMS?
Desidero risolvere i problemi relativi al consumo elevato di spazio di archiviazione nel mio database PostgreSQL di origine quando eseguo un'attività di acquisizione dei dati di modifica (CDC) in AWS Database Migration Service (AWS DMS).
Breve descrizione
Quando utilizzi PostgreSQL come origine per un'attività CDC, AWS DMS utilizza gli slot di replica logica di PostgreSQL per ottenere le modifiche dal database di origine. Gli slot conservano i log write-ahead (WAL) richiesti da AWS DMS, anche quando non connetti i WAL all'origine PostgreSQL. AWS DMS rimuove i WAL da PostgreSQL solo dopo aver recuperato le modifiche richieste dallo slot di replica e aver anticipato il restart_lsn dello slot di replica.
Per ulteriori informazioni, consulta Logical decoding concepts (Concetti di decodifica logica) sul sito web PostgreSQL.
I problemi del volume di archiviazione possono verificarsi per i seguenti motivi:
- Interrompi l'attività CDC in AWS DMS per un lungo periodo. Se non connetti AWS DMS al database di origine, non consuma le modifiche dallo slot di replica nell'origine. Quindi PostgreSQL mantiene continuamente i WAL.
- Hai un notevole carico di lavoro che causa un'eccessiva generazione di WAL. Quando utilizzi slot di replica logica, PostgreSQL mantiene i WAL se lo slot di replica richiede i numeri di sequenza di log (LSN).
- Sono presenti slot di replica inattivi. Anche quando uno slot di replica è inattivo, il WAL mantenuto dallo slot di replica contiene ancora informazioni sulla tabella, sullo schema o sul database. Questo riempie lo spazio di archiviazione dell'origine, anche quando le tabelle non hanno transazioni.
Risoluzione
Controlla se gli slot di replica causano un utilizzo elevato dello spazio su disco nell'origine PostgreSQL
Per verificare se gli slot di replica causano un utilizzo elevato dello spazio su disco nel database PostgreSQL, esegui una di queste query:
Per PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Per PostgreSQL v10 e versioni successive:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Esempio di output:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+-------- xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f 7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
Se uno slot di replica ha uno stato attivo impostato su f (false), il database non sta consumando lo slot.
Per eliminare gli slot inutilizzati, esegui questa query:
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
Nota: sostituisci a YOUR_SLOTNAME il nome dello slot.
Per ulteriori informazioni, consulta Perché ho ricevuto l'errore “No space left on device” o “DiskFull” su Amazon RDS per PostgreSQL?
Attiva la funzionalità heartbeat del WAL
Per ridurre il consumo di spazio di archiviazione su un database di origine PostgreSQL, attiva l'attributo di connessione extra (ECA) heartbeatEnable. Questo attributo aiuta a prevenire scenari di archiviazione completi nell'origine PostgreSQL.
Per attivare la funzionalità heartbeat del WAL, aggiungi il seguente ECA all'endpoint dell'origine PostgreSQL:
heartbeatEnable=Y;
Nota: la transazione heartbeat viene eseguita sull'origine solo se è in esecuzione un'attività AWS DMS. Se interrompi le attività AWS DMS, la funzionalità heartbeat del WAL non ha alcun effetto.
Puoi anche specificare i seguenti ECA:
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
L'attributo heartbeatFrequency determina la frequenza in minuti con cui la transazione heartbeat viene eseguita nell'origine PostgreSQL. Sostituisci frequency con la frequenza con cui desideri che la transazione venga eseguita. Ad esempio, se imposti heartbeatFrequency su un valore di 15, AWS DMS esegue la transazione heartbeat ogni 15 minuti nell'origine.
L'attributo heartbeatSchema specifica in quale schema del database AWS DMS crea gli oggetti del database per generare la transazione heartbeat. Sostituisci schemaname con lo schema del tuo database.
Imposta la dimensione massima di uno slot in PostgreSQL
Puoi applicare max_slot_wal_keep_size sul database di origine in PostgreSQL versione 13 e successive. Questo imposta la quantità massima di WAL che gli slot di replica possono mantenere. Per ulteriori informazioni, consulta max_slot_wal_keep_size sul sito web PostgreSQL.
Nota: l'impostazione max_slot_wal_keep_size ti aiuta a evitare problemi di spazio di archiviazione pieno nell’origine PostgreSQL. Tuttavia, può causare l'eliminazione dei WAL da parte del database di origine PostgreSQL prima che l'attività CDC in AWS DMS legga le modifiche dallo slot di replica. Questo può portare all'esito negativo dell'attività.
Informazioni correlate
Types of PostgreSQL replication slots (Tipi di slot di replica PostgreSQL) sul sito web Hevo
- Argomenti
- Migration & Modernization
- Lingua
- Italiano
