| 1 |
<?xml version="1.0" encoding="UTF-8"?> |
|---|
| 2 |
<!-- DerniÚre modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
|
|---|
| 7 |
<sect1 id="firstdb"><title>Répliquer votre premiÚre base de données</title> |
|---|
| 8 |
|
|---|
| 9 |
<indexterm><primary>Répliquer votre premiÚre base de données</primary></indexterm> |
|---|
| 10 |
|
|---|
| 11 |
<para>Dans cet exemple, nous allons répliquer une base de donnée |
|---|
| 12 |
<application>pgbench</application> neuve. Les mécanismes de réplications |
|---|
| 13 |
d'une base existante sont abordé ici, cependant nous vous recommandons d'apprendre |
|---|
| 14 |
comment utiliser les fonctions &slony1; en utilisant une base fraîchement créée, |
|---|
| 15 |
placée sur un serveur qui n'est pas en production.</para> |
|---|
| 16 |
|
|---|
| 17 |
<para> Notez que <application>pgbench</application> est une outil de <quote>tests</quote> ( "benchmark" ) |
|---|
| 18 |
qui se trouve parmi les outils <filename>contrib</filename> de &postgres; Si vous compilez &postgres; |
|---|
| 19 |
depuis les sources, vous devez vous rendre dans le répertoire <filename>contrib/pgbench</filename> |
|---|
| 20 |
et exécuter la commande <command>make install</command> pour le compiler et l'installer; |
|---|
| 21 |
Vous pouvez par ailleurs le trouver inclus dans les paquets binaires de &postgres;. |
|---|
| 22 |
</para> |
|---|
| 23 |
|
|---|
| 24 |
<para>Le moteur de réplication de &slony1; est basée sur les triggers, ce qui permet |
|---|
| 25 |
répliquer des bases de données ( ou des parties de celles-ci ) hébergées par le |
|---|
| 26 |
même postmaster.</para> |
|---|
| 27 |
|
|---|
| 28 |
<para>Cet exemple montre comment répliquer la base <application>pgbench</application> |
|---|
| 29 |
hébergées sur localhost (maître) vers la base <application>pgbench</application> esclave |
|---|
| 30 |
hébergée elle aussi sur localhost (esclave). Nous nous basons sur deux suppositions |
|---|
| 31 |
à propos de votre configuration de &postgres; : |
|---|
| 32 |
<itemizedlist> |
|---|
| 33 |
|
|---|
| 34 |
<listitem><para> Vous avez la ligne <option>tcpip_socket=true</option> dans votre |
|---|
| 35 |
<filename>postgresql.conf</filename> et </para></listitem> |
|---|
| 36 |
|
|---|
| 37 |
<listitem><para> Vous avez activer les accÚs à votre cluster via |
|---|
| 38 |
<filename>pg_hba.conf</filename></para></listitem> |
|---|
| 39 |
|
|---|
| 40 |
</itemizedlist></para> |
|---|
| 41 |
|
|---|
| 42 |
<para> L'utilisateur <envar>REPLICATIONUSER</envar> doit être un super-utilisateur |
|---|
| 43 |
&postgres;. C'est en général, postgres ou pgsql, cependant au sein d'environnements |
|---|
| 44 |
complexes, il est parfois judicieux de définir un utilisateur <command>slony</command> |
|---|
| 45 |
pour distinguer les différents rÎles.</para> |
|---|
| 46 |
|
|---|
| 47 |
<para>Vous devez également définir les variables shell suivantes : |
|---|
| 48 |
|
|---|
| 49 |
<itemizedlist> |
|---|
| 50 |
<listitem><para> <envar>CLUSTERNAME</envar>=exemple_slony</para></listitem> |
|---|
| 51 |
<listitem><para> <envar>MASTERDBNAME</envar>=pgbench</para></listitem> |
|---|
| 52 |
<listitem><para> <envar>SLAVEDBNAME</envar>=pgbench_esclave</para></listitem> |
|---|
| 53 |
<listitem><para> <envar>MASTERHOST</envar>=localhost</para></listitem> |
|---|
| 54 |
<listitem><para> <envar>SLAVEHOST</envar>=localhost</para></listitem> |
|---|
| 55 |
<listitem><para> <envar>REPLICATIONUSER</envar>=pgsql</para></listitem> |
|---|
| 56 |
<listitem><para> <envar>PGBENCHUSER</envar>=pgbench</para></listitem> |
|---|
| 57 |
</itemizedlist> |
|---|
| 58 |
</para> |
|---|
| 59 |
<para>Voici deux maniÚres de paramétrer ces variables avec un shell standard : |
|---|
| 60 |
|
|---|
| 61 |
<itemizedlist> |
|---|
| 62 |
<listitem> |
|---|
| 63 |
<para>bash, sh, ksh |
|---|
| 64 |
<command>export CLUSTERNAME=exemple_slony</command></para> |
|---|
| 65 |
</listitem> |
|---|
| 66 |
<listitem> |
|---|
| 67 |
<para>(t)csh: |
|---|
| 68 |
<command>setenv CLUSTERNAME exemple_slony</command></para> |
|---|
| 69 |
</listitem> |
|---|
| 70 |
</itemizedlist> |
|---|
| 71 |
</para> |
|---|
| 72 |
|
|---|
| 73 |
<para><warning><para> Si vous changez vos variables afin d'utiliser différents hÎtes |
|---|
| 74 |
pour <envar>MASTERHOST</envar> et <envar>SLAVEHOST</envar>, soyez certain de |
|---|
| 75 |
<emphasis>ne pas</emphasis> utiliser localhost pour aucun des deux. Ceci provoquerait |
|---|
| 76 |
une erreur similaire à celle-ci :</para> |
|---|
| 77 |
|
|---|
| 78 |
<para><command> |
|---|
| 79 |
ERROR remoteListenThread_1: db_getLocalNodeId() returned 2 - wrong database? |
|---|
| 80 |
</command></para> |
|---|
| 81 |
</warning></para> |
|---|
| 82 |
|
|---|
| 83 |
|
|---|
| 84 |
<sect2><title>Créer l'utilisateur <application>pgbench</application></title> |
|---|
| 85 |
|
|---|
| 86 |
<para><command> |
|---|
| 87 |
createuser -A -D $PGBENCHUSER |
|---|
| 88 |
</command> |
|---|
| 89 |
</para> |
|---|
| 90 |
</sect2> |
|---|
| 91 |
<sect2><title>Préparer les bases</title> |
|---|
| 92 |
|
|---|
| 93 |
<programlisting> |
|---|
| 94 |
createdb -O $PGBENCHUSER -h $MASTERHOST $MASTERDBNAME |
|---|
| 95 |
createdb -O $PGBENCHUSER -h $SLAVEHOST $SLAVEDBNAME |
|---|
| 96 |
pgbench -i -s 1 -U $PGBENCHUSER -h $MASTERHOST $MASTERDBNAME |
|---|
| 97 |
</programlisting> |
|---|
| 98 |
|
|---|
| 99 |
<para> Une des tables crées par <application>pgbench</application>, <envar>history</envar>, |
|---|
| 100 |
n'a pas de clé primaire. Dans les versions antérieurs de &slony1;, un commande |
|---|
| 101 |
&slonik; nommée <xref linkend="stmttableaddkey"/> pouvait être utilisées pour |
|---|
| 102 |
en introduire une. Ceci provoquait de nombreux problÚmes si bien que cette |
|---|
| 103 |
fonctionnalités fut supprimée dans la version 2 &slony1;. Il est désormais |
|---|
| 104 |
<emphasis>nécessaires</emphasis> d'avoir une ensemble éligible en tant que |
|---|
| 105 |
clé primaire. </para> |
|---|
| 106 |
|
|---|
| 107 |
<para> Les requêtes SQL suivantes établissent une clé primaire cohérente pour cette table.: </para> |
|---|
| 108 |
|
|---|
| 109 |
<programlisting> |
|---|
| 110 |
psql -U $PGBENCH_USER -h $HOST1 -d $DBNAME1 -c "begin; alter table |
|---|
| 111 |
history add column id serial; update history set id = |
|---|
| 112 |
nextval('history_id_seq'); alter table history add primary key(id); |
|---|
| 113 |
commit" |
|---|
| 114 |
</programlisting> |
|---|
| 115 |
|
|---|
| 116 |
<para>Puisque &slony1; dépend de la présence du langage procédural pl/pgSQL |
|---|
| 117 |
, nous devons l'installer maintenant. Il est possible que vous ayez installé |
|---|
| 118 |
pl/pgSQL dans la base template1, auquel cas vous pouvez sauter cette étape |
|---|
| 119 |
car le langage est installé par défaut dans la base <envar>$MASTERDBNAME</envar>. |
|---|
| 120 |
|
|---|
| 121 |
<programlisting> |
|---|
| 122 |
createlang -h $MASTERHOST plpgsql $MASTERDBNAME |
|---|
| 123 |
</programlisting> |
|---|
| 124 |
</para> |
|---|
| 125 |
|
|---|
| 126 |
<para>&slony1; ne copie pas automatiquement les définitions de tables |
|---|
| 127 |
du maître lorsqu'un esclave s'y connecte à lui, ainsi nous devons importer |
|---|
| 128 |
ces données. Nous réalisons cette opération avec <application>pg_dump</application>. |
|---|
| 129 |
|
|---|
| 130 |
<programlisting> |
|---|
| 131 |
pg_dump -s -U $REPLICATIONUSER -h $MASTERHOST $MASTERDBNAME | psql -U $REPLICATIONUSER -h $SLAVEHOST $SLAVEDBNAME |
|---|
| 132 |
</programlisting> |
|---|
| 133 |
</para> |
|---|
| 134 |
|
|---|
| 135 |
<para>Pour illustrer comment &slony1; permet une réplication à la volée, |
|---|
| 136 |
nous lançons l'application <application>pgbench</application>. |
|---|
| 137 |
Si vous exécutez <application>pgbench</application> en tache de premier plan |
|---|
| 138 |
dans une fenêtre de terminal séparée, vous pouvez l'arrêter et la relancer |
|---|
| 139 |
à tout moment avec des paramÚtres différents. Vous devrez exporter les |
|---|
| 140 |
variables d'environnement pour qu'elles soient également disponibles dans cette session. |
|---|
| 141 |
</para> |
|---|
| 142 |
|
|---|
| 143 |
<para>La commande habituelle pour exécuter <application>pgbench</application> est : |
|---|
| 144 |
|
|---|
| 145 |
<programlisting> |
|---|
| 146 |
pgbench -s 1 -c 5 -t 1000 -U $PGBENCHUSER -h $MASTERHOST $MASTERDBNAME |
|---|
| 147 |
</programlisting> |
|---|
| 148 |
</para> |
|---|
| 149 |
|
|---|
| 150 |
<para>Ceci lancera <application>pgbench</application> avec 5 clients concurrents, |
|---|
| 151 |
exécutant chacun 1000 transactions sur la base <application>pgbench</application> |
|---|
| 152 |
hébergées sur localhost, en utilisant l'utilisateur pgbench. |
|---|
| 153 |
</para></sect2> |
|---|
| 154 |
|
|---|
| 155 |
<sect2><title>Configurer la base de donnée pour la réplication.</title> |
|---|
| 156 |
|
|---|
| 157 |
<para>La création des tables de configuration, des procédures stockées, des triggers, |
|---|
| 158 |
et la configuration sont prises en charges par l'outil <xref linkend="slonik"/>. |
|---|
| 159 |
Il s'agit d'un script d'aide spécialisé, qui appelle principalement des procédures stockées |
|---|
| 160 |
sur les noeuds maître et esclaves.</para> |
|---|
| 161 |
|
|---|
| 162 |
<sect3><title>Utiliser les scripts altperl</title> |
|---|
| 163 |
|
|---|
| 164 |
<indexterm><primary> Utilisation des scripts altperl</primary></indexterm> |
|---|
| 165 |
|
|---|
| 166 |
<para> |
|---|
| 167 |
L'utilisation des scripts <xref linkend="altperl"/> est une façon simple de |
|---|
| 168 |
faire ses premiers pas. Le script <command>slonik_build_env</command> |
|---|
| 169 |
génÚre une sortie fournissant les détails nécessaires à la construction |
|---|
| 170 |
complÚte d'un fichier <filename>rslon_tools.conf</filename>. |
|---|
| 171 |
Un exemple de fichier <filename>slon_tools.conf</filename> est fournit dans la distribution |
|---|
| 172 |
afin d'aider à la prise en main. Les script altperl font tous référence à ce |
|---|
| 173 |
fichier central de configuration afin de simplifier l'administration. |
|---|
| 174 |
Une fois le fichier slon_tools.conf créé, vous pouvez poursuivre comme ceci : |
|---|
| 175 |
</para> |
|---|
| 176 |
|
|---|
| 177 |
<programlisting> |
|---|
| 178 |
# Initialisation du cluster: |
|---|
| 179 |
$ slonik_init_cluster | slonik |
|---|
| 180 |
|
|---|
| 181 |
# Démarrage de slon (ici 1 et 2 sont les numéros de noeuds) |
|---|
| 182 |
$ slon_start 1 |
|---|
| 183 |
$ slon_start 2 |
|---|
| 184 |
|
|---|
| 185 |
# Création des ensemble (ici 1 est le numéro de l'ensemble) |
|---|
| 186 |
$ slonik_create_set 1 |
|---|
| 187 |
|
|---|
| 188 |
# Abonner l'ensemble dans le second noeud (1= n° d'ensemble, 2= n° de noeud) |
|---|
| 189 |
$ slonik_subscribe_set 1 2 | slonik |
|---|
| 190 |
</programlisting> |
|---|
| 191 |
|
|---|
| 192 |
<para> Vous avez répliqué votre premiÚre base de données. |
|---|
| 193 |
Vous pouvez sauter la section suivante de la documentation |
|---|
| 194 |
si vous le souhaitez, car il s'agit d'une approche plus |
|---|
| 195 |
<quote>rustre</quote>.</para> |
|---|
| 196 |
</sect3> |
|---|
| 197 |
|
|---|
| 198 |
<sect3><title>Utiliser directement les commandes slonik</title> |
|---|
| 199 |
|
|---|
| 200 |
<para>L'approche traditionnelle pour administrer slony consiste à utiliser directement |
|---|
| 201 |
les commandes slonik. En voici un exemple </para> |
|---|
| 202 |
|
|---|
| 203 |
<para> Le script de création de la configuration initiale |
|---|
| 204 |
pour une simple configuration maître-esclave de la base |
|---|
| 205 |
<application>pgbench</application> est le suivant :</para> |
|---|
| 206 |
|
|---|
| 207 |
<programlisting><![CDATA[ |
|---|
| 208 |
#!/bin/sh |
|---|
| 209 |
|
|---|
| 210 |
slonik <<_EOF_ |
|---|
| 211 |
#-- |
|---|
| 212 |
# défintion de l'espace de nom du systÚme de réplication |
|---|
| 213 |
# dans notre exemple il s'agit de exemple_slony |
|---|
| 214 |
#-- |
|---|
| 215 |
cluster name = $CLUSTERNAME; |
|---|
| 216 |
|
|---|
| 217 |
#-- |
|---|
| 218 |
# les paramÚtres "admin conninfo" sont utilisé par slonik pour se connecter |
|---|
| 219 |
# aux noeuds. Une ligne par noeud. La syntaxe est celle de PQconnectdb dans la |
|---|
| 220 |
# C-API |
|---|
| 221 |
# -- |
|---|
| 222 |
node 1 admin conninfo = 'dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER'; |
|---|
| 223 |
node 2 admin conninfo = 'dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER'; |
|---|
| 224 |
|
|---|
| 225 |
#-- |
|---|
| 226 |
# initialisation du premier noeud. Son identifiant DOIT être 1. Cela provoque la création |
|---|
| 227 |
# du schema _$CLUSTERNAME contenant tous les objets spécifiques du systÚme |
|---|
| 228 |
# de réplication |
|---|
| 229 |
#-- |
|---|
| 230 |
init cluster ( id=1, comment = 'Master Node'); |
|---|
| 231 |
|
|---|
| 232 |
#-- |
|---|
| 233 |
# Puisque la table history n'a pas de clé primaire, ni de contrainte unique |
|---|
| 234 |
# qui pourrait être utilisée pour identifier une ligne, nous devons en ajouter |
|---|
| 235 |
# une. |
|---|
| 236 |
# La commande suivante ajoute à la table une colonne bigint nommée |
|---|
| 237 |
# _Slony-I_$CLUSTERNAME_rowID. Elle comme valeur par défaut |
|---|
| 238 |
# nextval('_$CLUSTERNAME.s1_rowid_seq'), et dispose des contraintes |
|---|
| 239 |
# UNIQUE et NOT NULL. Toutes les lignes existantes seront initialisées |
|---|
| 240 |
# avec un dentifiant. |
|---|
| 241 |
#-- |
|---|
| 242 |
table add key (node id = 1, fully qualified name = 'public.history'); |
|---|
| 243 |
|
|---|
| 244 |
#-- |
|---|
| 245 |
# Slony-I regroupe les tables dans des ensembles. |
|---|
| 246 |
# La plus petite unité qu'un noeud peut répliquer est un ensemble |
|---|
| 247 |
# Les commandes suivantes créée un ensemble contenant 4 tables pgbench. |
|---|
| 248 |
# Le maître (ou origine) de l'ensemble est le noeud 1. |
|---|
| 249 |
#-- |
|---|
| 250 |
create set (id=1, origin=1, comment='All pgbench tables'); |
|---|
| 251 |
set add table (set id=1, origin=1, id=1, fully qualified name = 'public.accounts', comment='accounts table'); |
|---|
| 252 |
set add table (set id=1, origin=1, id=2, fully qualified name = 'public.branches', comment='branches table'); |
|---|
| 253 |
set add table (set id=1, origin=1, id=3, fully qualified name = 'public.tellers', comment='tellers table'); |
|---|
| 254 |
set add table (set id=1, origin=1, id=4, fully qualified name = 'public.history', comment='history table'); |
|---|
| 255 |
|
|---|
| 256 |
#-- |
|---|
| 257 |
# Création du second noeud (l'esclave) |
|---|
| 258 |
# décrit comment les 2 noeuds vont se connecter l'un à l'autre |
|---|
| 259 |
# et quelle maniÚre ils vont écouter les événements.. |
|---|
| 260 |
#-- |
|---|
| 261 |
store node (id=2, comment = 'Slave node'); |
|---|
| 262 |
store path (server = 1, client = 2, conninfo='dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER'); |
|---|
| 263 |
store path (server = 2, client = 1, conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER'); |
|---|
| 264 |
_EOF_ |
|---|
| 265 |
]]></programlisting> |
|---|
| 266 |
|
|---|
| 267 |
<para>L'application <application>pgbench</application> est-elle toujours exécutée ? |
|---|
| 268 |
Si ce n'est pas le cas, redémarrez-la. |
|---|
| 269 |
</para> |
|---|
| 270 |
|
|---|
| 271 |
<para>A ce moment, nous avons 2 bases de données qui sont complÚtement préparées. |
|---|
| 272 |
Une d'elle est la base maître, celle que l'application <application>pgbench</application> |
|---|
| 273 |
utilise pour lire et modifier des lignes. Le temps est donc venu de lancer les |
|---|
| 274 |
démons de réplication.</para> |
|---|
| 275 |
|
|---|
| 276 |
<para>Sur $MASTERHOST, la commande pour démarrer le moteur de réplication est : |
|---|
| 277 |
|
|---|
| 278 |
<programlisting> |
|---|
| 279 |
slon $CLUSTERNAME "dbname=$MASTERDBNAME user=$REPLICATIONUSER host=$MASTERHOST" |
|---|
| 280 |
</programlisting> |
|---|
| 281 |
</para> |
|---|
| 282 |
<para>De la même façon, nous démarrons le systÚme de réplication sur le noeud 2 (l'esclave) |
|---|
| 283 |
|
|---|
| 284 |
<programlisting> |
|---|
| 285 |
slon $CLUSTERNAME "dbname=$SLAVEDBNAME user=$REPLICATIONUSER host=$SLAVEHOST" |
|---|
| 286 |
</programlisting> |
|---|
| 287 |
</para> |
|---|
| 288 |
<para>Même si nous avons désormais le démon <xref linkend="slon"/> exécuté sur |
|---|
| 289 |
à la fois sur le maître et l'esclave, et qu'ils sont tous les deux en train de |
|---|
| 290 |
cracher des diagnostiques et d'autres messages, les données ne sommes toujours |
|---|
| 291 |
pas répliquées. L'activité que vous constatez est la synchronisation de la |
|---|
| 292 |
configuration du cluster entre les 2 processus <xref linkend="slon"/>. |
|---|
| 293 |
</para> |
|---|
| 294 |
|
|---|
| 295 |
<para>Pour démarrer la réplication des 4 tables <application>pgbench</application> |
|---|
| 296 |
(l'ensemble 1) depuis le maître (le noeud 1) vers l'esclave (le noeud 2), |
|---|
| 297 |
lancez le script suivant : |
|---|
| 298 |
|
|---|
| 299 |
<programlisting><![CDATA[ |
|---|
| 300 |
#!/bin/sh |
|---|
| 301 |
slonik <<_EOF_ |
|---|
| 302 |
# ---- |
|---|
| 303 |
# Définition de l'espace de nom du cluster |
|---|
| 304 |
# ---- |
|---|
| 305 |
cluster name = $CLUSTERNAME; |
|---|
| 306 |
|
|---|
| 307 |
# ---- |
|---|
| 308 |
# Les paramÚtres conninfo sont utilisés par le programme slonik |
|---|
| 309 |
# pour se connecter aux noeuds. Ce sont donc les arguments |
|---|
| 310 |
# PQconnectdb pour se connecter depuis la station de travail |
|---|
| 311 |
# d'administration (où les scripts slonik sont exécutés). |
|---|
| 312 |
# ---- |
|---|
| 313 |
node 1 admin conninfo = 'dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER'; |
|---|
| 314 |
node 2 admin conninfo = 'dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER'; |
|---|
| 315 |
|
|---|
| 316 |
# ---- |
|---|
| 317 |
# Le noeud 2 s'abonne à l'ensemble 1 |
|---|
| 318 |
# ---- |
|---|
| 319 |
subscribe set ( id = 1, provider = 1, receiver = 2, forward = no); |
|---|
| 320 |
_EOF_ |
|---|
| 321 |
]]></programlisting> |
|---|
| 322 |
</para> |
|---|
| 323 |
|
|---|
| 324 |
<para>Désormais, le démon de réplication sur<envar>$SLAVEHOST</envar> se déclenchera à tout moment |
|---|
| 325 |
pour copier les changements d'états sur les 4 tables répliquées. |
|---|
| 326 |
Pendant ce temps, l'application <application>pgbench</application> |
|---|
| 327 |
va continuer à modifier la base de données. |
|---|
| 328 |
Lorsque le processus de copie est terminée, le démon de réplication sur le noeud |
|---|
| 329 |
<envar>$SLAVEHOST</envar> commencera à se synchroniser en appliquant les journaux |
|---|
| 330 |
de réplications qui auront été accumulés. |
|---|
| 331 |
Cela se fera par petit à petit, par tranches de 10 secondes de travail applicatifs. |
|---|
| 332 |
Selon les performances des 2 systÚmes impliqués, la taille des deux bases de données, |
|---|
| 333 |
la charge de transaction et la qualité de l'optimisation et de la maintenance effectuées |
|---|
| 334 |
sur les deux bases de données, ce processus de synchronisation peut durer quelques |
|---|
| 335 |
minutes, quelques heures ou quelques siÚcles.</para> |
|---|
| 336 |
|
|---|
| 337 |
<para>Vous avez maintenant configuré avec un succÚs votre premier systÚme de réplication |
|---|
| 338 |
maître-esclave basique, et les deux bases de données devraient, une fois que l'esclave |
|---|
| 339 |
sera synchronisé, contenir des données identiques. Ãa c'est la théorie, tout du moins. |
|---|
| 340 |
En pratique, il est bon de vérifier que les ensembles de données sont bien identiques. |
|---|
| 341 |
</para> |
|---|
| 342 |
|
|---|
| 343 |
<para>Le script ci-dessous crée des sauvegardes ordonnées des deux bases et les |
|---|
| 344 |
compares. Assurez-vous que le test <application>pgbench</application> est terminé, |
|---|
| 345 |
qu'il n'y pas d'autres mises à jour en cours sur le noeud origine, et que les sessions |
|---|
| 346 |
slons se sont synchronisées.</para> |
|---|
| 347 |
|
|---|
| 348 |
<programlisting><![CDATA[ |
|---|
| 349 |
#!/bin/sh |
|---|
| 350 |
echo -n "**** comparing sample1 ... " |
|---|
| 351 |
psql -U $REPLICATIONUSER -h $MASTERHOST $MASTERDBNAME >dump.tmp.1.$$ <<_EOF_ |
|---|
| 352 |
select 'accounts:'::text, aid, bid, abalance, filler |
|---|
| 353 |
from accounts order by aid; |
|---|
| 354 |
select 'branches:'::text, bid, bbalance, filler |
|---|
| 355 |
from branches order by bid; |
|---|
| 356 |
select 'tellers:'::text, tid, bid, tbalance, filler |
|---|
| 357 |
from tellers order by tid; |
|---|
| 358 |
select 'history:'::text, tid, bid, aid, delta, mtime, filler, |
|---|
| 359 |
"_Slony-I_${CLUSTERNAME}_rowID" |
|---|
| 360 |
from history order by "_Slony-I_${CLUSTERNAME}_rowID"; |
|---|
| 361 |
_EOF_ |
|---|
| 362 |
psql -U $REPLICATIONUSER -h $SLAVEHOST $SLAVEDBNAME >dump.tmp.2.$$ <<_EOF_ |
|---|
| 363 |
select 'accounts:'::text, aid, bid, abalance, filler |
|---|
| 364 |
from accounts order by aid; |
|---|
| 365 |
select 'branches:'::text, bid, bbalance, filler |
|---|
| 366 |
from branches order by bid; |
|---|
| 367 |
select 'tellers:'::text, tid, bid, tbalance, filler |
|---|
| 368 |
from tellers order by tid; |
|---|
| 369 |
select 'history:'::text, tid, bid, aid, delta, mtime, filler, |
|---|
| 370 |
"_Slony-I_${CLUSTERNAME}_rowID" |
|---|
| 371 |
from history order by "_Slony-I_${CLUSTERNAME}_rowID"; |
|---|
| 372 |
_EOF_ |
|---|
| 373 |
|
|---|
| 374 |
if diff dump.tmp.1.$$ dump.tmp.2.$$ >$CLUSTERNAME.diff ; then |
|---|
| 375 |
echo "success - databases are equal." |
|---|
| 376 |
rm dump.tmp.?.$$ |
|---|
| 377 |
rm $CLUSTERNAME.diff |
|---|
| 378 |
else |
|---|
| 379 |
echo "FAILED - see $CLUSTERNAME.diff for database differences" |
|---|
| 380 |
fi |
|---|
| 381 |
]]></programlisting> |
|---|
| 382 |
|
|---|
| 383 |
<para>Notez qu'il existe une documentation un peu plus sophistiquée |
|---|
| 384 |
concernant ce processus dans l'arborescence du code source de |
|---|
| 385 |
&slony1; au sein d'un fichier nommé <filename>slony-I-basic-mstr-slv.txt</filename>.</para> |
|---|
| 386 |
|
|---|
| 387 |
<para>Si ce script retourne <command>FAILED</command>, merci de contacter les développeurs sur |
|---|
| 388 |
<ulink url="http://slony.info/">http://slony.info/</ulink></para></sect3> |
|---|
| 389 |
</sect2> |
|---|
| 390 |
</sect1> |
|---|