Padroneggiare la Replicazione PostgreSQL: Tipi e Configurazione Spiegati

Padroneggia la replicazione PostgreSQL con questa guida completa. Scopri la replicazione in streaming (fisica) e logica, i loro casi d'uso e come configurarli. Garantisci alta disponibilità, recupero d'emergenza e scalabilità in lettura per il tuo database relazionale open-source avanzato.

40 visualizzazioni

Padroneggiare la Replica PostgreSQL: Tipi e Configurazione Spiegati

Nel mondo dei database relazionali open-source avanzati, PostgreSQL si distingue per la sua robustezza, estensibilità e potenti funzionalità. Tra queste, la ridondanza dei dati e l'alta disponibilità sono fondamentali per le applicazioni mission-critical. La replica PostgreSQL è il meccanismo che consente di raggiungere questi obiettivi copiando i dati da un server PostgreSQL (il primary) a uno o più altri server PostgreSQL (le repliche o standby).

Questo articolo approfondirà i concetti fondamentali della replica PostgreSQL, esplorando i diversi tipi disponibili e fornendo indicazioni pratiche su come configurarli. Comprendere questi meccanismi è cruciale per garantire che i dati siano sempre accessibili, protetti da guasti hardware e in grado di gestire carichi di lettura aumentati. Tratteremo sia la replica in streaming (streaming replication) che la replica logica (logical replication), spiegando i loro casi d'uso, vantaggi e fasi di configurazione.

Perché la Replica PostgreSQL è Importante

Prima di addentrarci nel 'come', è essenziale capire il 'perché'. La perdita di dati o tempi di inattività prolungati possono avere gravi conseguenze per le aziende. La replica affronta queste preoccupazioni tramite:

  • Alta Disponibilità (HA): Se il server primary fallisce, una replica può essere rapidamente promossa a diventare il nuovo primary, minimizzando i tempi di inattività.
  • Ripristino di Emergenza (DR): Le repliche possono essere localizzate in diverse aree geografiche, proteggendo i dati da disastri specifici del sito.
  • Scalabilità di Lettura: Spostare i carichi di lavoro pesanti in lettura sulle repliche può migliorare le prestazioni del server primary, che rimane dedicato alle operazioni di scrittura.
  • Protezione dei Dati: La replica agisce come un backup continuo, offrendo una copia dei dati più aggiornata rispetto ai tradizionali backup periodici.

PostgreSQL offre due metodi principali per la replica: Streaming Replication e Logical Replication. Sebbene entrambi raggiungano la sincronizzazione dei dati, operano su principi diversi e sono adatti a scenari differenti.

Streaming Replication (Replica Fisica)

La replica in streaming è la forma di replica più comune e fondamentale in PostgreSQL. Funziona inviando i record del Write-Ahead Log (WAL) dal server primary a una o più repliche. Questi record WAL rappresentano ogni modifica apportata al database. Le repliche applicano quindi questi record WAL ai propri file di dati, garantendo che rimangano coerenti con il primary.

Tipi di Streaming Replication:

  1. Replica Sincrona (Synchronous Replication): In modalità sincrona, il server primary attende la conferma da almeno una (o un numero specificato) delle repliche che i record WAL sono stati ricevuti e scritti nel loro buffer WAL prima di riconoscere il commit della transazione al client. Ciò garantisce che le transazioni committate esistano su almeno una replica, fornendo il massimo livello di coerenza dei dati.

    • Pro: Garantisce l'assenza di perdita di dati per le transazioni committate sulla replica sincrona.
    • Contro: Può introdurre latenza ai commit delle transazioni, poiché il primary deve attendere la conferma della replica.
  2. Replica Asincrona (Asynchronous Replication): In modalità asincrona, il server primary invia i record WAL alle repliche ma non attende la conferma prima di committare la transazione. Il primary riconosce il commit al client immediatamente dopo aver scritto il WAL in locale. Ciò offre una latenza inferiore ma comporta un rischio di perdita di dati se il primary fallisce prima che i record WAL siano stati inviati e applicati alla replica.

    • Pro: Impatto minimo sulla latenza del commit della transazione.
    • Contro: Potenziale perdita di dati se il primary fallisce e i record WAL non hanno ancora raggiunto la replica.

Configurazione della Streaming Replication (Esempio Asincrono)

La configurazione della replica in streaming comporta la configurazione sia del server primary che del server replica. Ecco una guida semplificata:

1. Configurazione del Server Primary (postgresql.conf e pg_hba.conf)

