root/traduc/trunk/slony/logshipping.xml

Revision 1118, 20.6 kB (checked in by daamien, 4 months ago)

Slony : corrections de qq coquilles

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="logshipping">
8 <title>Log Shipping</title>
9 <indexterm><primary>log shipping</primary></indexterm>
10
11 <para> Une des nouvelles fonctionnalités de la version 1.1, qui
12   ne fut réellement stable qu'à partir de la version 1.2.11,
13   est la possibilité de regrouper les mises à jour dans des fichiers
14   de logs qui sont stockés dans un répertoire d'attente.
15   </para>
16
17 <para> Ces fichiers de log peuvent alors être transférés selon la
18   méthode de votre choix vers le <quote>serveur esclave</quote>,
19   que ce soit via   FTP, rsync, ou même avec une <quote>clé USB</quote>
20   d' 1GB transportée par avion.</para>
21
22 <para> Il y a plein de choses sympas à faire avec un tel flux de donnée,
23   en particulier :
24 <itemizedlist>
25  
26   <listitem><para> Répliquer des noeuds qui 
27   <emphasis>ne peuvent pas</emphasis> être securisés;</para></listitem>
28
29   <listitem><para> Répliquer dans des lieux ou il n'est pas possible
30       d'établir des communications bidirectionnelles;</para></listitem>
31
32   <listitem><para> Utiliser une nouvelle forme de <acronym>PITR</acronym>
33   (Point In Time Recovery) qui filtre les transactions composées uniquement
34   de lectures et celles qui mettent à jour des tables qui ne sont pas
35   intéressantes;</para></listitem>
36
37   <listitem><para> En cas de désastre, vous pouvez regarder à l'intérieur
38       des logs pour voir le détail des requêtes;</para>
39
40   <para> Cela rend le log shipping potentiellement utile même si
41     vous n'avez pas réellement l'intention de créer un noeud répliqué;
42     </para></listitem>
43
44   <listitem><para> C'est un méthode trÚs subtile pour charger
45       des données en vue de tests;
46       </para></listitem>
47
48   <listitem><para> Nous avons un systÚme <quote>escrow</quote> qui
49       serait incroyablement moins cher avec du log shipping;</para></listitem>
50
51   <listitem><para> Vous pouvez appliquer des triggers sur un
52       <quote>noeud déconnecté</quote> pour effectuer des traitements
53       supplémentaires sur les données.</para>
54
55   <para> Par exemple, vous pouvez prendre une base relativement <quote>statique</quote>
56   et la transformer en une table <quote>temporelle</quote> , en utilisant
57   des triggers qui that implémentent les techniques décrites dans
58   <citation>Developing Time-Oriented Database Applications in SQL
59   </citation> de <ulink url="http://www.cs.arizona.edu/people/rts/">
60   Richard T. Snodgrass</ulink>.</para></listitem>
61
62 </itemizedlist></para>
63
64 <qandaset>
65 <qandaentry>
66
67 <question> <para> Où sont générés les <quote>fichiers de log</quote> d'un
68     ensemble de réplication donné ?</para>
69 </question>
70
71 <answer> <para> Chaque noeud abonné <link linkend="slon"> slon </link>
72     peut les générer en ajoutant l'option <option>-a</option>.</para>
73
74 <note><para> Notez que cela implique que pour utiliser le log
75 shipping, vous devez avoir au moins un noeud abonné. </para></note>
76 </answer>
77
78 </qandaentry>
79
80 <qandaentry> <question> <para> Que se passe-t-il lors d'un  <xref
81 linkend="stmtfailover"/>/ <xref linkend="stmtmoveset"/>
82  se déclenche ?</para></question>
83
84 <answer><para> Rien de spécial. Tant que le noeud d'archivage rester un abonné
85     il continue à produire des logs.</para></answer>
86
87 <answer> <warning> <para>Si le noeud d'archivage devient l'origine, il
88       continuera à produire des logs.</para> </warning></answer>
89 </qandaentry>
90
91 <qandaentry> <question> <para> Que se passe-t-il lorsqu'il n'y a plus assez d'espace
92       pour les fichiers de logs ?  </para></question>
93
94 <answer><para> Le noeud n'accepte plus les événements <command>SYNC</command>s
95 jusqu'à ce que le problÚme soit réglé. La base de donnée qui est dupliquée
96 tombera également en panne. </para></answer>
97 </qandaentry>
98
99 <qandaentry>
100 <question> <para> Comment réaliser un abonnement ?  </para></question>
101
102 <answer><para> Le script dans <filename>tools</filename> nommé
103 <application>slony1_dump.sh</application> est un script shell qui
104 exporte l'état <quote>actuel</quote> du noeud abonné.</para>
105
106 <para> Vous devez lancer le <application><link linkend="slon"> slon
107 </link></application> pour le noeud abonné avec log shipping activé.
108 À tout moment, vous pouvez lancer la commande
109 <application>slony1_dump.sh</application>, qui va récupérer l'état
110 de l'abonné sous la forme d'événements <command>SYNC</command>.
111 Une fois que l'export est complet, tous les logs <command>SYNC</command>
112 produits à partir du moment où l'export a <emphasis>démarré</emphasis>
113 seront ajoutés à l'export afin d'obtenir un <quote>noeud abonné
114   au log shipping</quote>.
115 </para></answer>
116 </qandaentry>
117
118 <qandaentry> <question><para> Quelles sont les limitations du log
119 shipping ? </para>
120 </question>
121
122 <answer><para> Dans la version initiale, il y a beaucoup de limitations.
123     Heureusement au fur et à mesure des nouvelles versions, certaines de ces
124     limitations ont été corrigées ou supprimées. </para> </answer>
125
126 <answer><para> La fonctionnalité du log shipping revient à
127 <quote>sniffer</quote> les données appliquées sur un noeud abonné
128 . En conséquence, vous devez avoir au moins un noeud
129  <quote>standard</quote>; vous ne pouvez pas avoir un cluster composé
130  seulement d'une origine et d'un ensemble de <quote>noeuds de log shipping
131  </quote>. </para></answer>
132
133 <answer><para> Le <quote>noeud de log shipping</quote> traque
134     la totalité du trafic allant vers un abonné. Vous pouvez
135     séparer les choses lorsqu'il y a de multiple ensembles de
136     réplication. </para></answer>
137
138 <answer><para> Actuellement le <quote>noeud de log shipping </quote>
139     traque uniquement les événements <command>SYNC</command>.
140     Cela devrait être suffisant pour gérer <emphasis>certains</emphasis>
141     changements de la configuration du cluster, mais pas tous.
142  </para>
143
144 <para> Un bonne partie des types événements <emphasis> sont </emphasis>
145   gérés afin que le log shipping puissent les traités :
146
147 <itemizedlist>
148
149 <listitem><para>Bien évidemment, les événements <command>SYNC </command> sont gérés;
150     </para></listitem>
151
152 <listitem><para>Les <command>DDL_SCRIPT</command> sont gérés.</para></listitem>
153
154 <listitem><para><command> UNSUBSCRIBE_SET </command></para>
155
156 <para> Cet événement, tout comme <command>SUBSCRIBE_SET</command> n'est pas
157   géré par le noeud de log shipping.  Mais cette commande, par définition,
158   implique que les événements <command>SYNC</command> ne
159   contiennent plus de mises à jour pour l'ensemble de réplication;
160   </para>
161
162 <para> De la même façon, <command>SET_DROP_TABLE</command>,
163 <command>SET_DROP_SEQUENCE</command>,
164 <command>SET_MOVE_TABLE</command>,
165 <command>SET_MOVE_SEQUENCE</command> <command>DROP_SET</command>,
166 <command>MERGE_SET</command>, seront géré de maniÚre <quote>appropriée
167 </quote>;</para></listitem>
168
169 <listitem><para><command> SUBSCRIBE_SET </command></para>
170
171 <para> Malheureusement, des choses <quote>étranges</quote> lorsqu'on
172   gÚre cette commande... Quand un <command>SUBSCRIBE_SET</command>
173   se produit, cela déclenche un évÚnement nommé
174   <command>ENABLE_SUBSCRIPTION</command>
175   qui est levé et traiter uniquement sur le noeud abonné;</para>
176
177 <para> <command> SUBSCRIBE_SET </command> est vraiment un événement
178   trÚs simple, il se contente de <emphasis>déclarer</emphasis>
179   qu'un noeud s'abonne à un ensemble donné via un fournisseur donné.
180    <emphasis>Il ne copie pas les données !</emphasis> </para>
181
182 <para> Le coeur du travail de souscription est réalisé par
183 <command>ENABLE_SUBSCRIPTION</command>, qui est un événement
184 déclenché sur le noeud local, et non pas dans la même séquence
185 que les autres événements en provenance des autres noeuds ( notament
186 le fournisseur de données ). </para>
187
188 <para> Avec la modifications du traitement des logs intervenus dans la version 1.2.11,
189 ceci ne présente plus de problÚmes pour l'utilisateur.</para>
190
191 </listitem>
192
193 <listitem><para> Les différents événements impliqués dans la configuration d'un
194     noeud sont inutiles dans le cadre du log shipping :
195
196 <command>STORE_NODE</command>,
197 <command>ENABLE_NODE</command>,
198 <command>DROP_NODE</command>,
199 <command>STORE_PATH</command>,
200 <command>DROP_PATH</command>,
201 <command>STORE_LISTEN</command>,
202 <command>DROP_LISTEN</command></para></listitem>
203
204 <listitem><para> Les événements impliqués dans la configuration
205     des ensembles de réplication sont également inutiles :
206
207 <command>STORE_SET</command>,
208 <command>SET_ADD_TABLE</command>,
209 <command>SET_ADD_SEQUENCE</command>,
210 <command>STORE_TRIGGER</command>,
211 <command>DROP_TRIGGER</command>,
212 <command>TABLE_ADD_KEY</command>
213 </para></listitem>
214
215 </itemizedlist>
216 </para>
217 </answer>
218
219 <answer><para> Il serait pratique de transformer un noeud de  <quote>log
220 shipping</quote> est un noeud &slony1; complÚtement fonctionnel sur
221 lequel on pourrait basculer. Cela serait utile 
222 (par exemple) pour un cluster de 6 noeuds; cela permettrait de
223 commencer par créer noeud abonné puis d'utiliser le log shipping
224 pour construire les 4 autres noeuds en parallÚle.
225 </para>
226
227 <para> Cette utilisation n'est pas possible, mais on peut  ajouter
228   la configuration &slony1; dans un noeud, et le promouvoir
229   en tant que nouveau noeud.
230   Encore une fois, c'est une simple question de programmation
231   (mais ça n'est pas forcément si simple)... </para></answer>
232 </qandaentry>
233 </qandaset>
234
235 <sect2><title> Conseils d'utilisation </title>
236
237 <note> <para> Voici quelques notes plus ou moins structurées
238     sur l'utilisation idéale du log shipping...</para> </note>
239
240 <itemizedlist>
241
242 <listitem><para> Vous ne  <emphasis>devez</emphasis> pas appliquer aveuglément
243     les fichiers <command>SYNC</command> car on en peut pas prendre un
244     fichier <command>SYNC</command> au hasard.
245     Si ce n'est pas un fichier approprié, alors la
246     commande <function> setsyncTracking_offline() </function>
247     échouera et votre session <application> psql</application>
248     recevra la commande <command> ABORT</command>, puis recherchera
249     dans le fichier <command>SYNC</command> à la recherche d'un
250     <command>COMMIT</command> ou d'un <command>ROLLBACK</command> afin
251     de continuer vers la prochaine transaction.</para>
252
253 <para> Mais nous <emphasis> savons </emphasis> que la totalité du
254   contenu du fichier va échouer ! Il est futile de continuer à analyser
255   le reste du fichier.</para>
256
257 <para> Voici une meilleure idée :
258
259 <itemizedlist>
260
261 <listitem><para> Tout d'abord, Lire les premiÚres lignes du fichier, jusqu'à
262     l'appel à la fonction <function> setsyncTracking_offline() </function>.
263   </para></listitem>
264
265 <listitem><para> Essayez de l'appliquer jusque là.</para></listitem>
266
267 <listitem><para> Si cela échoue, alors il est futile de continuer;
268 lancez un <command>ROLLBACK</command> sur la transaction, et essayez
269 éventuellement un autre fichier.</para></listitem>
270
271 <listitem><para> Si l'appel à <function> setsyncTracking_offline()
272 </function> fonctionne, alors vous avez trouver le bon fichier de
273 <command>SYNC</command> et vous pouvez l'appliquer.  Vous devrez
274 probablement faire un <command>ROLLBACK</command> sur la transaction,
275 puis utiliser <application>psql</application> pour appliquer
276 la totalité des mises à jours contenues dans le fichier.
277 </para></listitem>
278
279 </itemizedlist></para>
280
281 <para> Afin de faciliter la récupération des premiÚres lignes
282   des fichiers sync, le format a été conçu pour qu'une ligne
283   de pointillée indique la fin de <quote>l'en-tête </quote> :
284
285 <programlisting>
286 -- Slony-I log shipping archive
287 -- Node 11, Event 656
288 start transaction;
289
290 select "_T1".setsyncTracking_offline(1, '655', '656', '2007-09-23 18:37:40.206342');
291 -- end of log archiving header
292 </programlisting></para></listitem>
293
294
295 <listitem><para> Notez que l'en-tête inclut le timestamp qui témoigne de la
296     date de l'événement SYNC.
297 <programlisting>
298 -- Slony-I log shipping archive
299 -- Node 11, Event 109
300 start transaction;
301
302 select "_T1".setsyncTracking_offline(1, '96', '109', '2007-09-23 19:01:31.267403');
303 -- end of log archiving header
304 </programlisting></para>
305
306 <para> Ce timestamp représente la date où le <command>SYNC</command>
307   a été déclenché sur le noeud d'origine.</para>
308
309 <para> La valeur est stockée dans la table de configuration
310 sl_setsync_offline.</para>
311
312 <para> Si vous construisez une base dynamique, cela représente probablement
313   le moment ou voudrez appliquer toute les données d'une tansaction de
314   de log shipping. </para>
315 </listitem>
316
317 <listitem><para> Vous pouvez trouver plus d'information sur
318     comment l'activité du noeud est enregistré dans
319     <xref linkend="logshiplog"/>. </para></listitem>
320
321 </itemizedlist>
322
323 <para> À partir de la version 1.2.11, il existe une méthode
324   <emphasis>encore meilleure</emphasis> pour appliquer les logs, car
325   leu rÚgle de nommage est devenu plus compréhensible.</para>
326
327 <itemizedlist>
328
329 <listitem><para> Les traces, sur le noeud de log shipping, qui
330     indiquent quel est quel est le log le plus récemment
331     traité, sont stockées dans la table <envar>sl_archive_tracking</envar>. </para>
332
333 <para> Ainsi, vous pouvez prédire l'identifiant du prochain
334   fichier de log en incrémentant le dernier identifiant de cette
335   table.</para>
336 </listitem>
337
338 <listitem><para> Il existe néanmoins des variations dans le
339     nommage des fichiers, en fonction du nombre de noeuds
340     qui composent le cluster. Tous les noeuds produisent
341     réguliÚrement des événements <command>SYNC</command>,
342     même si ils ne sont pas le noeud origine, et le systÚme
343     de log shipping génÚre des logs pour ces événements. </para>
344
345 <para> En conséquence, lorsque l'on cherche le fichier de log suivant,
346   il est nécessaire de chercher de maniÚre suivante :
347
348 <programlisting>
349 ARCHIVEDIR=/var/spool/slony/archivelogs/node4
350 SLONYCLUSTER=mon_cluster
351 PGDATABASE=logshipdb
352 PGHOST=logshiphost
353 NEXTQUERY="select at_counter+1 from \"_${SLONYCLUSTER}\".sl_archive_tracking;"
354 nextseq=`psql -d ${PGDATABASE} -h ${PGHOST} -A -t -c "${NEXTQUERY}"
355 filespec=`printf "slony1_log_*_%20d.sql"
356 for file in `find $ARCHIVEDIR -name "${filespec}"; do
357    psql -d ${PGDATABASE} -h ${PGHOST} -f ${file}
358 done
359 </programlisting>
360 </para>
361 </listitem>
362
363 <listitem><para> </para> </listitem>
364 </itemizedlist>
365
366 </sect2>
367
368 <sect2><title> <application> find-triggers-to-deactivate.sh
369 </application> </title>
370
371 <indexterm><primary> Désactivation des triggers </primary> </indexterm>
372
373 <para> Le <ulink
374 url="http://www.slony.info/bugzilla/show_bug.cgi?id=19"> bug
375 #19</ulink> indique que le dump d'un schéma peut contenir des
376 triggers et des rÚgles que l'on ne souhaite pas activer sur un
377 noeud de log shipping.</para>
378
379 <para> L'outil <filename> tools/find-triggers-to-deactivate.sh
380 </filename> a été créé pour assister l'utilisateur dans cette tache.
381 Il peut être lancé sur un noeud qui sera utilisé comme schéma source,
382 et il liste les rÚgles et les triggers présents sur ce noeud qui devraient
383 être désactivés.</para>
384
385 <para> Cela comprend le triggers <function>logtrigger</function>
386   et <function>denyaccess</function> qui sont normalement exclut
387   du schéma extrait avec pgdump. Il est toutefois de la responsabilité
388   de l'administrateur de vérifier que des triggers comme ceux-ci
389   sont bien retirés du réplicat du log shipping.
390   </para>
391
392 </sect2>
393
394 <sect2> <title> L'outil <application>slony_logshipper </application></title>
395
396
397 <para> À partir de la version 1.2.12, &slony1; a un outil conçu pour
398   aider à appliquer les logs, nommé <application>slony_logshipper</application>.
399   Il fonctionne avec trois types de paramÚtres :
400 </para>
401
402 <itemizedlist>
403 <listitem><para> des options : </para>
404 <itemizedlist>
405 <listitem><para><option>h</option> </para> <para>    affiche cette aide et se termine </para> </listitem>
406 <listitem><para><option>v</option> </para> <para>    affiche la version et se termine </para> </listitem>
407 <listitem><para><option>q</option> </para> <para>    mode silencieux </para> </listitem>
408 <listitem><para><option>l</option> </para> <para>    ordonne au démon de rouvrir le fichier </para> </listitem>
409 <listitem><para><option>r</option> </para> <para>    ordonne au démon de continuer aprÚs une erreur </para> </listitem>
410 <listitem><para><option>t</option> </para> <para>    ordonne au démon d'entrer en mode d'arrêt intelligent ("smart shutdown") </para> </listitem>
411 <listitem><para><option>T</option> </para> <para>    ordonne au démon d'entrer en mode d'arrêt immédiat </para> </listitem>
412 <listitem><para><option>c</option> </para> <para>    détruit les sémaphores existantes et la file d'attente des messages  (utiliser avec précaution) </para> </listitem>
413 <listitem><para><option>f</option> </para> <para>    rester au premier plan (ne pas fonctionner en mode démon) </para> </listitem>
414 <listitem><para><option>w</option> </para> <para>    entrer immédiatement en mode d'arrêt intelligent</para> </listitem>
415 </itemizedlist>
416 </listitem>
417 <listitem><para> un fichier de configuration spécifique </para>
418 <para> Ce fichier est composé des paramÚtres suivants :</para>
419 <itemizedlist>
420 <listitem><para> <command>logfile = './offline_logs/logshipper.log';</command></para>
421 <para> L'endroit où le log shipper laissera ses traces d'exécutions.</para> </listitem>
422 <listitem><para> <command>cluster name = 'T1';</command></para> <para> le nom du cluster </para> </listitem>
423 <listitem><para> <command>destination database  = 'dbname=slony_test3';</command></para> <para> Le paramÚtre conninfo
424     optionnel pour se connecter à la base destination. Si ce paramÚtre est fourni,
425     le log shipper se connectera à cette base et y appliquera les logs. </para> </listitem>
426 <listitem><para> <command>archive dir = './offline_logs';</command></para> <para> Le répertoire d'archive
427     est obligatoire lorsqu'on est en mode <quote>connecté à une database</quote> afin de pouvoir
428     scanner noeud à la recherche d'archives manquantes (ou non appliquées). </para> </listitem>
429 <listitem><para> <command>destination dir = './offline_result';</command></para> <para> Si ce paramÚtre est défini,
430     le log shipper écrira les résultats du traitement des données à l'intérieur de fichiers
431     de log placés dans ce répertoire.</para> </listitem>
432 <listitem><para> <command>max archives = 3600;</command></para> <para> Ce paramÚtre lutte
433     contre d'éventuelles fuites mémoire; le démon entrera en mode d'arrêt intelligent( <quote>smart shutdown</quote> )
434     automatiquement aprÚs avoir traiter ce nombre d'archives. </para> </listitem>
435 <listitem><para> <command>ignore table "public"."history";</command></para> <para> On peut exclure
436     certaines tables du systÚme de log shipping</para> </listitem>
437 <listitem><para> <command>ignore namespace "public";</command></para> <para> On peut exclure
438     un espace de noms du systÚme de réplication </para> </listitem>
439 <listitem><para> <command>rename namespace "public"."history" to "site_001"."history";</command></para> <para>
440     On peut renommer des tables spécifiques.</para> </listitem>
441 <listitem><para> <command>rename namespace "public" to "site_001";</command></para> <para>
442     On peut renommer un espace de noms.</para> </listitem>
443 <listitem><para> <command>post processing command = 'gzip -9 $inarchive';</command></para> <para>
444     Les commandes de pré-traitement et post-traitement sont exécutées via la fonction <function>system(3)</function>. </para> </listitem>
445 </itemizedlist>
446 <para> Un <quote>@</quote> placé devant le nom de la commande permet d'ignorer un code de retour. Sinon, tout code
447   de retour différent de zéro sera traité comme une erreur et provoquera l'arrêt du processus. </para>
448
449 <para> Par ailleurs les commandes de pré-traitement et de post-traitement ont accÚs à deux variables spéciales : </para>
450 <itemizedlist>
451 <listitem><para> <envar>$inarchive</envar>  - indique le nom du fichier d'archive en entrée </para> </listitem>
452 <listitem><para> <envar>$outnarchive</envar>  - indique le nom du fichier d'archive en sortie </para> </listitem>
453 </itemizedlist>
454 </listitem>
455
456 <listitem><para> <command>error command = ' ( echo
457 "archive=$inarchive" echo "error messages:" echo "$errortext" ) | mail
458 -s "Slony log shipping failed" postgres@localhost ';</command></para>
459
460 <para>  Le commande d'erreur indique quelle commande lancé lorsqu'une erreur est rencontrée.
461   Toutes l'archivage réalisée depuis le dernier archive traité avec succÚs est disponible
462   dans la variable <envar>$errortext</envar>. </para>
463
464 <para> Dans l'exemple donné, un courriel est envoyé à l'administrateur
465   lorsqu'une erreur est rencontrée.</para> </listitem>
466 </itemizedlist>
467
468 <itemizedlist>
469 <listitem><para> Noms des fichiers d'archive</para>
470
471 <para> Chaque nom de fichier est ajouté à la file d'attente des messages SystemV
472   afin qu'un processus <application>slony_logshipper</application> le traite.</para>
473
474 </listitem>
475
476 </itemizedlist>
477
478 </sect2>
479 </sect1>
Note: See TracBrowser for help on using the browser.