Guida Passo-Passo per Configurare la Replica in Streaming di PostgreSQL
Configura la replica in streaming di PostgreSQL con pg_basebackup, pg_hba.conf, standby.signal e query di verifica.
Guida Passo-Passo per Configurare la Replica in Streaming di PostgreSQL
La replica in streaming è il meccanismo fondamentale per ottenere alta disponibilità (HA) e scalabilità in lettura negli ambienti PostgreSQL. Configurando un server primario (master) per trasmettere continuamente i record del Write-Ahead Log (WAL) a uno o più server standby (replica), garantisci la sincronizzazione dei dati con un ritardo minimo.
Questa guida illustra la replica asincrona in streaming utilizzando pg_basebackup, pg_hba.conf e i file di segnale standby. Alla fine avrai una coppia primario-standby funzionante e le verifiche necessarie per dimostrare che lo streaming è effettivamente attivo.
Prerequisiti e Configurazione dell'Ambiente
Prima di iniziare, assicurati che siano soddisfatti i seguenti prerequisiti. Questa guida presuppone due server, Primario e Standby, che eseguono la stessa versione principale di PostgreSQL (si consiglia la versione 12 o successiva).
| Server | Ruolo | Indirizzo IP (Esempio) |
|---|---|---|
| Primario | Fonte di verità | 192.168.1.10 |
| Standby | Replica | 192.168.1.11 |
- Utente: Devi avere accesso amministrativo (ad es.
sudoo l'utente di sistemapostgres) su entrambi i server. - Rete: Il server Standby deve essere in grado di connettersi al server Primario sulla porta PostgreSQL (default 5432).
Passo 1: Configurare il Server Primario
Il server primario deve essere configurato per generare e servire i file WAL per la replica.
1.1 Modificare postgresql.conf
Modifica il file di configurazione principale. Sui pacchetti Debian e Ubuntu si trova spesso in /etc/postgresql/<versione>/main/postgresql.conf; su molte installazioni da sorgente o container risiede nella directory dei dati. Imposta questi parametri:
# Consenti connessioni da altri host
listen_addresses = '*'
# Imposta il livello WAL su 'replica' o superiore
wal_level = replica
# Numero massimo di connessioni concorrenti dai server standby
max_wal_senders = 5
# Controlla il numero di connessioni standby che possono essere attive simultaneamente
max_replication_slots = 5
# Consente query di sola lettura sullo standby
hot_standby = on
1.2 Creare un Utente di Replica Dedicato
Per sicurezza, crea un utente specifico con l'attributo REPLICATION. Questo utente sarà utilizzato solo dal server standby per prelevare i record WAL.
# Connettiti a PostgreSQL
sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD 'usa-un-segreto-reale-qui';"
1.3 Aggiornare l'Autenticazione Client (pg_hba.conf)
Consenti all'utente di replica dall'indirizzo IP del server standby di connettersi al pseudo-database speciale replication.
# TYPE DATABASE USER ADDRESS METHOD
host replication replica_user 192.168.1.11/32 md5
1.4 Riavviare il Server Primario
Applica le modifiche di configurazione. Un riavvio è l'opzione semplice dopo aver cambiato listen_addresses; se hai modificato solo pg_hba.conf, è sufficiente un ricaricamento.
sudo systemctl restart postgresql
Passo 2: Preparare il Server Standby
Prima di clonare i dati, assicurati che il servizio PostgreSQL dello standby sia fermo e che la sua directory dati esistente sia cancellata.
2.1 Fermare il Servizio PostgreSQL dello Standby
sudo systemctl stop postgresql
2.2 Cancellare la Directory Dati
Attenzione: Questo passaggio elimina permanentemente tutti i dati attualmente nella directory dati dello standby. Conferma il percorso prima dell'esecuzione.
# Esempio di percorso per PG 14
PG_DATA=/var/lib/postgresql/14/main
sudo rm -rf $PG_DATA/*
2.3 Clonare i Dati Usando pg_basebackup
Usa pg_basebackup per creare una copia esatta della directory dati del primario. Il flag -R è cruciale perché genera automaticamente i file di configurazione necessari (standby.signal e primary_conninfo) per la replica in streaming (PostgreSQL 12+).
Esegui questo comando sul server Standby:
PG_DATA=/var/lib/postgresql/14/main
sudo -u postgres pg_basebackup -h 192.168.1.10 -D $PG_DATA -U replica_user -P -v -R
| Opzione | Descrizione |
|---|---|
-h |
Nome host o indirizzo IP del server primario. |
-D |
Percorso della directory dati locale. |
-U |
Nome utente di replica (replica_user). |
-P |
Mostra progresso. |
-v |
Output dettagliato. |
-R |
Crea automaticamente un file di configurazione della replica. |
Passo 3: Configurare e Avviare lo Standby
3.1 Verificare la Configurazione dello Standby
Se hai usato il flag -R nel Passo 2.3, pg_basebackup ha creato un file standby.signal e popolato l'impostazione primary_conninfo, di solito in un file di configurazione generato chiamato postgresql.auto.conf all'interno della directory dati.
Verifica il contenuto della stringa primary_conninfo. Dovrebbe assomigliare a questa (controlla all'interno di $PG_DATA/postgresql.auto.conf):
primary_conninfo = 'host=192.168.1.10 user=replica_user password=SuperSecurePassword123 application_name=standby_node'
Suggerimento: Assicurati che la password sia inclusa in
primary_conninfoo che tu stia usando l'autenticazione basata su certificati. Se usipg_hba.confcontrustocert, la password può essere omessa.
3.2 Avviare il Servizio Standby
Poiché il file di segnale richiesto (standby.signal) è presente nella directory dati, il servizio si avvierà in modalità standby di sola lettura e tenterà immediatamente di connettersi al primario.
sudo systemctl start postgresql
Passo 4: Verificare la Replica in Streaming
Dopo aver avviato lo standby, devi confermare che la connessione sia attiva e che la sincronizzazione dei dati stia avvenendo.
4.1 Verifica sul Server Primario
Connettiti al server primario e interroga la vista pg_stat_replication. Dovresti vedere una riga che rappresenta la connessione dal server standby.
psql -c "SELECT client_addr, state, sync_state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;"
Output Atteso (Campi Chiave):
client_addr: Dovrebbe corrispondere all'IP del server standby (ad es.192.168.1.11).state: Dovrebbe esserestreaming. Se mostrastartupocatching up, attendi un momento. Se mostrawalsenderin avvio, sei vicino.sync_state: Dovrebbe essereasync(per la replica asincrona standard).
4.2 Testare la Sincronizzazione dei Dati
Per confermare il flusso di dati, esegui una modifica sul primario e verifica immediatamente la sua esistenza sullo standby.
Sul Primario:
CREATE TABLE replication_test (id serial primary key, message text);
INSERT INTO replication_test (message) VALUES ('Dati sincronizzati con successo');
Sullo Standby (Sola Lettura):
-- Questo deve riuscire senza errori
psql -c "SELECT * FROM replication_test;"
Se i dati sono visibili sullo standby, la replica in streaming è configurata e attiva con successo.
Best Practice e Risoluzione dei Problemi
Connessione Persistente: Replication Slots
Sebbene opzionali, i replication slots sono altamente raccomandati. Un replication slot garantisce che il server primario non scarti prematuramente i segmenti WAL necessari allo standby, anche se lo standby si disconnette temporaneamente.
Sul Primario:
SELECT * FROM pg_create_physical_replication_slot('standby_slot_name');
Poi imposta primary_slot_name sullo standby. Non inserire il nome dello slot all'interno di primary_conninfo.
primary_conninfo = 'host=192.168.1.10 user=replica_user password=usa-un-segreto-reale-qui application_name=standby_node'
primary_slot_name = 'standby_slot_name'
Attenzione: I replication slots richiedono un monitoraggio attento. Se uno standby fallisce per un periodo prolungato, i file WAL accumulati protetti dallo slot possono riempire rapidamente lo spazio su disco del server primario.
Risoluzione dei Problemi Comuni
| Problema | Causa Potenziale | Soluzione |
|---|---|---|
| Lo standby non riesce a connettersi | Firewall di rete, listen_addresses errato o pg_hba.conf non corretto sul primario. |
Verifica che la porta 5432 sia raggiungibile; conferma che pg_hba.conf corrisponda all'IP dello standby e all'utente. |
pg_basebackup fallisce con errore di autenticazione |
Password errata o voce host mancante in pg_hba.conf. |
Ricontrolla la password per replica_user; assicurati che il database primario sia stato riavviato dopo la modifica di pg_hba.conf. |
| Lo standby è in sola lettura | Questo è il comportamento previsto. | La presenza di standby.signal forza il server in modalità di recupero. |
Passo Successivo
Configurare la replica in streaming è un passo critico nella costruzione di un'architettura PostgreSQL resiliente. Seguendo questi passaggi, hai configurato con successo una coppia primario-standby che garantisce una sincronizzazione continua dei dati, migliorando significativamente le capacità di alta disponibilità del tuo sistema. Il passo logico successivo è integrare una soluzione di monitoraggio e un meccanismo di failover (come Patroni o Repmgr) per automatizzare completamente la configurazione HA.