{"id":58941,"date":"2022-08-11T13:36:48","date_gmt":"2022-08-11T12:36:48","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=58941&#038;preview=true&#038;preview_id=58941"},"modified":"2023-02-22T15:40:26","modified_gmt":"2023-02-22T14:40:26","slug":"replica-postgresql","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/","title":{"rendered":"Replica PostgreSQL: Guida Completa"},"content":{"rendered":"<p>Come vi dir\u00e0 chiunque possieda un sito, la perdita di dati e i tempi di inattivit\u00e0, anche in dosi minime, possono essere catastrofici. Possono colpire gli impreparati in qualsiasi momento, riducendo la produttivit\u00e0, l&#8217;accessibilit\u00e0 e la fiducia nei prodotti.<\/p>\n<p>Per proteggere l&#8217;integrit\u00e0 del vostro sito, \u00e8 fondamentale predisporre delle misure di salvaguardia contro la possibilit\u00e0 di downtime o perdita di dati.<\/p>\n<p>\u00c8 qui che entra in gioco la replica dei dati.<\/p>\n\n<p>La replica dei dati \u00e8 un processo di backup automatico in cui i dati vengono ripetutamente copiati dal database principale a un&#8217;altra posizione remota per essere conservati. \u00c8 una tecnologia fondamentale per qualsiasi sito o applicazione che usare un server di <a href=\"https:\/\/kinsta.com\/it\/blog\/database-wordpress\/\">database<\/a>. Potete anche sfruttare il database replicato per elaborare SQL di sola lettura, consentendo l&#8217;esecuzione di pi\u00f9 processi all&#8217;interno del sistema.<\/p>\n<p>L&#8217;impostazione della replica tra due database offre una tolleranza ai guasti contro gli imprevisti. \u00c8 considerata la migliore strategia per ottenere un&#8217;alta disponibilit\u00e0 durante i disastri.<\/p>\n<p>In questo articolo, approfondiremo le diverse strategie che possono essere implementate dagli <a href=\"https:\/\/kinsta.com\/it\/blog\/sviluppatore-backend\/\">sviluppatori di backend<\/a> per una replica PostgreSQL senza soluzione di continuit\u00e0.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Cos&#8217;\u00c8 la Replica PostgreSQL?<\/h2>\n<figure id=\"attachment_128034\" aria-describedby=\"caption-attachment-128034\" style=\"width: 945px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-128034\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/07\/PostgreSQL-Replication-Illustration.png\" alt=\"Illustrazione della replica PostgreSQL che mostra il flusso di dati dal server primario alla replica.\" width=\"945\" height=\"310\"><figcaption id=\"caption-attachment-128034\" class=\"wp-caption-text\">Illustrazione della replica PostgreSQL (Fonte: <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial#continuous-wal\">EnterpriseDB<\/a>)<\/figcaption><\/figure>\n<p>La replica PostgreSQL \u00e8 definita come il processo di copia dei dati da un server di <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-postgresql\/\">database PostgreSQL<\/a> a un altro server. Il server del database di origine \u00e8 noto anche come server &#8220;primario&#8221;, mentre il server del database che riceve i dati copiati \u00e8 noto come server &#8220;di replica&#8221;.<\/p>\n<p>Il database PostgreSQL segue un modello di replica semplice, in cui tutte le scritture vengono inviate a un nodo primario. Il nodo primario pu\u00f2 quindi applicare le modifiche e trasmetterle ai nodi secondari.<\/p>\n<h3>Cos&#8217;\u00e8 il Failover Automatico?<\/h3>\n<p>Il failover \u00e8 un metodo per <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial\">recuperare i dati se il server primario<\/a> cede per qualsiasi motivo. Se avete configurato PostreSQL per gestire la replica dello streaming fisico, voi e i vostri utenti sarete protetti dai tempi di inattivit\u00e0 dovuti a un guasto del server primario.<\/p>\n<p>Il processo di failover pu\u00f2 richiedere un po&#8217; di tempo per essere configurato e avviato. In PostgreSQL non esistono strumenti integrati per il monitoraggio e l&#8217;analisi dei guasti del server, quindi \u00e8 necessario essere creativi.<\/p>\n<p>Non dovete dipendere da PostgreSQL per il failover. Esistono strumenti dedicati che consentono il failover automatico e il passaggio automatico allo standby, riducendo i <a href=\"https:\/\/kinsta.com\/it\/blog\/riparare-il-database-di-wordpress\/\">tempi di inattivit\u00e0 del database<\/a>.<\/p>\n<p>Impostando la replica di failover, garantite l&#8217;alta disponibilit\u00e0 e vi assicurate che gli standby siano disponibili se il server primario dovesse crollare.<\/p>\n<h2>Vantaggi dell\u2019Uso della Replica PostgreSQL<\/h2>\n<p>Ecco alcuni vantaggi chiave dell&#8217;utilizzo della replica di PostgreSQL:<\/p>\n<ul>\n<li><strong>Migrazione dei dati:<\/strong> Potete sfruttare la replica di PostgreSQL per la migrazione dei dati, sia attraverso un cambio di hardware del server di database che attraverso l&#8217;implementazione del sistema.<\/li>\n<li><strong>Tolleranza ai guasti:<\/strong> Se il server primario si guasta, il server standby pu\u00f2 fungere da server perch\u00e9 i dati contenuti sia nel server primario che in quello standby sono gli stessi.<\/li>\n<li><strong>Performance Online Transactional Processing (OLTP):<\/strong> Potete migliorare il tempo di elaborazione delle transazioni e il tempo di interrogazione di un sistema OLTP eliminando il carico delle query di reporting. Il tempo di elaborazione delle transazioni \u00e8 la durata dell&#8217;esecuzione di una determinata query prima che una transazione sia terminata.<\/li>\n<li><strong>Test del sistema in parallelo:<\/strong> Durante l&#8217;aggiornamento di un nuovo sistema, \u00e8 necessario assicurarsi che il sistema funzioni bene con i dati esistenti; da qui la necessit\u00e0 di testare con una copia del database di produzione prima dell&#8217;implementazione.<\/li>\n<\/ul>\n<h2>Come Funziona la Replica PostgreSQL<\/h2>\n<p>In genere, si pensa che quando ci si diletta con un&#8217;architettura primaria e secondaria, ci sia un solo modo per <a href=\"https:\/\/kinsta.com\/it\/blog\/backup-sito-wordpress\/\">impostare i backup<\/a> e la replica. Le implementazioni di PostgreSQL, invece, possono seguire uno <a href=\"https:\/\/www.citusdata.com\/blog\/2018\/02\/21\/three-approaches-to-postgresql-replication\/\">qualsiasi di questi tre metodi<\/a>:<\/p>\n<ol>\n<li><strong>Replica in streaming:<\/strong> Replica i dati dal nodo primario al secondario, quindi copia i dati su Amazon S3 o Azure Blob per l&#8217;archiviazione di backup.<\/li>\n<li><strong>Replica a livello di volume<\/strong> per replicare a livello di storage dal nodo primario a quello secondario, seguita da un backup su storage blob\/S3.<\/li>\n<li><strong>Backup incrementali:<\/strong> Replica i dati dal nodo primario mentre costruisce un nuovo nodo secondario dallo storage di Amazon S3 o Azure Blob, consentendo lo streaming direttamente dal nodo primario.<\/li>\n<\/ol>\n<h3>Metodo 1: Streaming<\/h3>\n<p>La replica in streaming di PostgreSQL, nota anche come replica WAL, pu\u00f2 essere impostata senza problemi dopo aver installato PostgreSQL su tutti i server. Questo approccio alla replica si basa sullo spostamento dei file WAL dal database primario a quello di destinazione.<\/p>\n<p>Potete implementare la replica in streaming di PostgreSQL usando una configurazione primaria-secondaria. Il server primario \u00e8 l&#8217;istanza principale che gestisce il database primario e tutte le sue operazioni. Il server secondario agisce come istanza supplementare ed esegue tutte le modifiche apportate al database primario su se stesso, generando una copia identica nel processo. Il server primario \u00e8 un server di lettura\/scrittura, mentre il server secondario \u00e8 di sola lettura.<\/p>\n<p>Per questo metodo, \u00e8 necessario configurare sia il nodo primario che il nodo standby. Le sezioni seguenti illustrano i passaggi necessari per configurarli con facilit\u00e0.<\/p>\n<h4>Configurazione del Nodo Primario<\/h4>\n<p>Potete configurare il nodo primario per la replica in streaming eseguendo i seguenti passaggi:<\/p>\n<h5>Passo 1: Inizializzare il Database<\/h5>\n<p>Per <a href=\"https:\/\/hevodata.com\/learn\/postgresql-streaming-replication\/#master1\">inizializzare il database<\/a>, potete usare il comando <code>initidb<\/code> utility. Successivamente, potete creare un nuovo utente con privilegi di replica utilizzando il seguente comando:<\/p>\n<pre><code class=\"language-bash\">CREATE USER 'example_username' REPLICATION LOGIN ENCRYPTED PASSWORD 'example_password';<\/code><\/pre>\n<p>L&#8217;utente dovr\u00e0 fornire una password e un nome utente per la query indicata. La parola chiave replica viene utilizzata per dare all&#8217;utente i privilegi richiesti. Un esempio di query potrebbe essere il seguente:<\/p>\n<pre><code class=\"language-bash\">CREATE USER 'rep_username' REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_password';<\/code><\/pre>\n<h5>Passo 2: Configurare le Propriet\u00e0 di Streaming<\/h5>\n<p>Successivamente, potete configurare le propriet\u00e0 dello streaming con il file di configurazione di PostgreSQL (<strong>postgresql.conf<\/strong>) che pu\u00f2 essere modificato come segue:<\/p>\n<pre><code class=\"bash\">wal_level = logical\nwal_log_hints = on\nmax_wal_senders = 8\nmax_wal_size = 1GB\nhot_standby = on<\/code><\/pre>\n<p>Ecco un po&#8217; di informazioni sui parametri usati nel frammento precedente:<\/p>\n<ul>\n<li><strong><code>wal_log_hints<\/code>:<\/strong> Questo parametro \u00e8 necessario per la funzionalit\u00e0 <code>pg_rewind<\/code> che si rivela utile quando il server standby non \u00e8 sincronizzato con il server principale.<\/li>\n<li><strong><code>wal_level<\/code>:<\/strong> Potete usare questo parametro per abilitare la replica in streaming di PostgreSQL, con valori possibili come <code>minimal<\/code>, <code>replica<\/code>, o <code>logical<\/code>.<\/li>\n<li><strong><code>max_wal_size<\/code>:<\/strong> Questo parametro pu\u00f2 essere usato per specificare la dimensione dei file WAL che possono essere conservati nei file di log.<\/li>\n<li><strong><code>hot_standby<\/code>:<\/strong> Potete sfruttare questo parametro per una connessione in lettura con il secondario quando \u00e8 impostato su ON.<\/li>\n<li><strong><code>max_wal_senders<\/code>:<\/strong> Potete usare <code>max_wal_senders<\/code> per specificare il numero massimo di connessioni contemporanee che possono essere stabilite con i server standby.<\/li>\n<\/ul>\n<h5>Passo 3: Creare una Nuova Voce<\/h5>\n<p>Dopo aver modificato i parametri nel file <strong>postgresql.conf<\/strong>, una nuova voce di replica nel file <strong>pg_hba.conf<\/strong> pu\u00f2 consentire ai server di stabilire una connessione reciproca per la replica.<\/p>\n<p>Di solito questo file si trova nella directory dei dati di PostgreSQL. Per farlo, potete usare il seguente snippet di codice:<\/p>\n<pre><code class=\"language-bash\"> host replication rep_user IPaddress md5<\/code><\/pre>\n<p>Una volta eseguito lo snippet di codice, il server primario permette a un utente chiamato <code>rep_user<\/code> di connettersi e di agire come server standby utilizzando l&#8217;IP specificato per la replica. Per esempio:<\/p>\n<pre><code class=\"language-bash\"> host replication rep_user 192.168.0.22\/32 md5<\/code><\/pre>\n<h4>Configurazione del Nodo Standby<\/h4>\n<p>Per configurare il nodo standby per la replica in streaming, seguite i seguenti passaggi:<\/p>\n<h5>Passo 1: Backup del Nodo Primario<\/h5>\n<p>Per configurare il nodo standby, usate l&#8217;utility <code>pg_basebackup<\/code> per generare un backup del nodo primario. Questo servir\u00e0 come punto di partenza per il nodo standby. Potete usare questa utility con la seguente sintassi:<\/p>\n<pre><code class=\"language-bash\">pg_basebackp -D  -h  -X stream -c fast -U rep_user -W<\/code><\/pre>\n<p>I parametri usati nella sintassi di cui sopra sono i seguenti:<\/p>\n<ul>\n<li><strong><code>-h<\/code>:<\/strong> Potete usare questo parametro per menzionare l&#8217;host primario.<\/li>\n<li><strong><code>-D<\/code>:<\/strong> Questo parametro indica la directory su cui state lavorando.<\/li>\n<li><strong><code>-C<\/code>:<\/strong> Potete usare questo parametro per impostare i checkpoint.<\/li>\n<li><strong><code>-X<\/code>:<\/strong> Questo parametro pu\u00f2 essere usato per includere i file di log transazionali necessari.<\/li>\n<li><strong><code>-W<\/code>:<\/strong> Potete usare questo parametro per richiedere all&#8217;utente una password prima di collegarsi al database.<\/li>\n<\/ul>\n<h5>Passo 2: Impostare il File di Configurazione della Replica<\/h5>\n<p>Successivamente, dovete verificare se il file di configurazione della replica esiste. Se non esiste, potete generare il file di configurazione della replica come <strong>recovery.conf<\/strong>.<\/p>\n<p>Dovete creare questo file nella directory dei dati dell&#8217;installazione di PostgreSQL. Potte generarlo automaticamente usando l&#8217;opzione <code>-R<\/code> dell&#8217;utility <code>pg_basebackup<\/code>.<\/p>\n<p>Il file <strong>recovery.conf<\/strong> deve contenere i seguenti comandi:<\/p>\n<p><code>standby_mode = 'on'<\/code><\/p>\n<p><code class=\"bash\">primary_conninfo = 'host=&lt;master_host&gt; port=&lt;postgres_port&gt; user=&lt;replication_user&gt; password=&lt;password&gt; application_name=\"host_name\"'<br \/>\n<\/code><\/p>\n<p><code>recovery_target_timeline = 'latest'<\/code><\/p>\n<p>I parametri utilizzati nei suddetti comandi sono i seguenti:<\/p>\n<ul>\n<li><strong><code>primary_conninfo<\/code>:<\/strong> Potete usare questo parametro per creare una connessione tra il server primario e quello secondario sfruttando una stringa di connessione.<\/li>\n<li><strong><code>standby_mode<\/code>:<\/strong> Questo parametro pu\u00f2 far s\u00ec che il server primario parta come standby quando viene acceso.<\/li>\n<li><strong><code>recovery_target_timeline<\/code>:<\/strong> Potete usare questo parametro per impostare il tempo di ripristino.<\/li>\n<\/ul>\n<p>Per impostare una connessione, dovete fornire il nome utente, l&#8217;indirizzo IP e la password come valori del parametro primary_conninfo. Per esempio:<\/p>\n<pre><code class=\"language-bash\">primary_conninfo = 'host=192.168.0.26 port=5432 user=rep_user password=rep_pass'<\/code><\/pre>\n<h5>Passo 3: Riavviare il Server Secondario<\/h5>\n<p>Infine, potete riavviare il server secondario per completare il processo di configurazione.<\/p>\n<p>Tuttavia, la replica in streaming comporta diverse sfide, come per esempio:<\/p>\n<ul>\n<li>Diversi client PostgreSQL (scritti in diversi linguaggi di programmazione) dialogano con un unico endpoint. Quando il nodo primario si guasta, questi client continuano a riprovare lo stesso nome DNS o IP. In questo modo il failover \u00e8 visibile all&#8217;applicazione.<\/li>\n<li>La replica di PostgreSQL non \u00e8 dotata di failover e monitoraggio integrati. Quando il nodo primario si guasta, dovete promuovere un secondario come nuovo primario. Questa promozione deve essere eseguita in modo che i client scrivano su un solo nodo primario e non osservino incongruenze nei dati.<\/li>\n<li>PostgreSQL replica l&#8217;intero stato. Quando \u00e8 necessario sviluppare un nuovo nodo secondario, quest&#8217;ultimo deve recuperare l&#8217;intera cronologia dei cambiamenti di stato dal nodo primario, il che richiede un notevole dispendio di risorse e rende costosa l&#8217;eliminazione dei nodi della testa e la creazione di nuovi nodi.<\/li>\n<\/ul>\n<h3>Metodo 2: Dispositivo a Blocchi Replicato<\/h3>\n<p>L&#8217;metodo del dispositivo a blocchi replicato dipende dal mirroring del disco (noto anche come replica del volume). In questo approccio, le modifiche vengono scritte su un volume persistente che viene sincronizzato con un altro volume.<\/p>\n<p>Il vantaggio di questo metodo \u00e8 la compatibilit\u00e0 e la durata dei dati in ambienti cloud con tutti i database relazionali, tra cui PostgreSQL, MySQL e <a href=\"https:\/\/kinsta.com\/it\/blog\/postgresql-vs-sql-server\/\">SQL Server<\/a>, per citarne alcuni.<\/p>\n<p>Tuttavia, l&#8217;metodo alla replica di PostgreSQL basato sul mirroring del disco richiede la replica sia dei log WAL che dei dati delle tabelle. Dal momento che ogni scrittura sul database deve passare attraverso la rete in modo sincrono, non potete permettervi di perdere nemmeno un byte, perch\u00e9 questo potrebbe lasciare il vostro database in uno stato corrotto.<\/p>\n<p>Questo approccio viene normalmente utilizzato con Azure PostgreSQL e Amazon RDS.<\/p>\n<h3>Metodo 3: WAL<\/h3>\n<p>Il WAL consiste in file di segmenti (16 MB per impostazione predefinita). Ogni segmento contiene uno o pi\u00f9 record. Un record di sequenza di log (LSN) \u00e8 un puntatore a un record nel WAL, che consente di conoscere la posizione\/localit\u00e0 in cui il record \u00e8 stato salvato nel file di log.<\/p>\n<p>Un server standby sfrutta i segmenti WAL &#8211; noti anche come XLOGS nella terminologia di PostgreSQL &#8211; per replicare continuamente le modifiche dal server primario. Potete usare il write-ahead logging per garantire la durabilit\u00e0 e l&#8217;atomicit\u00e0 di un DBMS serializzando pezzi di dati byte-array (ognuno con un LSN univoco) in uno storage stabile prima che vengano applicati al database.<\/p>\n<p>L&#8217;applicazione di una mutazione a un database pu\u00f2 portare a diverse operazioni sul file system. Una domanda pertinente che sorge spontanea \u00e8 come un database possa garantire l&#8217;atomicit\u00e0 in caso di guasto del server dovuto a un&#8217;interruzione di corrente mentre \u00e8 nel bel mezzo di un aggiornamento del file system. Quando un database si avvia, inizia un processo di avvio o replay che pu\u00f2 leggere i segmenti WAL disponibili e confrontarli con l&#8217;LSN memorizzato su ogni pagina di dati (ogni pagina di dati \u00e8 contrassegnata con l&#8217;LSN dell&#8217;ultimo record WAL che riguarda la pagina).<\/p>\n<h4>Replica Basata sul Log Shipping (Livello di Blocco)<\/h4>\n<p>La replica in streaming perfeziona il processo di spedizione dei log. Invece di aspettare il passaggio al WAL, i record vengono inviati man mano che vengono creati, riducendo cos\u00ec il ritardo della replica.<\/p>\n<p>La replica in streaming supera anche il log shipping perch\u00e9 il server standby si collega al server primario attraverso la rete sfruttando un protocollo di replica. Il server primario pu\u00f2 quindi inviare i record WAL direttamente attraverso questa connessione senza dover dipendere dagli script forniti dall&#8217;utente finale.<\/p>\n<h4>Replica Basata sul Log Shipping (Livello File)<\/h4>\n<p>Il log shipping \u00e8 definito come la copia dei file di log su un altro server PostgreSQL per generare un altro server di standby riproducendo i file WAL. Questo server \u00e8 configurato per funzionare in modalit\u00e0 di recupero e il suo unico scopo \u00e8 quello di applicare i nuovi file WAL non appena si presentano.<\/p>\n<p>Questo server secondario diventa quindi un backup a caldo del server PostgreSQL primario. Pu\u00f2 anche essere configurato per essere una replica di lettura, dove pu\u00f2 offrire query di sola lettura, anche detta hot standby.<\/p>\n<h4>Archiviazione WAL Continua<\/h4>\n<p>La duplicazione dei file WAL man mano che vengono creati in una posizione diversa dalla sottodirectory <code>pg_wal<\/code> per archiviarli \u00e8 nota come archiviazione WAL. PostgreSQL richiama uno script fornito dall&#8217;utente per l&#8217;archiviazione, ogni volta che viene creato un file WAL.<\/p>\n<p>Lo script pu\u00f2 sfruttare il comando <code>scp<\/code> per duplicare il file in una o pi\u00f9 posizioni, come per esempio un mount NFS. Una volta archiviati, i file WAL possono essere utilizzati per recuperare il database in qualsiasi momento.<\/p>\n<p>Altre configurazioni basate sui log includono:<\/p>\n<ul>\n<li><strong>Replica sincrona:<\/strong> Prima che ogni transazione di replica sincrona venga impegnata, il server primario attende che gli standby confermino di aver ricevuto i dati. Il vantaggio di questa configurazione \u00e8 che non ci saranno conflitti dovuti a processi di scrittura paralleli.<\/li>\n<li><strong>Replica sincrona multi-master:<\/strong> In questo caso, ogni server pu\u00f2 accettare richieste di scrittura e i dati modificati vengono trasmessi dal server originale a tutti gli altri server prima che ogni transazione venga impegnata. Sfrutta il protocollo 2PC e rispetta la regola &#8220;tutto o niente&#8221;.<\/li>\n<\/ul>\n<h4>Dettagli del Protocollo di Streaming WAL<\/h4>\n<p>Un processo noto come ricevitore WAL, in esecuzione sul server standby, sfrutta i dettagli della connessione forniti nel parametro <code>primary_conninfo<\/code> di <strong>recovery.conf<\/strong> e si connette al server primario sfruttando una connessione TCP\/IP.<\/p>\n<p>Per avviare la replica in streaming, il frontend pu\u00f2 inviare il parametro di replica nel messaggio di avvio. Un valore booleano di true, yes, 1 o ON fa capire al <a href=\"https:\/\/kinsta.com\/it\/blog\/stipendio-sviluppatore-backend\/\">backend<\/a> che deve passare alla modalit\u00e0 walsender di replica fisica.<\/p>\n<p>Il WAL sender \u00e8 un altro processo che viene eseguito sul server primario e ha il compito di inviare i record WAL al server standby quando vengono generati. Il ricevitore WAL salva i record WAL nel WAL come se fossero stati creati dall&#8217;attivit\u00e0 dei client connessi localmente.<\/p>\n<p>Una volta che i record WAL raggiungono i file di segmento WAL, il server standby continua a riprodurre costantemente il WAL in modo che il server primario e quello standby siano aggiornati.<\/p>\n<figure id=\"attachment_128035\" aria-describedby=\"caption-attachment-128035\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-128035\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/07\/WAL-Streaming-Protocol-Details.png\" alt=\"Un diagramma di flusso che illustra le fasi del processo WAL Streaming Protocol tra i server primario e standby.\" width=\"1024\" height=\"1020\"><figcaption id=\"caption-attachment-128035\" class=\"wp-caption-text\">Diagramma del WAL Streaming Protocol (Fonte: <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial#continuous-wal\">EnterpriseDB<\/a>)<\/figcaption><\/figure>\n<h2>Elementi di Replica PostgreSQL<\/h2>\n<p>In questa sezione, potete approfondire la conoscenza dei modelli comunemente utilizzati (replica single-master e multi-master), dei tipi (replica fisica e logica) e delle modalit\u00e0 (sincrona e asincrona) della replica PostgreSQL.<\/p>\n<h3>Modelli di Replica dei Database PostgreSQL<\/h3>\n<p>Scalabilit\u00e0 significa aggiungere altre risorse\/ hardware ai nodi esistenti per migliorare la capacit\u00e0 del database di memorizzare ed elaborare pi\u00f9 dati, il che pu\u00f2 essere ottenuto in modo orizzontale e verticale. La replica di PostgreSQL \u00e8 un esempio di scalabilit\u00e0 orizzontale che \u00e8 molto pi\u00f9 difficile da implementare rispetto alla scalabilit\u00e0 verticale. La scalabilit\u00e0 orizzontale pu\u00f2 essere ottenuta principalmente tramite la replica single-master (SMR) e la replica multi-master (MMR).<\/p>\n<p>La replica single-master consente di modificare i dati solo su un singolo nodo e di replicare le modifiche su uno o pi\u00f9 nodi. Le tabelle replicate nel database di replica non possono accettare alcuna modifica, tranne quelle provenienti dal server primario. Anche se lo fanno, le modifiche non vengono replicate al server primario.<\/p>\n<p>Nella maggior parte dei casi, la SMR \u00e8 sufficiente per l&#8217;applicazione perch\u00e9 \u00e8 meno complicata da configurare e gestire, oltre a non avere possibilit\u00e0 di conflitti. La replica single-master \u00e8 anche unidirezionale, in quanto i dati di replica fluiscono principalmente in una direzione, dal database primario a quello di replica.<\/p>\n<p>In alcuni casi, la sola SMR potrebbe non essere sufficiente e potrebbe essere necessario implementare la MMR. L&#8217;MMR permette a pi\u00f9 di un nodo di agire come nodo primario. Le modifiche alle righe delle tabelle in pi\u00f9 di un database primario designato vengono replicate alle tabelle corrispondenti in ogni altro database primario. In questo modello, spesso si usano schemi di risoluzione dei conflitti per evitare problemi come la duplicazione delle chiavi primarie.<\/p>\n<p>L&#8217;utilizzo dell&#8217;MMR presenta alcuni vantaggi, tra cui:<\/p>\n<ul>\n<li>In caso di guasto dell&#8217;host, gli altri host possono comunque fornire servizi di aggiornamento e inserimento.<\/li>\n<li>I nodi primari sono distribuiti in diverse localit\u00e0, quindi la possibilit\u00e0 che tutti i nodi primari si guastino \u00e8 molto bassa.<\/li>\n<li>Possibilit\u00e0 di usare una rete WAN (Wide Area Network) di database primari che possono essere geograficamente vicini a gruppi di clienti, pur mantenendo la coerenza dei dati in tutta la rete.<\/li>\n<\/ul>\n<p>Tuttavia, l&#8217;aspetto negativo dell&#8217;implementazione dell&#8217;MMR \u00e8 la complessit\u00e0 e la difficolt\u00e0 di risolvere i conflitti.<\/p>\n<p>Diversi rami e applicazioni forniscono soluzioni MMR, dato che PostgreSQL non lo supporta in modo nativo. Queste soluzioni possono essere <a href=\"https:\/\/kinsta.com\/it\/blog\/open-source-database\/\">open-source<\/a>, gratuite o a pagamento. Una di queste \u00e8 <a href=\"https:\/\/kinsta.com\/it\/blog\/plugin-database-wordpress\/\">la replica bidirezionale (BDR)<\/a> che \u00e8 asincrona e si basa sulla funzione di decodifica logica di PostgreSQL.<\/p>\n<p>Poich\u00e9 l&#8217;applicazione BDR riproduce le transazioni su altri nodi, l&#8217;operazione di replay pu\u00f2 fallire se c&#8217;\u00e8 un conflitto tra la transazione applicata e quella impegnata sul nodo ricevente.<\/p>\n<h3>Tipi di Replica PostgreSQL<\/h3>\n<p>Esistono due tipi di replica PostgreSQL: la replica logica e quella fisica.<\/p>\n<p>Una semplice operazione <em>logica<\/em> <code>initdb<\/code>\u00a0esegue l&#8217;operazione fisica di creazione di una directory di base per un cluster. Allo stesso modo, una semplice operazione <em>logica<\/em> <code>CREATE DATABASE<\/code>\u00a0eseguir\u00e0 l&#8217;operazione <em>fisica<\/em> di creazione di una sottodirectory nella directory di base.<\/p>\n<p>La replica fisica di solito si occupa di file e directory. Non sa cosa rappresentino questi file e directory. Questi metodi sono utilizzati per mantenere una copia completa di tutti i dati di un singolo cluster, in genere su un&#8217;altra macchina, e vengono eseguiti a livello di file system o di disco e usano indirizzi di blocco esatti.<\/p>\n<p>La replica logica \u00e8 un modo per riprodurre le entit\u00e0 di dati e le loro modifiche, basandosi sulla loro identit\u00e0 di replica (di solito una chiave primaria). A differenza della replica fisica, si occupa di database, tabelle e operazioni DML e avviene a livello di cluster di database. Usa un modello <em>publish<\/em> e <em>subscribe<\/em> in cui uno o pi\u00f9 <em>sottoscrittori<\/em> sono abbonati a una o pi\u00f9 <em>pubblicazioni<\/em> su un nodo <em>editore<\/em>.<\/p>\n<p>Il processo di replica inizia con l&#8217;acquisizione di un&#8217;istantanea dei dati sul database dell&#8217;editore e la successiva copia sul sottoscrittore. Gli abbonati estraggono i dati dalle pubblicazioni a cui si abbonano e possono ripubblicare i dati in un secondo momento per consentire la replica a cascata o configurazioni pi\u00f9 complesse. L&#8217;abbonato applica i dati nello stesso ordine dell&#8217;editore in modo da garantire la coerenza transazionale delle pubblicazioni all&#8217;interno di un singolo abbonamento, nota anche come replica transazionale.<\/p>\n<p>I casi d&#8217;uso tipici della replica logica sono:<\/p>\n<ul>\n<li>Invio di modifiche incrementali in un singolo database (o in un sottoinsieme di un database) agli abbonati man mano che si verificano.<\/li>\n<li>Condividere un sottoinsieme del database tra pi\u00f9 database.<\/li>\n<li>Attivare l&#8217;avvio delle singole modifiche quando arrivano all&#8217;abbonato.<\/li>\n<li>Consolidamento di pi\u00f9 database in uno solo.<\/li>\n<li>Fornire l&#8217;accesso ai dati replicati a diversi gruppi di utenti.<\/li>\n<\/ul>\n<p>Il database sottoscrittore si comporta come qualsiasi altra istanza di PostgreSQL e pu\u00f2 essere utilizzato come editore per altri database definendo le sue pubblicazioni.<\/p>\n<p>Se il subscriber \u00e8 trattato come di sola lettura dall&#8217;applicazione, non ci saranno conflitti da una singola sottoscrizione. D&#8217;altra parte, se ci sono altre scritture effettuate da un&#8217;applicazione o da altri sottoscrittori sullo stesso insieme di tabelle, possono sorgere dei conflitti.<\/p>\n<p>PostgreSQL supporta entrambi i meccanismi contemporaneamente. La replica logica consente un controllo a grana fine sia sulla replica dei dati che sulla sicurezza.<\/p>\n<h3>Modalit\u00e0 di Replica<\/h3>\n<p>Le modalit\u00e0 di replica di PostgreSQL sono principalmente due: sincrona e asincrona. La replica sincrona permette di scrivere i dati contemporaneamente sul server primario e su quello secondario, mentre la replica asincrona garantisce che i dati vengano prima scritti sull&#8217;host e poi copiati sul server secondario.<\/p>\n<p>Nella replica in modalit\u00e0 sincrona, le transazioni sul database primario sono considerate complete solo quando le modifiche sono state replicate a tutte le repliche. I server di replica devono essere tutti sempre disponibili affinch\u00e9 le transazioni sul primario siano completate. La modalit\u00e0 di replica sincrona viene utilizzata in ambienti transazionali di alto livello con requisiti di failover immediato.<\/p>\n<p>In modalit\u00e0 asincrona, le transazioni sul server primario possono essere dichiarate completate quando le modifiche sono state effettuate solo sul server primario. Queste modifiche vengono poi replicate nelle repliche in un secondo momento. I server di replica possono rimanere non sincronizzati per un certo periodo di tempo, chiamato ritardo di replica. In caso di crash, si pu\u00f2 verificare una perdita di dati, ma l&#8217;overhead fornito dalla replica asincrona \u00e8 ridotto, quindi \u00e8 accettabile nella maggior parte dei casi (non sovraccarica l&#8217;host). Il failover dal database primario a quello secondario richiede pi\u00f9 tempo rispetto alla replica sincrona.<\/p>\n<h2>Come Impostare la Replica di PostgreSQL<\/h2>\n<p>In questa sezione vi mostreremo come impostare il processo di replica di PostgreSQL su un sistema operativo Linux. In questo caso, utilizzeremo Ubuntu 18.04 LTS e PostgreSQL 10.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Assicurati di aver installato il server Linux Ubuntu. I passaggi per installare PostgreSQL su un server Linux sono indicati di seguito, seguiti dall&#8217;impostazione della replica nel server primario e in quello secondario.<\/p>\n<\/aside>\n\n<p>Entriamo nel vivo dell&#8217;argomento!<\/p>\n<h3>Installazione<\/h3>\n<p>Iniziiamo installando PostgreSQL su Linux con i seguenti passaggi:<\/p>\n<ol>\n<li>Per prima cosa, dovete importare la chiave di firma di PostgreSQL digitando il seguente comando nel terminale:\n<pre><code class=\"language-bash\">wget -q https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc -O- | sudo apt-key add -<\/code><\/pre>\n<\/li>\n<li>Poi, aggiungete il repository PostgreSQL digitando il seguente comando nel terminale:\n<pre><code class=\"language-bash\">echo \"deb http:\/\/apt.postgresql.org\/pub\/repos\/apt\/ bionic-pgdg main\" | sudo tee \/etc\/apt\/sources.list.d\/postgresql.list<\/code><\/pre>\n<\/li>\n<li>Aggiornate l&#8217;indice del repository digitando il seguente comando nel terminale:\n<pre><code class=\"language-bash\">sudo apt-get update<\/code><\/pre>\n<\/li>\n<li>Installate il pacchetto PostgreSQL usando il comando apt:\n<pre><code class=\"language-bash\">sudo apt-get install -y postgresql-10<\/code><\/pre>\n<\/li>\n<li>Infine, impostate la password per l&#8217;utente PostgreSQL con il seguente comando:\n<pre><code class=\"language-bash\">sudo passwd postgres<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>L&#8217;installazione di PostgreSQL \u00e8 obbligatoria sia per il server primario che per quello secondario prima di avviare il processo di replica di PostgreSQL.<\/p>\n<p>Una volta configurato PostgreSQL per entrambi i server, potete passare alla configurazione della replica del server primario e di quello secondario.<\/p>\n<h3>Impostazione della Replica nel Server Primario<\/h3>\n<p>Eseguite questi passaggi dopo aver installato PostgreSQL su entrambi i server primario e secondario.<\/p>\n<ol>\n<li>Per prima cosa, accedete al database PostgreSQL con il seguente comando:\n<pre><code class=\"language-bash\">su - postgres<\/code><\/pre>\n<\/li>\n<li>Create un utente di replica con il seguente comando:\n<pre><code class=\"language-bash\">psql -c \"CREATEUSER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD'YOUR_PASSWORD';\"<\/code><\/pre>\n<\/li>\n<li>Modificate il file <strong>pg_hba.cnf<\/strong> con qualsiasi applicazione nano in Ubuntu e aggiungete la seguente configurazione:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/pg_hba.conf<\/code><\/pre>\n<p>Per configurare il file, usate il seguente comando:<\/p>\n<pre><code class=\"language-bash\">host replication  replication  MasterIP\/24  md5<\/code><\/pre>\n<\/li>\n<li>Aprite e modificate <strong>postgresql.conf<\/strong> e inserite la seguente configurazione nel server primario:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/postgresql.conf<\/code><\/pre>\n<p>Usate le seguenti impostazioni di configurazione:<strong><br \/>\n<\/strong><\/p>\n<pre><code class=\"language-bash\">listen_addresses = 'localhost,MasterIP'\n<\/code><\/pre>\n<pre><code class=\"language-bash\">wal_level = replica\n<\/code><\/pre>\n<pre><code class=\"language-bash\">wal_keep_segments = 64\n<\/code><\/pre>\n<pre><code class=\"language-bash\">max_wal_senders = 10<\/code><\/pre>\n<\/li>\n<li>Infine, riavviate PostgreSQL nel server principale:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">systemctl restart postgresql<\/code><\/pre>\n<p>A questo punto avete completato l&#8217;installazione sul server primario.<\/p>\n<h3>Impostazione della Replica nel Server Secondario<\/h3>\n<p>Seguite questi passaggi per impostare la replica nel server secondario:<\/p>\n<ol>\n<li>Accedete a PostgreSQL RDMS con il comando seguente:\n<pre><code class=\"language-bash\">su - postgres<\/code><\/pre>\n<\/li>\n<li>Arrestate il servizio PostgreSQL cos\u00ec potete lavorare su di esso con il comando seguente:\n<pre><code class=\"language-bash\">systemctl stop postgresql<\/code><\/pre>\n<\/li>\n<li>Modificate il file <strong>pg_hba.conf<\/strong> con questo comando e aggiungete la seguente configurazione:\n<pre><code class=\"language-bash\">\/\/ \"Edit\" command\nnano \/etc\/postgresql\/10\/main\/pg_hba.conf\n\/\/ \"Configuration\" command\nhost replication  replication  MasterIP\/24  md5<\/code><\/pre>\n<\/li>\n<li>Aprite e modificate <strong>postgresql.conf<\/strong> nel server secondario e inserite la seguente configurazione o togliete il commento se \u00e8 commentata:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/postgresql.conf\nlisten_addresses = 'localhost,SecondaryIP'\nwal_keep_segments = 64\nwal_level = replica\nhot_standby = on\nmax_wal_senders = 10<\/code><\/pre>\n<p><code>SecondaryIP<\/code> \u00e8 l\u2019indirizzo del server secondario<\/li>\n<li>Accedete alla directory dei dati PostgreSQL nel server secondario e rimuovete tutto:\n<pre><code class=\"language-bash\">cd \/var\/lib\/postgresql\/10\/main\nrm -rfv *<\/code><\/pre>\n<\/li>\n<li>Copiate i file della directory dei dati del server primario PostgreSQL nella directory dei dati del server secondario PostgreSQL e scrivete questo comando nel server secondario:\n<pre><code class=\"language-bash\">pg_basebackup -h MasterIP -D \/var\/lib\/postgresql\/11\/main\/ -P -U\nreplication --wal-method=fetch<\/code><\/pre>\n<\/li>\n<li>Inserite la password del server primario PostgreSQL e premete invio. Successivamente, aggiungete il seguente comando per la configurazione di recupero:\n<pre><code class=\"language-bash\">\/\/ \"Edit\" Command\nnano \/var\/lib\/postgresql\/10\/main\/recovery.conf\n\/\/ Configuration\nstandby_mode   = 'on'\nprimary_conninfo = 'host=MasterIP port=5432 user=replication password=YOUR_PASSWORD'\ntrigger_file = '\/tmp\/MasterNow'<\/code><\/pre>\n<p>Qui, <code>YOUR_PASSWORD<\/code><span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\"> \u00e8 la password dell\u2019utente di replica nel server primario creato da PostgreSQL<\/span><\/li>\n<li>Una volta impostata la password, dovrete riavviare il database PostgreSQL secondario poich\u00e9 \u00e8 stato interrotto:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">systemctl start postgresql<\/code><\/pre>\n<h3>Verifica della Configurazione<\/h3>\n<p>Ora che abbiamo eseguito i passaggi, testiamo il processo di replica e osserviamo il database del server secondario. A tal fine, creiamo una tabella nel server primario e osserviamo se la stessa si riflette sul server secondario.<\/p>\n<p>Procediamo.<\/p>\n<ol>\n<li>Poich\u00e9 stiamo creando la tabella nel server primario, dovrete effettuare il login al server primario:\n<pre><code class=\"language-bash\">su - postgres\npsql<\/code><\/pre>\n<\/li>\n<li>Ora creiamo una semplice tabella denominata &#8220;testtable&#8221; e inseriamo i dati nella tabella eseguendo le seguenti query PostgreSQL nel terminale:\n<pre><code class=\"language-bash\">CREATE TABLE testtable (websites varchar(100));\nINSERT INTO testtable VALUES ('section.com');\nINSERT INTO testtable VALUES ('google.com');\nINSERT INTO testtable VALUES ('github.com');<\/code><\/pre>\n<\/li>\n<li>Osservate il database PostgreSQL del server secondario accedendo al server secondario:\n<pre><code class=\"language-bash\">su - postgres psql<\/code><\/pre>\n<\/li>\n<li>Ora verifichiamo se la tabella &#8216;testtable&#8217; esiste e possiamo restituire i dati eseguendo le seguenti query PostgreSQL nel terminale. Questo comando mostra essenzialmente l&#8217;intera tabella.\n<pre><code class=\"language-bash\">select * from testtable;<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Questo \u00e8 l&#8217;output della tabella di prova:<\/p>\n<pre><code class=\"language-bash\">|  websites  |\n\n-------------------\n\n| section.com |\n\n| google.com |\n\n| github.com  |\n\n--------------------<\/code><\/pre>\n<p>Dovreste poter osservare gli stessi dati del server primario.<\/p>\n<p>Se vedete quanto sopra, allora avete portato a termine con successo il processo di replica!<\/p>\n<h2>Quali Sono i Passaggi del Failover Manuale di PostgreSQL?<\/h2>\n<p>Esaminiamo i passaggi per un failover manuale di PostgreSQL:<\/p>\n<ol>\n<li>Crash del server principale.<\/li>\n<li>Promuovere il server standby eseguendo il seguente comando sul server standby:\n<pre><code class=\"language-bash\">.\/pg_ctl promote -D ..\/sb_data\/\nserver promoting<\/code><\/pre>\n<\/li>\n<li>Connesssione al server standby promosso e inserimento di una riga:\n<pre><code class=\"language-bash\">-bash-4.2$ .\/edb-psql -p 5432 edb\n\nPassword:\n\npsql.bin (10.7)\n\nType \"help\" <strong>for<\/strong> help.\n\nedb=# <strong>insert<\/strong> <strong>into<\/strong> abc <strong>values<\/strong>(4,'Four');\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Se l&#8217;inserimento funziona correttamente, allora lo standby, che in precedenza era un server di sola lettura, \u00e8 stato promosso a nuovo server primario.<\/p>\n<h2>Come Automatizzare il Failover in PostgreSQL<\/h2>\n<p>Impostare il failover automatico \u00e8 facile.<\/p>\n<p>Avrete bisogno del gestore di failover EDB PostgreSQL (EFM). Dopo aver scaricato e installato EFM su ogni nodo primario e standby, potete creare un cluster EFM, che consiste in un nodo primario, uno o pi\u00f9 nodi standby e un nodo Witness opzionale che conferma le asserzioni in caso di guasto.<\/p>\n<p>EFM monitora continuamente la salute del sistema e invia avvisi via email in base agli eventi del sistema. Quando si verifica un guasto, passa automaticamente allo standby pi\u00f9 aggiornato e riconfigura tutti gli altri server standby per riconoscere il nuovo nodo primario.<\/p>\n<p>Riconfigura anche i bilanciatori di carico (come pgPool) e impedisce che si verifichi lo &#8220;split-brain&#8221; (quando due nodi pensano di essere primari).<\/p>\n<h2>Riepilogo<\/h2>\n<p>A causa dell&#8217;elevata quantit\u00e0 di dati, la scalabilit\u00e0 e la sicurezza sono diventati due dei criteri pi\u00f9 importanti nella <a href=\"https:\/\/kinsta.com\/it\/hosting-wordpress\/dedicato\/\">gestione dei database<\/a>, soprattutto in un ambiente di transazioni. Sebbene sia possibile migliorare la scalabilit\u00e0 in senso verticale aggiungendo pi\u00f9 risorse\/hardware ai nodi esistenti, ci\u00f2 non \u00e8 sempre possibile, spesso a causa dei costi o dei limiti dell&#8217;aggiunta di nuovo hardware.<\/p>\n<p>Per questo motivo \u00e8 necessaria una scalabilit\u00e0 orizzontale, che significa aggiungere altri nodi ai nodi di rete esistenti piuttosto che migliorare le funzionalit\u00e0 dei nodi esistenti. \u00c8 qui che entra in gioco la replica di PostgreSQL.<\/p>\n\n<p>In questo articolo abbiamo parlato dei tipi di repliche PostgreSQL, dei vantaggi, delle modalit\u00e0 di replica, dell&#8217;installazione e del failover PostgreSQL tra SMR e MMR. Ora vogliamo sentiamo il vostro parere.<\/p>\n<p>Quale dei due sistemi usate di solito? Quale caratteristica del database \u00e8 pi\u00f9 importante per voi e perch\u00e9? Ci piacerebbe sapere cosa ne pensate! Ditecelo nella sezione commenti qui sotto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come vi dir\u00e0 chiunque possieda un sito, la perdita di dati e i tempi di inattivit\u00e0, anche in dosi minime, possono essere catastrofici. Possono colpire gli &#8230;<\/p>\n","protected":false},"author":117,"featured_media":59232,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[10885,25728,25854,25635],"topic":[26213],"class_list":["post-58941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-database","tag-databases","tag-postgresql","tag-sviluppo","topic-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Replica PostgreSQL: Guida Completa<\/title>\n<meta name=\"description\" content=\"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Replica PostgreSQL: Guida Completa\" \/>\n<meta property=\"og:description\" content=\"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-11T12:36:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-22T14:40:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Replica PostgreSQL: Guida Completa\",\"datePublished\":\"2022-08-11T12:36:48+00:00\",\"dateModified\":\"2023-02-22T14:40:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\"},\"wordCount\":4534,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\",\"keywords\":[\"database\",\"databases\",\"PostgreSQL\",\"sviluppo\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\",\"name\":\"Replica PostgreSQL: Guida Completa\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\",\"datePublished\":\"2022-08-11T12:36:48+00:00\",\"dateModified\":\"2023-02-22T14:40:26+00:00\",\"description\":\"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png\",\"width\":1460,\"height\":730,\"caption\":\"Replica PostgreSQL: Guida Completa\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Replica PostgreSQL: Guida Completa\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Replica PostgreSQL: Guida Completa","description":"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/","og_locale":"it_IT","og_type":"article","og_title":"Replica PostgreSQL: Guida Completa","og_description":"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.","og_url":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2022-08-11T12:36:48+00:00","article_modified_time":"2023-02-22T14:40:26+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Salman Ravoof","Tempo di lettura stimato":"24 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Replica PostgreSQL: Guida Completa","datePublished":"2022-08-11T12:36:48+00:00","dateModified":"2023-02-22T14:40:26+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/"},"wordCount":4534,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","keywords":["database","databases","PostgreSQL","sviluppo"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/","url":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/","name":"Replica PostgreSQL: Guida Completa","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","datePublished":"2022-08-11T12:36:48+00:00","dateModified":"2023-02-22T14:40:26+00:00","description":"Scopri gli aspetti principali della replica con PostgreSQL: vantaggi, elementi, tipi e strategie per un backup dei dati senza interruzioni.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/replica-postgresql.png","width":1460,"height":730,"caption":"Replica PostgreSQL: Guida Completa"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/replica-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinsta.com\/it\/argomenti\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Replica PostgreSQL: Guida Completa"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/58941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=58941"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/58941\/revisions"}],"predecessor-version":[{"id":65552,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/58941\/revisions\/65552"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/jp"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/translations\/dk"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58941\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/59232"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=58941"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=58941"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=58941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}