La versione 9.4 di PostgreSQL, in uscita fra pochi giorni, presenta numerose piccole novità per gli amministratori, in aggiunta all’introduzione del supporto alla replica logica, ovvero il primo passo verso una futura implementazione di replica multi-master in PostgreSQL. In questo articolo in due parti mostreremo le principali novità per gli amministratori, partendo proprio dalla replica logica, costituita da un insieme di nuove feature:
Lo sviluppo di queste funzionalità è un frutto diretto del lavoro effettuato da 2ndQuadrant (e, in particolare, da Andres Freund) all’interno del progetto BDR (BiDirectional Replication), una soluzione open source di replica multi-master basata su PostgreSQL, il cui codice è progressivamente incluso nel core di Postgres con l’obiettivo di diventarne parte integrante nei prossimi anni.
Nel prossimo articolo, vedremo le altre novità dedicate agli amministratori.
I replication slot fisici sono una struttura che mantiene la memoria dello stato di uno standby e dei WAL a questo necessari, anche quando lo standby è offline. In questo modo non è più indispensabile dover stimare wal_keep_segments
o configurare il continuous archiving. Utili quindi per server in replica fisica, sono poi indispensabili alla replica logica, dove i server potrebbero avere contenuti differenti non replicati e non sarebbe così possibile ricostruire il server da zero.
Maggiori informazioni in un articolo di Craig Ringer sui replication slot di PostgreSQL 9.4.
È stato introdotto il parametro wal_level = logical
. Usando questa impostazione i WAL file avranno una dimensione leggermente maggiore di quanta ne abbiano adesso in hot_standby
, ma conterranno le infomazioni necessarie al funzionamento della decodifica logica.
Una volta impostato wal_level = logical
all’interno del postgresql.conf
, sarà possibile iniziare a usare i replication slot logici. Simili come idea ai replication slot fisici, a differenza di questi operano su una singola base di dati, e inviano la sequenza di cambiamenti avvenuti su di essa.
La decodifica logica usa i replication slot e dei plugin di decodifica per inviare e rendere comprensibili a elementi esterni i cambiamenti avvenuti all’interno del db. Per la visualizzazione sono state sviluppate le funzioni pg_logical_slot_get_changes
e pg_logical_slot_peek_changes
, con la differenza che la prima consuma il cambiamento nella coda e la seconda lo legge soltanto. L’output della funzione dipende dal plugin usato per creare lo slot. Al momento ne sono stati sviluppati tre:
test_decoding
, il plugin di default;wal2json
, che mostra i cambiamenti avvenuti in formato JSON;decoder_raw
, che ricostruisce le query che hanno applicato la modifica.REPLICA IDENTITY
è un nuovo parametro a livello di tabella. Identifica quali informazioni devono essere scritte nei WAL per identificare le tuple modificate o rimosse se è impostato wal_level = logical
. Esistono 4 valori:
DEFAULT
: scrive la precedente chiave primaria della tupla se è stata modificataUSING INDEX idx
: scrive le informazioni dell’indice usato, che deve essere UNIQUE
, non parziale e NOT NULL
.FULL
: scrive tutte le colonne della vecchia tupla. Utile se manca una chiave primaria.NOTHING
: non scrive informazioni sul vecchio record. È il default per le tabelle di sistema.Utilizzando le funzioni e i plugin di decodifica, è possibile scrivere i propri consumer e rimuovere la dipendenza dei propri database da soluzioni di replica basate su trigger, ben più pesanti.
Il blog di Michael Paquier contiene un esempio di codice SQL che mostra l’uso della replica logica.
Nella prossima parte, ci occuperemo delle altre novità principali nel campo Operation di PostgreSQL 9.4, fra cui pg_prewarm, tablespace, standby in ritardo, gestione dei WAL, ecc… Alla prossima puntata!
[…] Segui inoltre la nostra serie di articoli in italiano su PostgreSQL 9.4, a partire dalle novità dedicate agli amministratori di sistema. […]