Blog scientifique, technologique, environnemental et politique de Nicolas HAHN - Mot-clé - multi master replication<p>Je suis susceptible de poster ici mes réflexions, mes humeurs, mes idées, mes coups de gueule... dans les domaines scientifiques, technologiques, environnementaux et politiques que j'affectionne. Et pour ce qui est des domaines scientifiques et technologiques, ils sont nombreux. Pour ce qui est de la politique, je pense que je vais beaucoup m'amuser au jeu du "Moi Président". Ce blog est hébergé par mes propres moyens. Cela veut dire que le roi ici c'est moi, et que je me réserve le droit de modérer tout commentaire posté sur mon blog comme je l'entends :-)</p>2023-12-16T15:12:19+01:00Nicolas HAHNurn:md5:491b5824fd8022ad3eb532e839e2445dDotclearPostgreSQL 9.4 Multi Master Replication (MMR)urn:md5:94f6d2e25a91510227c3c2cd659da1342015-08-09T09:09:00+02:002017-02-18T16:49:51+01:00Nicolas HAHNTechnologies2ndquadrantLinuxmmrmulti master replicationpostgresql<p>Une fois n'est pas coutume, j'ai envie aujourd'hui de vous parler d'une base de données que j'adore et que j'utilise depuis 1999 (plus de 15 ans déjà!), notamment dans mes propres projets Open Source comme <strong>X-Itools ELSE</strong>, et aussi pour mes clients en hosting de bases de données. Il s'agit de <strong>PostgreSQL</strong>, dans sa <strong>version 9.4</strong>, et on va voir ensemble comment utiliser cette base très professionnelle - souvent comparée à Oracle - dans un contexte <strong>MMR</strong>, c'est à dire en <strong>Multi Master Replication</strong>.</p> <p>Depuis longtemps, <a href="http://www.postgresql.org" hreflang="en" title="Site officiel PostgreSQL">PostgreSQL</a> bénéficie d'outils annexes permettant de gérer la réplication entre plusieurs noeuds, comme Slony-I ou encore Bucardo par exemple. Puis des possibilités de réplication ont été intégrées directement au niveau du moteur de la base, toujours plus complètes et performantes. Ces différents systèmes de réplication logique ou physique ont tous leurs avantages et leurs contraintes ou inconvénients.</p>
<p>Ainsi, le fait d'utiliser des outils externes imposant plus de contraintes de gestion pouvait rendre l'administration du système de données plus compliquée. Ces outils pouvaient aussi imposer plus de stress sur la base de données, de par l'utilisation de triggers, impactant le taux d'écriture sur les bases puisque les multipliant par un facteur 4.</p>
<p>Les efforts de développement sur PostgreSQL lui-même ont apporté la <strong>réplication maitre-esclave</strong>, le <strong>Hot-Standby</strong>, puis la <strong>réplication en cascade</strong>, l'inconvénient principal étant qu'à un instant T, un seul membre du système global fonctionne en lecture-écriture, tous les autres, les esclaves, fonctionnant au mieux en lecture seule.</p>
<p>Ce que tous ces différents systèmes ont en commun, c'est qu'ils n'ont jamais apporté de capacités de <strong>Multi Master Replication (MMR)</strong> performantes, réelles et sérieuses. C'est à dire la possibilité d'écrire et de lire sur tous les noeuds en même temps.</p>
<p>Depuis la branche de version 9.X de PostgreSQL, surtout depuis la <strong>version 9.4</strong> d'ailleurs, ceci a changé, sous l'impulsion de la société <a href="http://2ndquadrant.com/fr/" hreflang="fr" title="Site web officiel de 2ndQuadrant">2ndQuadrant</a>, dont ses membres sont de forts contributeurs au code source de PostgreSQL. 2ndQuadrant travaille beaucoup sur les projets <strong>UDR</strong> (Uni-Directionnal Replication) et <strong>BDR</strong> (Bi-Directionnal Replication). Ces projets sont des extensions de PostgreSQL. Et BDR est l'extension qui nous intéresse ici aujourd'hui car c'est celle qui permet enfin le <strong><a href="http://2ndquadrant.com/en/resources/bdr/bdr-performance/" hreflang="en" title="Performances de BDR comparées à d'autres solutions">MMR performant pour PostgreSQL</a></strong>.</p>
<p>Je vous propose de m'accompagner dans la découverte et l'installation d'une infrastructure PostgreSQL MMR, sous la forme d'un petit lab ou POC (Proof Of Concept), dans la suite de cet article.</p>
<h1> </h1>
<h1>PostgreSQL 9.4 MMR: architecture du LAB.</h1>
<p>Le but du lab est d'installer <strong>deux noeuds PostgreSQL 9.4 en MMR sur deux serveurs distincts</strong>. Pour cela, si vous êtes un geek fou comme moi, vous aurez surement dans votre bureau, à côté de votre lit cela va sans dire, une pile de serveurs disponibles sur lesquels on va installer tout ce qu'il nous faut, comme montré ci-dessous :-)</p>
<p><img alt="lab_pgsql_mmr_01.jpg" class="media" src="http://blog.erios.org/public/lab_pgsql_mmr_01.jpg" style="margin: 0 auto; display: block;" title="lab_pgsql_mmr_01.jpg, août 2015" /></p>
<p> </p>
<p><u>Les caractéristiques techniques du lab:</u></p>
<ul>
<li>Tous les serveurs fonctionnent sous <strong>Linux CentOS 7 x86_64</strong></li>
<li>Réseau: <strong>192.168.178.0/24</strong></li>
<li>Serveur 1: utilisé en tant que station cliente - 16 Go RAM, 8 CPU cores. IP: <strong>192.168.178.21</strong>/24</li>
<li>Serveur 2: 1er noeud PostgreSQL 9.4 BDR - 2 Go RAM, 2 CPU cores. IP: <strong>192.168.178.29</strong>/24</li>
<li>Serveur 3: 2ème noeud PostgreSQL 9.4 BDR - 2 Go RAM, 2 CPU cores. IP: <strong>192.168.178.30</strong>/24</li>
</ul>
<p>Notez que vous pouvez tout à fait réaliser ce lab sur une seule machine physique, avec des machines virtuelles. Dans ce cas, le Serveur 1 est le serveur hôte, et les deux noeuds PostgreSQL sont deux machines virtuelles, par exemple.</p>
<p><strong>Voilà ce que cela donne au niveau architecture type Visio:</strong></p>
<p><img alt="PostgresArchDesign.png" class="media" src="http://blog.erios.org/public/PostgresArchDesign.png" style="margin: 0 auto; display: block;" title="PostgresArchDesign.png, août 2015" /></p>
<h2>Etapes préliminaires à l'installation des serveurs.</h2>
<p><em>Notez que dans le respect d'un principe de clarté, je vais reproduire ta totalité des sorties écran pour chaque commande utilisée, dans les sections de code de mon article. Les commandes à entrer sont <strong>en noir</strong> pour qu'elles soient mieux visibles dans tout le flot de texte, qui lui est <strong><span style="color:#B22222;">en marron</span></strong>.</em></p>
<p>Comme on a pas du tout envie d'être embêté par SELinux ou par FirewallD sur CentOS 7 dans le cadre de ce lab, on va déjà commencer par désactiver tout ça. A ne pas faire en PROD bien entendu! Pour ce faire, <u>sur chaque serveur</u>, effectuez les actions suivantes:</p>
<p>Commencez par éditer le fichier <strong>/etc/sysconfig/selinux</strong> pour qu'il ressemble à celui représenté ci-dessous. La ligne qui nous intéresse est <strong>SELINUX=permissive</strong> (ou disabled). Une fois ceci fait, rebootez vos serveurs:</p>
<p><span style="color:#B22222;"><code># This file controls the state of SELinux on the system.<br />
# SELINUX= can take one of these three values:<br />
# enforcing - SELinux security policy is enforced.<br />
# permissive - SELinux prints warnings instead of enforcing.<br />
# disabled - No SELinux policy is loaded.<br />
SELINUX=</code></span><code>permissive</code><br />
<span style="color:#B22222;"><code># SELINUXTYPE= can take one of these two values:<br />
# targeted - Targeted processes are protected,<br />
# minimum - Modification of targeted policy. Only selected processes are protected.<br />
# mls - Multi Level Security protection.<br />
SELINUXTYPE=targeted</code></span></p>
<p> </p>
<p>Ensuite pour désactiver FirewallD définitivement, par exemple sur Serveur1:</p>
<p><code><span style="color:#B22222;">[root@serveur1 ~]#</span> <strong>systemctl stop firewalld</strong><br />
<span style="color:#B22222;">[root@serveur1 ~]#</span> <strong>systemctl disable firewalld</strong></code></p>
<p> </p>
<p>Maintenant, nous avons besoin pour l'installation, sur chacun de nos serveurs, de dépôts YUM spécifiques tels que:</p>
<ul>
<li>le dépôt EPEL</li>
<li>le dépôt PostgreSQL officiel</li>
<li>le dépôt 2ndQuadrant</li>
</ul>
<p>Voici comment installer ces dépôts:</p>
<p><code><span style="color:#B22222;">[root@serveur1 ~]#</span> <strong>yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror<br />
epel-release-latest-7.noarch.rpm | 14 kB 00:00:00 <br />
Examen de /var/tmp/yum-root-P5ogTu/epel-release-latest-7.noarch.rpm : epel-release-7-5.noarch<br />
Sélection de /var/tmp/yum-root-P5ogTu/epel-release-latest-7.noarch.rpm pour installation<br />
Résolution des dépendances<br />
--> Lancement de la transaction de test<br />
---> Le paquet epel-release.noarch 0:7-5 sera installé<br />
--> Résolution des dépendances terminée</span></code></p>
<p><span style="color:#B22222;"><code>Dépendances résolues</code></span></p>
<p><span style="color:#B22222;"><code>======================================================================================================================<br />
Package Architecture Version Dépôt Taille<br />
======================================================================================================================<br />
Installation :<br />
epel-release noarch 7-5 /epel-release-latest-7.noarch 24 k</code></span></p>
<p><span style="color:#B22222;"><code>Résumé de la transaction<br />
======================================================================================================================<br />
Installation 1 Paquet</code></span></p>
<p><span style="color:#B22222;"><code>Taille totale : 24 k<br />
Taille d'installation : 24 k<br />
Downloading packages:<br />
Running transaction check<br />
Running transaction test<br />
Transaction test succeeded<br />
Running transaction<br />
Installation : epel-release-7-5.noarch 1/1<br />
Vérification : epel-release-7-5.noarch 1/1</code></span></p>
<p><span style="color:#B22222;"><code>Installé :<br />
epel-release.noarch 0:7-5 </code></span></p>
<p><code><span style="color:#B22222;">Terminé !<br />
[root@serveur1 ~]#</span> <strong>yum -y install http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror<br />
pgdg-centos94-9.4-1.noarch.rpm | 5.2 kB 00:00:00 <br />
Examen de /var/tmp/yum-root-P5ogTu/pgdg-centos94-9.4-1.noarch.rpm : pgdg-centos94-9.4-1.noarch<br />
Sélection de /var/tmp/yum-root-P5ogTu/pgdg-centos94-9.4-1.noarch.rpm pour installation<br />
Résolution des dépendances<br />
--> Lancement de la transaction de test<br />
---> Le paquet pgdg-centos94.noarch 0:9.4-1 sera installé<br />
--> Résolution des dépendances terminée</span></code></p>
<p><span style="color:#B22222;"><code>Dépendances résolues</code></span></p>
<p><span style="color:#B22222;"><code>======================================================================================================================<br />
Package Architecture Version Dépôt Taille<br />
======================================================================================================================<br />
Installation :<br />
pgdg-centos94 noarch 9.4-1 /pgdg-centos94-9.4-1.noarch 2.1 k</code></span></p>
<p><span style="color:#B22222;"><code>Résumé de la transaction<br />
======================================================================================================================<br />
Installation 1 Paquet</code></span></p>
<p><span style="color:#B22222;"><code>Taille totale : 2.1 k<br />
Taille d'installation : 2.1 k<br />
Downloading packages:<br />
Running transaction check<br />
Running transaction test<br />
Transaction test succeeded<br />
Running transaction<br />
Installation : pgdg-centos94-9.4-1.noarch 1/1<br />
Vérification : pgdg-centos94-9.4-1.noarch 1/1</code></span></p>
<p><span style="color:#B22222;"><code>Installé :<br />
pgdg-centos94.noarch 0:9.4-1 </code></span></p>
<p><code><span style="color:#B22222;">Terminé !<br />
[root@serveur1 ~]#</span> <strong>yum -y install http://packages.2ndquadrant.com/postgresql-bdr94-2ndquadrant/yum-repo-rpms/postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror<br />
postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm | 4.5 kB 00:00:00 <br />
Examen de /var/tmp/yum-root-P5ogTu/postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm : postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch<br />
Sélection de /var/tmp/yum-root-P5ogTu/postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm pour installation<br />
Résolution des dépendances<br />
--> Lancement de la transaction de test<br />
---> Le paquet postgresql-bdr94-2ndquadrant-redhat.noarch 0:1.0-2 sera installé<br />
--> Résolution des dépendances terminée</span></code></p>
<p><span style="color:#B22222;"><code>Dépendances résolues</code></span></p>
<p><span style="color:#B22222;"><code>======================================================================================================================<br />
Package Architecture<br />
Version Dépôt Taille<br />
======================================================================================================================<br />
Installation :<br />
postgresql-bdr94-2ndquadrant-redhat noarch 1.0-2 /postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch 2.2 k</code></span></p>
<p><span style="color:#B22222;"><code>Résumé de la transaction<br />
======================================================================================================================<br />
Installation 1 Paquet</code></span></p>
<p><span style="color:#B22222;"><code>Taille totale : 2.2 k<br />
Taille d'installation : 2.2 k<br />
Downloading packages:<br />
Running transaction check<br />
Running transaction test<br />
Transaction test succeeded<br />
Running transaction<br />
Installation : postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch 1/1<br />
Vérification : postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch 1/1</code></span></p>
<p><span style="color:#B22222;"><code>Installé :<br />
postgresql-bdr94-2ndquadrant-redhat.noarch 0:1.0-2 </code></span></p>
<p><span style="color:#B22222;"><code>Terminé !<br />
[root@serveur1 ~]#</code></span></p>
<h2> </h2>
<h2>Installation des deux noeuds PostgreSQL</h2>
<p>Maintenant que nos dépôts sont configurés sur nos serveurs, nous allons pouvoir installer les packages RPM de PostgreSQL 9.4, <strong>ceux spécifiquement conçus par 2ndquadrant</strong> et qui contiennent l'extension BDR.</p>
<p><u>Pour cela, sur Serveur2 et Serveur3, effectuez les étapes suivantes:</u></p>
<p><code><span style="color:#B22222;">[root@serveur2 ~]#</span> <strong>yum check-update</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror<br />
epel/x86_64/metalink | 23 kB 00:00:00 <br />
epel | 4.4 kB 00:00:00 <br />
pgdg94 | 3.6 kB 00:00:00 <br />
postgresql-bdr94-2ndquadrant-redhat | 3.0 kB 00:00:00 <br />
(1/5): postgresql-bdr94-2ndquadrant-redhat/7/x86_64/primary_db | 40 kB 00:00:00 <br />
(2/5): epel/x86_64/group_gz | 169 kB 00:00:00 <br />
(3/5): pgdg94/7/x86_64/group_gz | 331 B 00:00:00 <br />
(4/5): pgdg94/7/x86_64/primary_db | 155 kB 00:00:01 <br />
(5/5): epel/x86_64/primary_db | 3.7 MB 00:00:01 <br />
(1/2): epel/x86_64/updateinfo | 454 kB 00:00:00 <br />
(2/2): epel/x86_64/pkgtags | 1.6 MB 00:00:00 <br />
Loading mirror speeds from cached hostfile<br />
* base: mirror.dclux.com<br />
* epel: ftp.nluug.nl<br />
* extras: mirror.dclux.com<br />
* updates: mirror.dclux.com<br />
[root@serveur2 ~]#</span> <strong>yum -y install postgresql-bdr94-bdr</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror<br />
Loading mirror speeds from cached hostfile<br />
* base: mirror.dclux.com<br />
* epel: mirror.nl.leaseweb.net<br />
* extras: mirror.dclux.com<br />
* updates: mirror.dclux.com<br />
Résolution des dépendances<br />
--> Lancement de la transaction de test<br />
---> Le paquet postgresql-bdr94-bdr.x86_64 0:0.9.2-1_2ndQuadrant.el7.centos sera installé<br />
--> Traitement de la dépendance : postgresql-bdr94(x86-64) >= 9.4.4_bdr1 pour le paquet : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : postgresql-bdr94-contrib(x86-64) >= 9.4.4_bdr1 pour le paquet : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : postgresql-bdr94-server(x86-64) >= 9.4.4_bdr1 pour le paquet : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : libpq.so.5()(64bit) pour le paquet : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64<br />
--> Lancement de la transaction de test<br />
---> Le paquet postgresql-bdr94.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
---> Le paquet postgresql-bdr94-contrib.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
--> Traitement de la dépendance : libxslt.so.1(LIBXML2_1.0.11)(64bit) pour le paquet : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : libxslt.so.1(LIBXML2_1.0.18)(64bit) pour le paquet : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : libxslt.so.1(LIBXML2_1.0.22)(64bit) pour le paquet : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64<br />
--> Traitement de la dépendance : libxslt.so.1()(64bit) pour le paquet : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64<br />
---> Le paquet postgresql-bdr94-libs.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
---> Le paquet postgresql-bdr94-server.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
--> Lancement de la transaction de test<br />
---> Le paquet libxslt.x86_64 0:1.1.28-5.el7 sera installé<br />
--> Résolution des dépendances terminée</span></code></p>
<p><span style="color:#B22222;"><code>Dépendances résolues</code></span></p>
<p><span style="color:#B22222;"><code>======================================================================================================================<br />
Package Architecture<br />
Version Dépôt Taille<br />
======================================================================================================================<br />
Installation :<br />
postgresql-bdr94-bdr x86_64 0.9.2-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 255 k<br />
Installation pour dépendances :<br />
libxslt x86_64 1.1.28-5.el7 base 242 k<br />
postgresql-bdr94 x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 1.0 M<br />
postgresql-bdr94-contrib x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 607 k<br />
postgresql-bdr94-libs x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 204 k<br />
postgresql-bdr94-server x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 4.0 M</code></span></p>
<p><span style="color:#B22222;"><code>Résumé de la transaction<br />
======================================================================================================================<br />
Installation 1 Paquet (+5 Paquets en dépendance)</code></span></p>
<p><span style="color:#B22222;"><code>Taille totale des téléchargements : 6.3 M<br />
Taille d'installation : 27 M<br />
Downloading packages:<br />
(1/6): postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64.rpm | 255 kB 00:00:00 <br />
(2/6): postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 607 kB 00:00:00 <br />
(3/6): postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 1.0 MB 00:00:00 <br />
(4/6): postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 204 kB 00:00:00 <br />
(5/6): postgresql-bdr94-server-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 4.0 MB 00:00:01 <br />
(6/6): libxslt-1.1.28-5.el7.x86_64.rpm | 242 kB 00:00:05 <br />
----------------------------------------------------------------------------------------------------------------------<br />
Total 1.2 MB/s | 6.3 MB 00:00:05 <br />
Running transaction check<br />
Running transaction test<br />
Transaction test succeeded<br />
Running transaction<br />
Installation : postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 1/6<br />
Installation : postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 2/6<br />
Installation : postgresql-bdr94-server-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 3/6<br />
Installation : libxslt-1.1.28-5.el7.x86_64 4/6<br />
Installation : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 5/6<br />
Installation : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64 6/6<br />
Vérification : postgresql-bdr94-bdr-0.9.2-1_2ndQuadrant.el7.centos.x86_64 1/6<br />
Vérification : postgresql-bdr94-server-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 2/6<br />
Vérification : postgresql-bdr94-contrib-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 3/6<br />
Vérification : libxslt-1.1.28-5.el7.x86_64 4/6<br />
Vérification : postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 5/6<br />
Vérification : postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 6/6</code></span></p>
<p><span style="color:#B22222;"><code>Installé :<br />
postgresql-bdr94-bdr.x86_64 0:0.9.2-1_2ndQuadrant.el7.centos </code></span></p>
<p><span style="color:#B22222;"><code>Dépendances installées :<br />
libxslt.x86_64 0:1.1.28-5.el7 <br />
postgresql-bdr94.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos <br />
postgresql-bdr94-contrib.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos <br />
postgresql-bdr94-libs.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos <br />
postgresql-bdr94-server.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos </code></span></p>
<p><span style="color:#B22222;"><code>Terminé !<br />
[root@serveur2 ~]#</code></span></p>
<h2> </h2>
<h2>Installation de notre client</h2>
<p>Nous allons utiliser le Serveur1 en tant que client. Nous considérons que celui-ci a été installé avec l'intreface graphique KDE au préalable. On va donc installer sur ce dernier, uniquement le client PSQL ainsi que l'interface d'administration graphique pour PostgreSQL: PGAdmin3.</p>
<p><u>Entrez les commandes suivantes sur Serveur1:</u></p>
<p><code><span style="color:#B22222;">[root@serveur1 ~]#</span> <strong>yum -y install postgresql-bdr94 pgadmin3_94</strong><br />
<span style="color:#B22222;">Modules complémentaires chargés : fastestmirror, langpacks<br />
Loading mirror speeds from cached hostfile<br />
* base: mirror.dclux.com<br />
* epel: ftp.nluug.nl<br />
* extras: mirror.dclux.com<br />
* updates: mirror.dclux.com<br />
Résolution des dépendances<br />
--> Lancement de la transaction de test<br />
---> Le paquet pgadmin3_94.x86_64 0:1.20.0-3.rhel7 sera installé<br />
--> Traitement de la dépendance : wxGTK pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_xrc-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_stc-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_html-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_core-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_aui-2.8.so.0(WXU_2.8.5)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_aui-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_adv-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu_xml-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu_net-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu-2.8.so.0(WXU_2.8.5)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu-2.8.so.0(WXU_2.8)(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_xrc-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_stc-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_html-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_core-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_aui-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_gtk2u_adv-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu_xml-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu_net-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libwx_baseu-2.8.so.0()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
--> Traitement de la dépendance : libpq.so.5()(64bit) pour le paquet : pgadmin3_94-1.20.0-3.rhel7.x86_64<br />
---> Le paquet postgresql-bdr94.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
--> Lancement de la transaction de test<br />
---> Le paquet postgresql-bdr94-libs.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos sera installé<br />
---> Le paquet wxBase.x86_64 0:2.8.12-13.el7 sera installé<br />
---> Le paquet wxGTK.x86_64 0:2.8.12-13.el7 sera installé<br />
--> Résolution des dépendances terminée</span></code></p>
<p><span style="color:#B22222;"><code>Dépendances résolues</code></span></p>
<p><span style="color:#B22222;"><code>======================================================================================================================<br />
Package Architecture<br />
Version Dépôt Taille<br />
======================================================================================================================<br />
Installation :<br />
pgadmin3_94 x86_64 1.20.0-3.rhel7 pgdg94 3.2 M<br />
postgresql-bdr94 x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 1.0 M<br />
Installation pour dépendances :<br />
postgresql-bdr94-libs x86_64 9.4.4_bdr1-1_2ndQuadrant.el7.centos postgresql-bdr94-2ndquadrant-redhat 204 k<br />
wxBase x86_64 2.8.12-13.el7 epel 587 k<br />
wxGTK x86_64 2.8.12-13.el7 epel 3.0 M</code></span></p>
<p><span style="color:#B22222;"><code>Résumé de la transaction<br />
======================================================================================================================<br />
Installation 2 Paquets (+3 Paquets en dépendance)</code></span></p>
<p><span style="color:#B22222;"><code>Taille totale des téléchargements : 8.0 M<br />
Taille d'installation : 33 M<br />
Downloading packages:<br />
(1/5): postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 204 kB 00:00:00 <br />
(2/5): postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64.rpm | 1.0 MB 00:00:00 <br />
(3/5): wxBase-2.8.12-13.el7.x86_64.rpm | 587 kB 00:00:00 <br />
(4/5): wxGTK-2.8.12-13.el7.x86_64.rpm | 3.0 MB 00:00:00 <br />
(5/5): pgadmin3_94-1.20.0-3.rhel7.x86_64.rpm | 3.2 MB 00:00:03 <br />
----------------------------------------------------------------------------------------------------------------------<br />
Total 2.2 MB/s | 8.0 MB 00:00:03 <br />
Running transaction check<br />
Running transaction test<br />
Transaction test succeeded<br />
Running transaction<br />
Installation : postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 1/5<br />
Installation : wxBase-2.8.12-13.el7.x86_64 2/5<br />
Installation : wxGTK-2.8.12-13.el7.x86_64 3/5<br />
Installation : pgadmin3_94-1.20.0-3.rhel7.x86_64 4/5<br />
Installation : postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 5/5<br />
Vérification : wxBase-2.8.12-13.el7.x86_64 1/5<br />
Vérification : postgresql-bdr94-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 2/5<br />
Vérification : wxGTK-2.8.12-13.el7.x86_64 3/5<br />
Vérification : pgadmin3_94-1.20.0-3.rhel7.x86_64 4/5<br />
Vérification : postgresql-bdr94-libs-9.4.4_bdr1-1_2ndQuadrant.el7.centos.x86_64 5/5</code></span></p>
<p><span style="color:#B22222;"><code>Installé :<br />
pgadmin3_94.x86_64 0:1.20.0-3.rhel7 postgresql-bdr94.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos </code></span></p>
<p><span style="color:#B22222;"><code>Dépendances installées :<br />
postgresql-bdr94-libs.x86_64 0:9.4.4_bdr1-1_2ndQuadrant.el7.centos wxBase.x86_64 0:2.8.12-13.el7 <br />
wxGTK.x86_64 0:2.8.12-13.el7 </code></span></p>
<p><span style="color:#B22222;"><code>Terminé !<br />
[root@serveur1 ~]#</code></span></p>
<p> </p>
<h2>Initialisation des deux noeuds PostgreSQL</h2>
<p>Tout est installé, on va donc pouvoir commencer la configuration de notre architecture PostgreSQL MMR. Pour pouvoir commencer à mettre à jour les fichiers de configuration de PostgreSQL, il faut d'abord initialiser PostgreSQL sur chaque noeud, ce qui aura pour effet de créer l'arborescence de fichiers de base, ainsi que les fichiers de configuration par défaut.</p>
<p><u>Sur Serveur2 et Serveur3, veuillez entrer la commande suivante:</u></p>
<p><code><span style="color:#B22222;">[root@serveur2 ~]#</span> <strong>/usr/pgsql-9.4/bin/postgresql94-setup initdb</strong><br />
<span style="color:#B22222;">Initializing database ... OK</span></code></p>
<p><span style="color:#B22222;"><code>[root@serveur2 ~]#</code></span></p>
<h2> </h2>
<h2>Configuration des deux noeuds pour fonctionnement avec BDR MMR</h2>
<p>Même si on installe les packages 2ndQuadrant de PostgreSQL pour bénéficier du MMR en lieu et place des packages PostgreSQL officiels, PostgreSQL ne fonctionnera pas par défaut avec les capacités MMR, mais comme si il était une version de PostgreSQL "normale", sans support MMR.</p>
<p>Pour pouvoir activer l'extension MMR, il va nous falloir mettre à jour deux fichiers de configuration qui sont <strong>pg_hba.conf</strong> et <strong>postgresql.conf</strong>.</p>
<p>Pour cela, on va se connecter en tant que l'utilisateur postgres:</p>
<p><code><span style="color:#B22222;">[root@Serveur2 ~]#</span> <strong>su - postgres</strong><br />
<span style="color:#B22222;">-bash-4.2$</span> <strong>ls</strong><br />
<span style="color:#B22222;">9.4-bdr<br />
-bash-4.2$</span> <strong>cd 9.4-bdr/</strong><br />
-bash-4.2$ <strong>ls</strong><br />
<span style="color:#B22222;">backups data initdb.log<br />
-bash-4.2$</span> <strong>cd data</strong><br />
<span style="color:#B22222;">-bash-4.2$</span> <strong>ls</strong><br />
<span style="color:#B22222;">base pg_committs pg_ident.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf<br />
global pg_dynshmem pg_log pg_notify pg_snapshots pg_subtrans PG_VERSION postgresql.conf<br />
pg_clog pg_hba.conf pg_logical pg_replslot pg_stat pg_tblspc pg_xlog<br />
-bash-4.2$</span></code></p>
<p> </p>
<p>Ensutie on va utiliser notre éditeur <strong>vi</strong> adoré pour modifier le fichier <strong>pg_hba.conf</strong> comme représenté ci-dessous. Seule la fin de ce fichier est montrée ci-dessous, le début ne contenant que des commentaires:</p>
<p><span style="color:#B22222;"><code># TYPE DATABASE USER ADDRESS METHOD</code></span></p>
<p><code><span style="color:#B22222;"># "local" is for Unix domain socket connections only<br />
local all all peer<br />
# IPv4 local connections:</span><br />
<strong>#host all all 127.0.0.1/32 ident</strong><br />
<strong>host all all 127.0.0.1/32 md5<br />
host all postgres 192.168.178.0/24 trust<br />
host all all 192.168.178.0/24 md5</strong><br />
<span style="color:#B22222;"># IPv6 local connections:<br />
host all all ::1/128 ident<br />
# Allow replication connections from localhost, by a user with the<br />
# replication privilege.<br />
#local replication postgres peer<br />
#host replication postgres 127.0.0.1/32 ident<br />
#host replication postgres ::1/128 ident</span><br />
<strong># BDR replication<br />
local replication postgres trust<br />
host replication postgres 127.0.0.1/32 trust<br />
host replication postgres ::1/128 trust<br />
host replication postgres 192.168.178.0/24 trust</strong></code></p>
<p> </p>
<p>Dans le fichier ci-dessus, une ligne en particulier est assez importante, c'est celle-ci:</p>
<p><code>host all postgres 192.168.178.0/24 trust</code></p>
<p>En effet, dans la <a href="http://bdr-project.org/docs/stable/index.html" hreflang="en" title="Documentation officielle de BDR">documentation de BDR</a> sur le site web de 2ndQuadrant, ils réalisent une installation de <strong>deux noeuds PostgreSQL</strong> mais <strong>sur le même serveur</strong>, c'est à dire qu'il y a deux instances de PostgreSQL qui tournent chacune sur un numéro de port différent. Nous sommes dans un cadre plus proche de "la réalité", dans le sens où <strong>nos deux instances tournent chacune sur un serveur dédié</strong>. Dans ce cas, il nous faut explicitement indiquer que <strong>toute connection à PostgreSQL qui serait faite à partir d'une machine dans notre réseau 192.168.178.0/24 en tant qu'utilisateur postgres (le super-admin de la base) est acceptée de fait</strong>. Si ceci n'était pas configuré, alors il serait impossible d'ajouter nos noeuds au moteur BDR: il nous serait impossible de les ajouter à une configuration en réplication multi-master. Nous aurions des erreurs relatives, par exemple, à une demande de mot de passe pour se connecter lors de l'ajout de chaque noeud à notre "cluster" SQL (à ne pas confondre avec le sens donné au terme Cluster dans la sémantique officielle PostgreSQL), parce que les méthodes SQL BDR utilisées pour configurer nos noeuds en MMR ne supportent pas l'indication d'un utilisateur et d'un mot de passe, mais seulement un nom d'hôte (ou adresse IP), un numéro de port, et un nom de base de données.</p>
<p>Pour ce qui concerne le fichier postgresql.conf, veillez à modifier ou insérer les paramètres ci-dessous. Vous pouvez vous reporter au <a href="http://bdr-project.org/docs/0.9.0/quickstart.html" hreflang="en" title="BDR Quick Start Guide">Quick Start Guide de BDR</a> pour vérifier ces paramètres, et j'y ai ajouté des paramètres dont nous avons aussi besoin, notamment pour que PostgreSQL écoute sur le réseau et sur le port 5432:</p>
<p><code>listen_addresses = '*' # what IP address(es) to listen on;<br />
port = 5432</code></p>
<p><code>shared_buffers = 256MB # min 128kB</code></p>
<p><code>enable_seqscan = off</code></p>
<p><code>log_line_prefix = '%m: ' # special values:</code></p>
<p><code>shared_preload_libraries = 'bdr'<br />
wal_level = 'logical'<br />
track_commit_timestamp = on<br />
max_connections = 200<br />
max_wal_senders = 10<br />
max_replication_slots = 10<br />
# Make sure there are enough background worker slots for BDR to run<br />
max_worker_processes = 10</code></p>
<p><code># These aren't required, but are useful for diagnosing problems<br />
#log_error_verbosity = verbose<br />
#log_min_messages = debug1<br />
#log_line_prefix = 'd=%d p=%p a=%a%q '</code></p>
<p><code># Useful options for playing with conflicts<br />
bdr.default_apply_delay=2000 # milliseconds<br />
bdr.log_conflicts_to_table=on </code></p>
<p> </p>
<h1>Mise en route de nos noeuds et création d'une base de données en MMR</h1>
<h2>Mise en route</h2>
<p>Maintenant que nous avons tout configuré au niveau "système", nous allons pouvoir mettre en route nos deux noeuds PostgreSQL et configurer une base de données en MMR.</p>
<p>Ayez bien présent à l'esprit qu'à tout moment, vous pouvez (et devez) jeter un oeil au fichier de log de vos instances PostgreSQL qui se situent par défaut dans <strong>~/9.4-bdr/data/pg_log/</strong></p>
<p>Pour démarrer PostgreSQL sur Serveur2 et Serveur3:</p>
<p><code><span style="color:#B22222;">[root@serveur2 ~]#</span> <strong>systemctl start postgresql-9.4</strong><br />
<span style="color:#B22222;">[root@serveur2 ~]#</span></code></p>
<p>Pour vérifier que la base de données est bien démarrée, vérifiez en particulier que <strong>bgworker: bdr supervisor</strong> est bien là:</p>
<p><code><span style="color:#B22222;">[root@serveur2 ~]#</span> <strong>ps auxwww | grep postgres</strong><br />
<span style="color:#B22222;">postgres 24997 0.5 2.6 491964 26528 ? S 13:12 0:00 /usr/pgsql-9.4/bin/postgres -D /var/lib/pgsql/9.4-bdr/data<br />
postgres 24998 0.0 0.1 201816 1460 ? Ss 13:12 0:00 postgres: logger process <br />
postgres 25000 0.0 0.4 492232 4432 ? Ss 13:12 0:00 postgres: checkpointer process <br />
postgres 25001 0.0 0.1 492096 1824 ? Ss 13:12 0:00 postgres: writer process <br />
postgres 25002 0.0 0.1 492096 1576 ? Ss 13:12 0:00 postgres: wal writer process <br />
postgres 25003 0.0 0.2 492516 2700 ? Ss 13:12 0:00 postgres: autovacuum launcher process <br />
postgres 25004 0.0 0.1 204040 1840 ? Ss 13:12 0:00 postgres: stats collector process <br />
postgres 25007 0.0 0.4 493796 4296 ? Ss 13:12 0:00 postgres: bgworker: bdr supervisor <br />
root 25009 0.0 0.0 112660 968 pts/0 S+ 13:12 0:00 grep --color=auto postgres</span></code></p>
<p> </p>
<h2>Création d'une base de données de test</h2>
<p>Nous allons maintenant créer une base de données de test, appelée bdrdemo (comme dans la documentation 2ndQuadrant officielle). <strong>L'opération de création de la base doit être réalisée sur les deux noeuds, donc sur Serveur2 et Serveur3, en tant qu'utilisateur postgres</strong>, veuillez entrer la commande ci-dessous:</p>
<p><code><span style="color:#B22222;">-bash-4.2$</span> <strong>createdb bdrdemo</strong><br />
<span style="color:#B22222;">-bash-4.2$</span></code></p>
<p> </p>
<h2>Configuration de la base sur chaque noeud pour le MMR</h2>
<p>Il nous faut activer les extensions BDR pour notre base de données bdrdemo sur chaque noeud. Nous allons utiliser sur Serveur2 et sur Serveur3 le client SQL en ligne de commande: psql</p>
<p>Donc à faire sur Serveur2 et sur Serveur3:</p>
<p><code><span style="color:#B22222;">-bash-4.2$</span> <strong>psql bdrdemo</strong><br />
<span style="color:#B22222;">psql (9.4.4)<br />
Saisissez « help » pour l'aide.</span></code></p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>CREATE EXTENSION btree_gist;</strong><br />
<span style="color:#B22222;">CREATE EXTENSION</span><br />
<span style="color:#B22222;">bdrdemo=#</span> <strong>CREATE EXTENSION bdr;</strong><br />
<span style="color:#B22222;">CREATE EXTENSION<br />
bdrdemo=#</span></code></p>
<p> </p>
<p>Maintenant, nous devons configurer Serveur2 pour lui indiquer que notre base bdrdemo est un membre avec MMR de notre cluster. Donc, à faire <u>uniquement sur Serveur2</u>:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>SELECT bdr.bdr_group_create(local_node_name := 'node1', node_external_dsn := 'host=192.168.178.29 port=5432 dbname=bdrdemo');</strong><br />
<span style="color:#B22222;"> bdr_group_create<br />
------------------<br />
<br />
(1 row)</span></code></p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>SELECT bdr.bdr_node_join_wait_for_ready();</strong><br />
<span style="color:#B22222;"> bdr_node_join_wait_for_ready<br />
------------------------------<br />
<br />
(1 row)</span></code></p>
<p><span style="color:#B22222;"><code>bdrdemo=#</code></span></p>
<p> </p>
<p>Et enfin, on ajoute Serveur3 en tant que membre MMR pour la base de données bdrdemo. Donc, à faire <u>uniquement sur Serveur3</u>:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>SELECT bdr.bdr_group_join(local_node_name := 'node2', node_external_dsn := 'host=192.168.178.30 port=5432 dbname=bdrdemo', join_using_dsn := 'host=192.168.178.29 port=5432 dbname=bdrdemo');</strong><br />
<span style="color:#B22222;"> bdr_group_join<br />
----------------<br />
<br />
(1 row)</span></code></p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>SELECT bdr.bdr_node_join_wait_for_ready();</strong><br />
<span style="color:#B22222;"> bdr_node_join_wait_for_ready<br />
------------------------------<br />
<br />
(1 row)</span></code></p>
<p><span style="color:#B22222;"><code>bdrdemo=#</code></span></p>
<p> </p>
<p>Maintenant, sur n'importe quel noeud de notre cluster, nous devrions pouvoir vérifier le status de chaque noeud en allant fouiller dans les tables de gestion BDR, par exemple comme ci-dessous, où l'on constate bien que les deux noeuds ont un status Ready (la colonne node_status contient <strong>r</strong>):</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>select * from bdr.bdr_nodes;</strong><br />
<span style="color:#B22222;"> node_sysid | node_timeline | node_dboid | node_status | node_name | node_local_dsn | node_init_from_dsn <br />
---------------------+---------------+------------+-------------+-----------+----------------------------------------------+----------------------------------------------<br />
6180981339662698762 | 1 | 16385 | r | node1 | host=192.168.178.29 port=5432 dbname=bdrdemo |<br />
6180981332572710593 | 1 | 16385 | r | node2 | host=192.168.178.30 port=5432 dbname=bdrdemo | host=192.168.178.29 port=5432 dbname=bdrdemo<br />
(2 rows)</span></code></p>
<p><span style="color:#B22222;"><code>bdrdemo=#</code></span></p>
<p> </p>
<h2>Test de nos deux noeuds PostgreSQL MMR</h2>
<p>On peut donc commencer à créer nos tables et à les remplir de données.</p>
<p>Par exemple sur Serveur2:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>BEGIN;</strong><br />
<span style="color:#B22222;">BEGIN<br />
bdrdemo=# </span><strong>SET LOCAL default_sequenceam = 'bdr';</strong><br />
<span style="color:#B22222;">SET<br />
bdrdemo=# </span><strong>CREATE TABLE users(uid serial primary key, firstname varchar(128) not null, lastname varchar(128) not null);</strong><br />
<span style="color:#B22222;">CREATE TABLE<br />
bdrdemo=# </span><strong>COMMIT;</strong><br />
<span style="color:#B22222;">COMMIT<br />
bdrdemo=# </span><strong>INSERT INTO users (firstname, lastname) values ('Captain', 'America');</strong><br />
<span style="color:#B22222;">INSERT 0 1<br />
bdrdemo=#</span></code></p>
<p>Qu'est ce que l'on vient de faire ci-dessus?</p>
<ul>
<li>Tout d'abord, on a démarré une transaction</li>
<li>dans laquelle on spécifie que les <strong>séquences seront basées sur le moteur bdr</strong></li>
<li>Cela signifie que à chaque fois que l'on utilisera un SMALLSERIAL, SERIAL ou BIGSERIAL quelque part (et dans le cadre de notre transaction), on utilisera pas les séquences standards de PostgreSQL, mais les <strong>séquences globales</strong> de l'extension BDR. Ces séquences, comme leur nom l'indique, sont globales à tous les noeuds membres du groupe MMR. Autrement dit, cela nous donne la garantie que, quelque soit le noeud sur lequel des données seront écrites dans une table ayant pour clé primaire une séquence, le numéro de séquence sera absolument unique. C'est un moyen puissant d'éviter que des noeuds différents insèrent des données conflictuelles dans une même table.</li>
<li>On crée justement notre table "users" avec un SERIAL (séquence globale donc) qui plus est PRIMARY KEY</li>
<li>et on valide la transaction avec un COMMIT</li>
<li>Puis on insère une première ligne de données dans notre table</li>
</ul>
<p>Maintenant, si l'on regarde ce que cela donne sur le Serveur3, on peut déjà confirmer que notre table "users" est bien existante:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>\dt</strong><br />
<span style="color:#B22222;"> List of relations<br />
Schema | Name | Type | Owner <br />
--------+-------+-------+----------<br />
public | users | table | postgres<br />
(1 row)</span></code></p>
<p><span style="color:#B22222;">bdrdemo=#</span></p>
<p> </p>
<p>Puis on peut vérifier que notre ligne de données insérée par le Serveur2 est bien là sur le Serveur3:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>select * from users;</strong><br />
<span style="color:#B22222;"> uid | firstname | lastname<br />
------+-----------+----------<br />
5001 | Captain | America<br />
(1 row)</span></code></p>
<p><span style="color:#B22222;"><code>bdrdemo=#</code></span></p>
<p> </p>
<p>En passant, vous pourrez constater que le tout premier numéro de notre séquence globale est à 5001. Cela permet de constater qu'en réalité, BDR alloue des tranches de nombres à chaque noeud en MMR. Une fois une tranche consommée sur un noeud, une autre tranche est allouée et ainsi de suite.</p>
<p>Maintenant, insérons d'autres lignes de données dans notre table cette fois-ci sur le Serveur3:</p>
<p><code><span style="color:#B22222;">bdrdemo=# </span><strong>insert into users (firstname, lastname) values ('Loïs', 'Lane'),('Clark', 'Kent'),('Elon','Musk');</strong><br />
<span style="color:#B22222;">INSERT 0 3<br />
bdrdemo=#</span></code></p>
<p> </p>
<p>Et constatons qu'elles ont bien été répliquées sur notre Serveur2:</p>
<p><code><span style="color:#B22222;">bdrdemo=#</span> <strong>select * from users;</strong><br />
<span style="color:#B22222;"> uid | firstname | lastname<br />
------+-----------+----------<br />
5001 | Captain | America<br />
2 | Loïs | Lane<br />
3 | Clark | Kent<br />
4 | Elon | Musk<br />
(4 rows)</span></code></p>
<p><span style="color:#B22222;"><code>bdrdemo=#</code></span></p>
<p> </p>
<p>Ce qui une fois de plus nous confirme que le Serveur3 est en train d'utiliser une tranche de numéros de séquence qui va de 1 à 5000, et de 5001 à 10000 pour le Serveur2.</p>
<p> </p>
<h2>Pour conclure</h2>
<ul>
<li>Avec BDR, on dispose d'une <strong>réplication MMR très performante</strong> au sein même de PostgreSQL, bien plus performante que toutes les solutions "externes" utilisées jusque là</li>
<li>BDR permet le <strong>MMR entre 48 noeuds PostgreSQL</strong> maximum (pour le moment), c'est déjà très confortable, par exemple dans le cadre d'une base de données dont les noeuds seraient répartis un peu partout sur la planète</li>
<li>BDR étant intégré au moteur PostgreSQL, il n'y a <strong>pas besoin de démon annexe</strong>: c'est plus simple</li>
<li>Les <strong>séquences globales</strong> étant par conséquent elles aussi intégrées au coeur de PostgreSQL, on a vraiment la garantie que les numéros générés sont uniques, quel que soit le noeud PostgreSQL considéré. En tout état de cause, cela permettra d'<strong>éliminer fortement, pour ne pas dire entièrement, les problèmes de conflits entre les noeuds</strong>.</li>
<li>PostgreSQL 9.4 BDR, c'est le commencement. PostgreSQL 9.5 permettra une intégration de BDR encore plus simple et plus optimisée. A terme, il n'y aura plus besoin de produire des packages PostgreSQL "maison" comme le fait 2ndQuadrant. Les packages officiels suffiront pour bénéficier du MMR.</li>
<li>MySQL? C'est quoi ça??? Arrêtez avec MySQL! :-D</li>
</ul>