root/traduc/trunk/slony/firstdb.xml

Revision 1016, 16.6 kB (checked in by daamien, 7 months ago)

petites corrections mineures

Line 
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>
Note: See TracBrowser for help on using the browser.