02) WAL replication Master Slave

Created mercredi 17 février 2016

Objectif

Maintenir la diponibilité d'une base par réplication continu, ainsi que l'unicité des données.

Besoin

2 systèmes d'architecture identique.
2 base de même langage, et version.(9.X)
Ici un premier serveur qui sera le MASTER celui qui heberge odoo

1 postgres@srv-odoo:~$ psql
2 psql (9.5.1, serveur 9.4.6)
3 Saisissez « help » pour l aide.
4 
5 postgres=# \l
6 								  Liste des bases de données
7 	Nom    | Propriétaire | Encodage | Collationnement | Type caract. |    Droits d accès     
8 -----------+--------------+----------+-----------------+--------------+-----------------------
9  odoo      | odoo         | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =Tc/odoo             +
10 		   |              |          |                 |              | odoo=CTc/odoo
11  postgres  | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | 
12  template0 | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =c/postgres          +
13 		   |              |          |                 |              | postgres=CTc/postgres
14  template1 | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =c/postgres          +
15 		   |              |          |                 |              | postgres=CTc/postgres
16  tsgeri    | odoo         | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | 
17 (5 lignes)
18 
19 postgres=# 

Ici le second qui fera office de SLAVE

1 postgres@tpsql:~$ psql
2 psql (9.5.1, serveur 9.4.6)
3 Saisissez « help » pour l aide.
4 
5 postgres=# \l
6 								   Liste des bases de données
7 	 Nom      | Propriétaire | Encodage | Collationnement | Type caract. |    Droits d accès     
8 --------------+--------------+----------+-----------------+--------------+-----------------------
9  centralivres | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =CTc/postgres        +
10 			  |              |          |                 |              | postgres=CTc/postgres
11  jarvis       | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | 
12  postgres     | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | 
13  template0    | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =c/postgres          +
14 			  |              |          |                 |              | postgres=CTc/postgres
15  template1    | postgres     | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | =c/postgres          +
16 			  |              |          |                 |              | postgres=CTc/postgres
17  test2        | xtbushido    | UTF8     | fr_FR.UTF-8     | fr_FR.UTF-8  | 
18 (6 lignes)
19 
20 postgres=# 

Principe

Master/slave

Quand le Master reçoit une requête SQL, les modifications de données sont enregistrées dans des journaux de transactions : les WAL (Write-Ahead Log) xlogs.
Les journaux sont transférés au Slave (log shipping) qui "rejoue" les transactions en continue, pour etre dans le même "état" que le Master.

Cela permet au Slave de prendre la relève du Master en cas de défaillance, le Slave est alors en "Stand-bye" .
Le "Slave" peut également répondre à des requête en lecture only, si il est configuré en "Hot Stand-Bye"

C'est une réplication "Asynchrone" dut à la latence entre les commit des transactions sur le Master et la réplication sur le Slave.

La version 9.0 de postgres à apporté une amélioration certaine du temps de traitement, avec le "Streaming replication", car les fichiers "WAL" font 16MO et cette fonction de streaming permet l'envoie de les envoyer sans attendre
qu'il ne soit rempli dans son intégralité, les WAL sont transmis en en continu par une connexion SSL dédié.

Configuration Master et Slave

Stoppez
Nous allons modifier le fichier:
/etc/postgresql/9.X/main/postgresql.conf
en décommentant les lignes suivante, et de modifier les valeurs si nécessaire, et ce sur les 2 serveurs. Certaines valeurs ne sont pas forcément utile, toutefois cela permettra de basculer la configuration plus facilement en cas de crash total du serveur.

1 #------------------------------------------------------------------------------
2 # WRITE AHEAD LOG
3 #------------------------------------------------------------------------------
4 
5 # - Settings -
6 
7 wal_level = hot_stanby                  # minimal, archive, hot_standby, or logical 
8 
9 # - Checkpoints -
10 checkpoint_segments = 8         		# in logfile segments, min 1, 16MB each
11 #------------------------------------------------------------------------------
12 # REPLICATION
13 #------------------------------------------------------------------------------
14 
15 # - Sending Server(s) -
16 
17 # Set these on the master and on any standby that will send replication data.
18 
19 max_wal_senders = 1            			# max number of walsender processes
20 
21 wal_keep_segments = 256         		# in logfile segments, 16MB each; 0 disables  ici conserve 2556 xlogx
22 
23 # - Standby Servers -
24 
25 # These settings are ignored on a master server.
26 
27 hot_standby = on                        # "on" allows queries during recovery
28 
29 
30 autovacuum = on							# Enable autovacuum subprocess?  'on'

Le wal_level correspond au niveau de richesse des informations sauvegardées dans les WAL.
Le Hot_standby permet au slave de répondre aux requête en lecture.

En cas d'indisponibilité du Slave, les WAL risquent de s'accumuler et de provoquer une erreur au démarrage.

Configuration MASTER

Création de l'utilisateur replication au sein du serveur srv-odoo.

1 sudo -u postgres psql -c "CREATE USER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'MOT2PASSE';"

Réplication

Dans /etc/postgres/9.X/main/pg_hba.conf modifier la partie réplication, dernière partie du fichier.
Ici le MASTER (srv-odoo: 172.25.3.63) vers le SLAVE (tpsql: 172.25.3.70),

1 hostssl replication     replication     172.25.3.70/32          md5

Configuration SLAVE