Sul server primary, è necessario abilitare l'archiviazione WAL e le connessioni di replica.

  • Modifiche a postgresql.conf:

    ```ini
    wal_level = replica # o logical per la replica logica
    max_wal_senders = 5 # Numero di connessioni di replica concorrenti
    wal_keep_size = 512MB # Oppure wal_keep_segments per versioni precedenti

    Per la replica sincrona, aggiungere:

    synchronous_standby_names = 'replica1,replica2'

    Oppure per nome/priorità del server specifici:

    synchronous_standby_names = '1 (replica1), 2 (replica2)'

    archive_mode = on
    archive_command = 'cp %p /path/to/wal_archive/%f'
    `` *wal_level: Deve essere almenoreplicaper la replica in streaming. *max_wal_senders: Specifica quanti server standby possono connettersi simultaneamente. *wal_keep_size: Impedisce l'eliminazione dei file WAL prima che le repliche possano recuperarli (un'alternativa più semplice aarchive_commandper configurazioni di base, ma l'archiviazione è raccomandata per la robustezza). *archive_mode&archive_command`: Cruciali per il ripristino point-in-time (PITR) ed essenziali se una replica è troppo in ritardo o deve essere ricostruita.

  • Modifiche a pg_hba.conf:

    Consenti alla replica di connettersi per la replica. Sostituisci replica_ip_address con l'IP effettivo della tua replica.

    ```ini

    TYPE DATABASE USER ADDRESS METHOD

    host replication replication_user replica_ip_address/32 md5
    ```

    Dovrai anche creare un utente di replica:

    sql -- Sul server primary: CREATE ROLE replication_user WITH REPLICATION LOGIN PASSWORD 'your_password';

    Dopo aver modificato questi file, ricarica la configurazione di PostgreSQL:

    ```bash
    pg_ctl reload

    Oppure riavvia PostgreSQL se necessario

    ```

2. Preparazione del Server Replica

Prima di avviare la replica, questa deve disporre di una directory di dati che sia una copia della directory di dati del primary in un momento specifico. Il modo più semplice è utilizzare pg_basebackup.

  • Interrompi PostgreSQL sulla replica (se in esecuzione).

  • Esegui un backup di base:

    ```bash

    Assicurati che PGDATA sia vuoto o rimosso prima

    pg_basebackup -h primary_host_ip -p 5432 -U replication_user -D /var/lib/postgresql/data/ -Fp -Xs -P
    `` *-h,-p,-U: Specifica i dettagli di connessione del server primary. *-D: La directory dei dati per la replica. *-Fp: Il formato è plain (semplice). *-Xs: Utilizza lo streaming TSL/WAL. Equivalente all'impostazione di streaming WAL inprimary_conninfo. *-P: Mostra i progressi. * Ti verrà richiesta la password direplication_user`.

3. Configurazione del Server Replica (postgresql.conf e recovery.conf o postgresql.conf per PG12+)

  • Modifiche a postgresql.conf (per PG12+):

    ```ini
    hot_standby = on # Consente query di sola lettura sulla replica
    primary_conninfo = 'host=primary_host_ip port=5432 user=replication_user password=your_password'

    Per la replica sincrona, aggiungere:

    primary_promote_delay = 10 # secondi

    Oppure usa un meccanismo di file trigger

    `` *hot_standby: Abilita le query di sola lettura sullo standby. *primary_conninfo`: Stringa di connessione al server primary.

  • recovery.conf (per versioni di PostgreSQL precedenti alla 12):

    Crea un file recovery.conf nella directory dei dati della replica con il seguente contenuto:

    ```ini
    standby_mode = 'on'
    primary_conninfo = 'host=primary_host_ip port=5432 user=replication_user password=your_password'

    Se si utilizza il ripristino da archivio invece dello streaming, si dovrebbe specificare restore_command

    restore_command = 'cp /path/to/wal_archive/%f %p'

    recovery_target_timeline = 'latest'

    ```

    Per PG12+, primary_conninfo e hot_standby sono impostati direttamente in postgresql.conf.

4. Avvio del Server Replica

Avvia il servizio PostgreSQL sulla replica. Si connetterà al primary, riceverà i record WAL e inizierà a sincronizzarsi. Puoi controllare i log per la conferma.

Suggerimento: Per un'HA robusta, considera l'utilizzo di strumenti come Patroni o repmgr, che automatizzano il failover e la gestione.

Logical Replication (Replica Logica)

La replica logica è una forma di replica più flessibile e granulare introdotta in PostgreSQL 10. Invece di replicare interi blocchi di dati o record WAL, replica le modifiche ai dati in base al loro significato logico (ad esempio, istruzioni INSERT, UPDATE, DELETE) a livello di riga. Ciò si ottiene decodificando i record WAL in un flusso di modifiche logiche.

