Progetto

Generale

Profilo

PostgresStreamReplication » Cronologia » Versione 2

Simone Piccardi, 19-02-2020 17:06

1 1 Simone Piccardi
h1. Replicazione di PostgresSQL
2
3
*ATTENZIONE*: questo articolo è una bozza, al momento è nello stato di insieme di appunti sparsi senza un'ordine specifico
4
5
PostgreSQL supporta diversi meccanismi di replicazione, tratteremo in questo articolo solo uno di questi, la cosiddetta _streaming replication_. 
6
7
8
h2. Come ripristinare una replica
9
10
Se per un qualunque motivo la _streaming replication_ si interrompe (la ragione più comune è che non si è previsto sul primario la retention di un sufficiente numero di segmenti WAL a coprire le differenze da trasmettere al secondario) occorre ripristinare manualmente da zero la stessa.
11
12
Per farlo è disponibile, a partire dalla versione 9.4 di PostgreSQL il comando @pg_basebackup@ (si legga la documentazione su https://www.postgresql.org/docs/10/app-pgbasebackup.html) che consente di eseguire il ripristino direttamente dal secondario. I passi da seguire per farlo sono i seguenti:
13
14 2 Simone Piccardi
* fermare Postgres con:
15 1 Simone Piccardi
<pre>
16
service postgresql stop
17
</pre>
18
* vuotare la directory dei dati (o spostarne i contenuti altrove):
19
<pre>
20
mkdir oldpgdir/
21
mv /var/lib/postgresql/9.6/main/* oldpgdir/
22
</pre>
23
* collegarsi con l'utente postgres:
24
<pre>
25
su postgres
26
</pre>
27
* ripristinare il DB e la replicazione con:
28
<pre>
29
pg_basebackup -h IP.DEL.DB.MASTER -U replication -D /var/lib/postgresql/9.6/main/ -P -Xs -R
30
</pre>
31
quest'ultimo comando chiederà la password dell'utente @replication@ usato per gestire la replicazione e provvederà alla ricostruzione.
32 2 Simone Piccardi
* riavviare Postgres con:
33
<pre>
34
service postgresql start
35
</pre>
36
37
h2. Verifica dello stato della replicazione
38
39
Ci sono una serie di comandi per verificare lo stato della replicazione. Anzitutto si vada sullo slave e si verifichi che sia in standby  mode con (si assume di essere entrati in visualizzazione espansa con @\x on@):
40
41
<pre>
42
-[ RECORD 1 ]-----+--
43
pg_is_in_recovery | t
44
</pre> 
45
46
si può controllare lo stato della ricezione dei dati dal master (da postgres 9.6) con:
47
48
<pre>
49
postgres=# select * from pg_stat_wal_receiver;
50
-[ RECORD 1 ]---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
51
pid                   | 25684
52
status                | streaming
53
receive_start_lsn     | 7E/57000000
54
receive_start_tli     | 1
55
received_lsn          | 7E/58B33BA8
56
received_tli          | 1
57
last_msg_send_time    | 2020-02-19 17:57:20.239628+01
58
last_msg_receipt_time | 2020-02-19 17:57:20.238761+01
59
latest_end_lsn        | 7E/58B33BA8
60
latest_end_time       | 2020-02-19 17:57:20.239628+01
61
slot_name             | 
62
conninfo              | user=replication password=******** ....
63
</pre>
64
65
e si può controllare quanto è passato dall'ultimo replay della replicazione con con:
66
67
<pre>
68
postgres=# select now()-pg_last_xact_replay_timestamp();
69
-[ RECORD 1 ]------------
70
?column? | 00:00:05.55037
71
</pre>
72
73
e dare una indicazione dell'eventuale ritardo rispetto al master con:
74
75
<pre>
76
postgres=# SELECT CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location()
77
                  THEN 0
78
                ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())
79
              END AS log_delay;
80
-[ RECORD 1 ]
81
log_delay | 0
82
</pre>