Caratteristiche Chiave e Casi d'Uso:

  • Replica Selettiva: Puoi scegliere quali tabelle o persino quali colonne replicare. Questo è molto utile per spostare selettivamente i dati tra database.
  • Replica Cross-Version: La replica logica può replicare i dati tra diverse versioni principali di PostgreSQL.
  • Modifiche Selettive dello Schema: È possibile replicare le modifiche per database o schemi specifici e persino pubblicare solo determinate tabelle.
  • Trasformazione dei Dati: Sebbene non sia integrata, la replica logica fornisce una base per processi ETL (Extract, Transform, Load) più complessi.
  • Replica da un Primary a una Replica che non è un clone completo: Il database di destinazione non deve essere una copia fisica completa della sorgente.

Come Funziona:

  1. Publisher (Editore): Il database sorgente (primary) in cui avvengono le modifiche ai dati. Richiede wal_level = logical. Le modifiche vengono decodificate dal WAL in un flusso logico.
  2. Publication (Pubblicazione): Un insieme nominato di tabelle sul publisher le cui modifiche verranno replicate.
  3. Subscriber (Sottoscrittore): Il database di destinazione (replica) che riceve le modifiche.
  4. Subscription (Sottoscrizione): Una connessione sul subscriber che si connette al publisher e applica le modifiche da una specifica publication.

Configurazione della Replica Logica

1. Configurazione del Publisher (Server Primary)

  • Modifiche a postgresql.conf:

    ini wal_level = logical max_replication_slots = 10 # Per slot di replica logica max_wal_senders = 10 # Dovrebbe essere almeno max_replication_slots

  • Crea una Publication (Pubblicazione):

    ```sql
    -- Sul database publisher:
    CREATE PUBLICATION my_publication FOR TABLE
    table1,
    table2
    WITH (publish = 'insert,update,delete');

    -- Oppure per tutte le tabelle:
    -- CREATE PUBLICATION all_tables_pub FOR ALL TABLES;
    ```

    Ricarica la configurazione sul publisher.

2. Configurazione del Subscriber (Server Replica)

  • Assicurati che le tabelle di destinazione esistano: Il database subscriber deve avere le tabelle di destinazione con lo stesso schema del publisher. Puoi crearle manualmente o utilizzare pg_dump per estrarre lo schema.

  • Crea una Subscription (Sottoscrizione):

    sql -- Sul database subscriber: CREATE SUBSCRIPTION my_subscription CONNECTION 'host=publisher_host_ip port=5432 user=replication_user password=your_password dbname=publisher_db' PUBLICATION my_publication;

    L'replication_user necessita delle autorizzazioni appropriate sul publisher.

    PostgreSQL creerà automaticamente uno slot di replica sul publisher e inizierà ad applicare le modifiche. Puoi monitorare lo stato della subscription utilizzando pg_stat_subscription sul subscriber.

Suggerimento: La replica logica richiede l'estensione logical decoding, che di solito è integrata. È più intensiva in termini di risorse rispetto alla replica in streaming, ma offre maggiore flessibilità.

Scelta del Metodo di Replica Corretto

  • Streaming Replication (Replica in Streaming): Ideale per alta disponibilità e ripristino di emergenza, dove è necessaria una copia esatta, byte per byte, del primary. È più semplice da configurare per la replica completa del database e fornisce la migliore scalabilità di lettura per le repliche di sola lettura.
  • Logical Replication (Replica Logica): Più adatta per distribuzione selettiva dei dati, migrazioni, aggiornamenti cross-version, o quando è necessario replicare solo un sottoinsieme di dati. Consente scenari più complessi come la replica su schemi diversi o l'esecuzione di trasformazioni dei dati.

Conclusione

La replica PostgreSQL è una potente funzionalità che consente una solida disponibilità, ripristino e scalabilità dei dati. Sia che si opti per il mirroring completo dei dati della replica in streaming o per l'approccio flessibile e selettivo della replica logica, la comprensione dei loro meccanismi e configurazioni è fondamentale per mantenere un ambiente PostgreSQL sano e resiliente. Implementando la replica, si migliorano significativamente la tolleranza ai guasti e le capacità prestazionali del database.

Verifica sempre accuratamente la tua configurazione di replica, specialmente gli scenari di failover, e monitora il ritardo di replica (replication lag) per assicurarti che le tue repliche siano aggiornate. L'apprendimento continuo e l'adattamento alle funzionalità in evoluzione di PostgreSQL consolideranno ulteriormente la tua padronanza di questo indispensabile sistema di database.