root/traduc/trunk/slony/maintenance.xml

Revision 1072, 21.0 kB (checked in by daamien, 5 months ago)

1ere traduction à relire

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="maintenance"> <title>Maintenance</title>
8
9 <indexterm><primary>maintenir &slony1;</primary></indexterm>
10
11 <para>&slony1; effectue une grande partie de sa maintenance
12 de lui-même, dans un processus de <quote>
13 nettoyage</quote> qui  :
14
15 <itemizedlist>
16
17 <listitem><para>supprime les anciennes donnéessur
18 les différentes tables d'espace de nom de
19 du cluster <productname>Slony-I</productname>,
20 notamment <xref linkend="table.sl-log-1"/>, <xref
21 linkend="table.sl-log-2"/>, and <xref
22 linkend="table.sl-seqlog"/>;</para></listitem>
23
24 <listitem><para>effectue un vacuum sur certaines
25 tables utilisées par &slony1;.
26 A partir de la version 1.0.5, ceci inclut &pglistener;;
27 dans les versions antérieures, vous devez lancer
28 souvent des vacuums sur cette table, sinon
29 vous verrez votre réplication ralentir
30 car &slony1; lÚve beaucoup d'événets,
31 qui mÚnent à table à contenir de nombreux
32 tuples morts.
33 </para>
34
35 <para>Avec certaines versions (la 1.1; peut-être la 1.0.5)
36 il est possible de ne plus s'embarrasser avec les vacuums
37 sur ces tables si vous utiliser quelque chose comme
38 <application>pg_autovacuum</application>
39 pour gérer le nettoyage de ces tables.
40 Malheureusement, il est possible que
41 <application>pg_autovacuum</application>
42 ne nettoie pas assez fréquemment, vous pourrez donc préférer utiliser les vacuums internes.
43
44 Nettoyer la table &pglistener; <quote>trop
45 souvent</quote>
46 est moins risqué que de ne pas la nettoyer assez.
47 </para>
48
49 <para>Malheureusement, si vous avez de longues transactions,
50 les vacuums ne peuvent pas nettoyer les tuples morts
51 qui sont plus récents que les anciennes transactions
52 toujours en cours. Ceci conduira en particulier à une
53 forte croissance de &pglistener;
54 et ralentira la réplication.
55 </para></listitem>
56
57
58 <listitem> <para> Le bug <link linkend="dupkey"> Violation par
59 clef dupliqué</link> a permis d'isoler des situations de
60 concurrence dans &postgres;
61 Des problÚms subsiste notamment
62 lorsque <command>VACUUM</command> ne
63 réclame pas correctement l'espace
64 menant à une corruption des arbres B. </para>
65
66 <para>Il peut être utile de lancer la commande
67 <command> REINDEX TABLE sl_log_1;</command>
68 périodiquement pour éviter ce problÚm
69 </para> </listitem>
70
71 <listitem><para> A partir de la version 1.2,
72  la fonctionnalité <quote>log switching</quote>
73 est arrivée;de temps en temps, elle tente d'interchanger
74 les données entre &sllog1; and &sllog2;
75 afin de réaliser un
76 <command>TRUNCATE</command> sur les <quote>plus vielles</quote>
77 données.</para>
78
79 <para> Cela signifie que de maniÚre réguliÚre,
80 ces tables sont complÚtement nettoyées ce qui
81 évitequ'elle ne grossisse trop
82 lors d'une charge importante
83 et qu'elles deviennent
84 impossible à nettoyer.
85
86 </para> </listitem>
87
88 </itemizedlist>
89 </para>
90
91
92 <sect2 id="maintenance-autovac">
93 <title> Intéraction avec l'autovaccum de &postgres;
94 </title>
95
96 <indexterm><primary>interaction avec autovacuum</primary></indexterm>
97
98 <para>Les versions récentes de&postgres; propose
99 un processus <quote>autovacuum</quote>
100 qui détecte les modifications sur les tables et la
101 création
102 de tuples mort, puis nettoie de ces tables,
103 <quote>à la demande.</quote>.
104 On a constaté que cela peut interagir de maniÚre
105 négative avec la politique de vacuum de &slony1;
106 sur ces propres tables. </para>
107
108 <para> &slony1; demande des vacuums sur ses tables
109 immédiatement aprÚs avoir complété les
110 transactions
111 qui sont sensées supprimer de vieilles données,
112 ce qui est considéré comme le meilleur moment
113 pour le faire. Il semble que l'autovacuum détecte
114 les changements un peu trop tÃŽt, et lance un vacuum
115 alors que les transactions ne sont pas complétées,
116 ce qui est relativement inutile.
117 Il apparait préférable de configurer l'autovacuum
118 pour éviter les tables de configuration
119 gérées par &slony1;. </para>
120
121 <para> La requête suivante identifie les tables que
122 l'autovacuum ne doit pas traiter (remplacez le nom du
123 cluster par celui de votre configuration locale) :
124 </para>
125
126 <programlisting>
127 moncluster=# select oid, relname from pg_class where relnamespace = (select oid from pg_namespace where nspname = '_' || 'monCluster') and relhasindex;
128   oid  |   relname   
129 -------+--------------
130  17946 | sl_nodelock
131  17963 | sl_setsync
132  17994 | sl_trigger
133  17980 | sl_table
134  18003 | sl_sequence
135  17937 | sl_node
136  18034 | sl_listen
137  18017 | sl_path
138  18048 | sl_subscribe
139  17951 | sl_set
140  18062 | sl_event
141  18069 | sl_confirm
142  18074 | sl_seqlog
143  18078 | sl_log_1
144  18085 | sl_log_2
145 (15 rows)
146 </programlisting>
147
148 <para>La requête suivante remplira la table
149 <envar>pg_catalog.pg_autovacuum</envar>
150 avec les informations de configuration adéquates :
151 <command> insert into pg_catalog.pg_autovacuum (vacrelid,
152 enabled) select oid, 'f' from pg_catalog.pg_class where relnamespace =
153 (select oid from pg_namespace where nspname = '_' || 'monCluster') and
154 relhasindex; </command> </para>
155 </sect2>
156
157 <sect2><title> Chiens de garde : garder les Slons en vie</title>
158
159 <indexterm><primary>Chiens de garde pour garder en vie les démons slon
160 </primary></indexterm>
161
162 <para>Il y a deux scripts <quote>chiens de garde</quote> disponibles pour surveiller
163   la réplication et relancer les processus <application>slon</application>
164   lorsqu'il meurent pour telle ou telle raison, par exemple une   
165 <quote>coupure</quote> réseau qui provoque une perte de connectivité.</para>
166
167 <para>Ils pourraient vous être utiles...</para>
168
169 <para> La <quote>meilleur et nouvelle</quote> façon de gérer les processus <xref
170 linkend="slon"/> se fait via une combinaison de  <xref
171 linkend="mkslonconf"/>, qui crée un fichier de configuration pour chaque noeud
172   d'un cluster, et <xref linkend="launchclusters"/> qui utilise ces fichiers
173   de configuration.</para>
174
175 <para> Cette approche est préférable aux anciens systÚmes de
176   <quote>chiens de garde</quote> car vous pouvez <quote>pointer</quote>
177   précisément, dans chaque fichier de configurationn, le paramÚtrage
178   désiré pour chaque noeud, sans avoir à vous préoccuper des options
179   que le script chien de garde vous proposer ( ou pas ). Ceci est particuliÚrement
180   important si vous utilisez le <link linkend="logshipping"> log shipping </link>,
181   auquel cas oublier l'option <command>-a</command> peut ruiner le noeud
182   destinataire du log shipping et ruiner par là-même votre journée.</para>
183
184 </sect2>
185
186 <sect2 id="gensync"><title>En parallÚle aux chiens de garde : generate_syncs.sh</title>
187
188 <indexterm><primary>Génére des SYNCs</primary></indexterm>
189
190 <para>Un nouveau script est apparu dans &slony1; 1.1, il s'agit de
191 <application>generate_syncs.sh</application>, qui est utilise dans les situations
192 suivantes.</para>
193
194 <para>Supposons que vous avez un serveur non fiable sur lequel le démon
195 <application>slon</application> daemon ne fonctionne pas en continu,
196 en rentrant de week-end vous vous trouverez peut-êtrÚs la situation suivante :
197 </para>
198
199 <para>Le vendredi soir, quelque chose s'est <quote>cassé</quote> et le temps
200   que la base de donnée redémarre, aucun des démons <application>slon</application>
201   n'a survécu. Votre application en ligne a ensuite connu trois jours
202   de charge transactionnelle relativement forte.
203   </para>
204
205 <para>Lorsque vous redémarrez <application>slon</application> le lundi, il n'y a pas eu
206   de synchronisation sur le maître depuis Vendredi, ce qui fait que le prochain
207 <quote>ensemble de SYNC</quote> comprendra toutes les modifications entre vendredi
208 et lundi. Aïe !</para>
209
210 <para>Si vous lancez <application>generate_syncs.sh</application> via une tache cron
211   toute les 20 minutes, cela créera de force des événements <command>SYNC</command>
212   sur l'origine, ce qui implique qu'entre vendredi et lundi, les nombreuses mises à jour
213   seront découpées en plus de 100 ensemble de SYNCs, qui pourront être appliqués de
214   maniÚre incrémentale, rendant la restauration mois déplaisante.
215 </para>
216
217 <para>Notez que si les <command>SYNC</command>s <emphasis>sont</emphasis> exécutés
218   réguliÚrement, ce scripts ne fera rien de particulier.</para>
219 </sect2>
220
221 <sect2><title>Tester l'état &slony1; </title>
222
223 <indexterm><primary>tester le statut du cluster</primary></indexterm>
224
225 <para> Dans le répertoire <filename>tools</filename>, vous trouverez
226   des scripts nommés <filename>test_slony_state.pl</filename> et
227 <filename>test_slony_state-dbi.pl</filename>.  Le premier utilise l'interface Perl/DBI
228 ; l'autre utilise l'interface Pg.
229 </para>
230
231 <para> Les deux font essentiellement la même chose, c'est à dire
232   se connecter à un noeud &slony1; (celui de votre choix) et à partir de là
233   détermine la liste des noeuds du cluster. Ensuite ils lancent une
234   série de requêtes ( en lecture seule, et donc sans danger ) afin
235   de parcourir différentes tables à la recherche de différentes conditions
236   susceptibles de rélever des problÚmes, telles que :
237 </para>
238
239 <itemizedlist>
240 <listitem><para> Gonflement des tables comme pg_listener, sl_log_1, sl_log_2, sl_seqlog; </para></listitem>
241 <listitem><para> Voies d'écoute;</para></listitem>
242 <listitem><para> Analyse de la propagation des événéments; </para></listitem>
243 <listitem><para> Analyse de la propagation des confirmations. </para>
244
245 <para> Si la communication est <emphasis>légÚrement</emphasis> perturbée,
246 la réplication peut fonctionner, mais les confirmations peuvent ne pas être retournées,
247 ce qui empêche les noeuds de nettoyer les vieux événements et les anciennes données de réplication
248 . </para> </listitem>
249 </itemizedlist>
250
251 <para> Lancer ce script une par heure ou une fois par jour peut vous aider
252   à détecter les symptomes précurseurs de certains problÚmes, avant même
253   que cela conduise à une dégradation des performances. </para>
254 </sect2>
255
256 <sect2><title>Scripts de test de la réplication</title>
257
258 <para>Dans le répertoire <filename>tools</filename> on peut trouver 4
259   scripts qui peuvent être utilisés pour surveiller des instances &slony1; :
260
261 <itemizedlist>
262
263 <listitem><para> <command>test_slony_replication</command> est un script
264     Perl auquel vous pouvez passer les informations de connexion
265     d'un noeud &slony1;.  Il test alors la table  <xref linkend="table.sl-path"/>
266     et d'autres informations sur ce noeud afin de déterminer la forme de
267     l'ensemble de réplication choisi.</para>
268
269 <para> Ensuite il injecte des requêtes de test dans la table nommée
270 <envar>slony_test</envar> qui est définie comme ci-dessous, et
271 qui doit être ajoutée à l'ensemble des tables répliquées :
272
273 <programlisting>
274 CREATE TABLE slony_test (
275     description text,
276     mod_date timestamp with time zone,
277     "_Slony-I_testcluster_rowID" bigint DEFAULT nextval('"_testcluster".sl_rowid_seq'::text) NOT NULL
278 );
279 </programlisting></para>
280
281 <para> La derniÚre colonne de la table est définie par &slony1; comme
282   une une clé primaire manquante...</para>
283
284 <para> Ce script génÚre une ligne de sortie pour chaque noeud &slony1; actif
285   pour l'ensemble de réplication défini dans un fichier nommé
286   <filename>cluster.fact.log</filename>.</para>
287
288 <para> Il y a une option additionelle, <option>finalquery</option>, qui vous permet de
289   passer une requête SQL spécifique à votre application pour déterminer
290  l'état de votre application.</para></listitem>
291
292 <listitem><para><command>log.pm</command> est un module Perl module qui gÚre les logs des
293     scripts Perl.</para></listitem>
294
295 <listitem><para><command>run_rep_tests.sh</command> est un script <quote>wrapper</quote>
296     qui lance <command>test_slony_replication</command>.</para>
297
298 <para> Si vous avez plusieurs clusters &slony1;, vous pouvez placer dans
299   ce fichier le configuration pour se connecter à tous ces
300 clusters.</para></listitem>
301
302 <listitem><para><command>nagios_slony_test</command> est un script qui
303     a été construit pour interroger les fichiers logs afin de pouvoir
304     lancer le test de réplication réguliÚrement ( nous le laissons
305     toutes les 6 minutes) et qu'un outil de supervision tel que
306  <ulink
307 url="http://www.nagios.org/"> <productname>Nagios</productname>
308 </ulink> puisse utiliser le script to surveiller l'état indiqué
309 dans ces logs.</para>
310
311 <para> Il semble plus efficace qu'une tache
312 <application>cron</application> lance les tests et que
313 <productname>Nagios</productname> vérifie le résultat plutÎt que
314 de voir <productname>Nagios</productname> lancer directement
315 les tests.  Ces tests peuvent vérifier l'ensemble du cluster &slony1;
316 d'un seul coup, plutot que de voir <productname>Nagios</productname>
317 provoque des mises à jour en permanence.</para></listitem>
318
319 </itemizedlist></para>
320 </sect2>
321
322 <sect2><title> Autres tests de réplication</title>
323
324 <indexterm><primary>tester la réplication</primary></indexterm> 
325  
326 <para> La méthodologie de la section précédente est conçu avec un vue
327   pour minimiser le coût des requêtes de test; sur un cluster trÚs chargé,
328   supportant des centaines d'utilisateurs, le coût associé aux quelques
329   requêtes de test n'est un point important et le temps de configuration
330   des tables et des injecteurs de données est trÚs élevé.</para>
331
332 <para> 3 autres méthodes pour analyser l'état de la réplication sont
333 apparus :</para>
334
335 <itemizedlist>
336
337 <listitem><para> Pour un test orienté sur l'application, il est utile
338     de créer une vue sur une table fréquemment mise à jour pour remonter
339     des informations spécifique à l'application.</para>
340
341 <para> Par exemple, on peut chercher soit des statistiques
342   sur les objets applicatif les plus récents, soit les transactions
343   de l'applicatio. Par exemple :</para>
344
345 <para> <command> create view replication_test as select now() -
346 txn_time as age, object_name from transaction_table order by txn_time
347 desc limit 1; </command> </para>
348
349 <para> <command> create view replication_test as select now() -
350 created_on as age, object_name from object_table order by id desc
351 limit 1; </command> </para>
352
353 <para> Il y a un inconvénient : Cette approche nécessite que vous
354   ayez une activité constante sur le systÚme impliquant la création
355   de nouvelles transactions de maniÚre réguliÚre.
356   Si quelque chose ne fonctionne pas dans votre application. vous obtiendrez
357   des fausses alertes en provenance de la réplication, alors même que la réplication
358   fonctionne correctement.</para>
359
360 </listitem>
361
362 <listitem><para> La vue  &slony1; nommée <envar>sl_status</envar>
363     fournit des informations sur la synchronisation des différents noeuds.
364     Son contenu n'est intéressant que sur les noeuds origine, car les
365     événements générés sur les autres noeuds peuvent généralement
366     être ignorés. </para>
367 </listitem>
368
369 <listitem><para> Voir également la discussion sur <xref linkend="slonymrtg"/>. </para></listitem>
370
371 </itemizedlist>
372 </sect2>
373 <sect2><title> Fichiers de log</title>
374
375 <indexterm><primary>fichiers de log</primary></indexterm>
376
377 <para>Les démons <xref linkend="slon"/> génÚre des fichiers de logs plus
378   ou moins verbeux, selon le niveau de debug activé. Dans ce cas vous pouvez :
379
380 <itemizedlist>
381
382 <listitem><para> Utiliser un programme de rotations de logs comme
383 <application>rotatelogs</application> d'<productname>Apache</productname>
384  pour avoir une sécancer de fichiers de logs et évite d'avoir des fichiers
385 trop gros;</para></listitem>
386
387 <listitem><para> Purgez réguliÚrement les vieux fichiers de log.</para></listitem>
388
389 </itemizedlist>
390 </para>
391 </sect2>
392
393 <sect2><title>service </title>
394 <indexterm><primary>service pour BSD </primary></indexterm>
395
396 <sect3><title>slon</title>
397
398 <para> Ce script crée un répertoire pour le service slon qui pourra être
399   utilisé avec la commande svscan de daemontools. Ce script utilise multilog
400   de maniÚre trÚs basique, ce qui semble être standard pour les installations
401   daemontools / multilog. Si vous souhaitez une gestion intelligente des logs,
402   consultez la section logrep ci-dessous. Actuellement ce script à des possibilités
403   de gestion d'erreurs trÚs limitées.
404   </para>
405
406 <para> Pour les usages non-interactifs, configurer les variables d'environnement
407   suivantes :  <envar>BASEDIR</envar> <envar>SYSUSR</envar>
408 <envar>PASSFILE</envar> <envar>DBUSER</envar> <envar>HOST</envar>
409 <envar>PORT</envar> <envar>DATABASE</envar> <envar>CLUSTER</envar>
410 <envar>SLON_BINARY</envar> Si un seul de ces valeurs n'est pas définie,
411 le script demande les informations de maniÚre interactive.</para>
412
413 <itemizedlist>
414 <listitem><para>
415 <envar>BASEDIR</envar> l'emplacement où la structure du répertoire du service slon sera créée.
416 Il ne faut <emphasis>pas</emphasis> que ce soit le répertoire <filename>/var/service</filename>;</para></listitem>
417 <listitem><para>
418 <envar>SYSUSR</envar> l'utilisateur unix qui lancera le processus slon (et multilog);</para></listitem>
419 <listitem><para>
420 <envar>PASSFILE</envar> l'emplacement du fichier <filename>.pgpass</filename>. (par défaut <filename>~sysusr/.pgpass</filename>);</para></listitem>
421 <listitem><para>
422 <envar>DBUSER</envar> L'utilisateur postgres que slon doit utiliser ( par défaut slony);</para></listitem>
423 <listitem><para>
424 <envar>HOST</envar> l'adresse du serveur ou le slon doit se connecter (par défaut localhost)</para></listitem>
425 <listitem><para>
426 <envar>PORT</envar> le port de connexion (par défaut 5432)</para></listitem>
427 <listitem><para>
428 <envar>DATABASE</envar> la base de données sur laquelle slon se connecte (par défaut dbuser)</para></listitem>
429 <listitem><para>
430 <envar>CLUSTER</envar> le nom du cluster Slony1 (par défaut database)</para></listitem>
431 <listitem><para>
432 <envar>SLON_BINARY</envar> le chemin complet vers le binaire slon (par défaut <command>which slon</command>)</para></listitem>
433 </itemizedlist>
434 </sect3>
435 <sect3><title>logrep-mkservice.sh</title>
436
437 <para>Ce script utilise <command>tail -F</command> pour extraire des données des fichiers
438   de logs en vous permettant d'utiliser des filtres multilog (via l'option CRITERIA) afin
439   de créer des fichiers de logs spécifiques. Le but est de fournir un moyen de surveiller
440   les fichiers de logs en temps réel en quête de données  <quote>intéressante</quote>
441   sans devoir modifier le fichier de log initial ou gacher des ressources CPU/IO
442   en re-scannant les logs réguliÚrement.
443 </para>
444
445 <para>Pour une utilisation non interactive, il faut configurer les variable:
446   <envar>BASEDIR</envar> <envar>SYSUSR</envar> <envar>SOURCE</envar>
447 <envar>EXTENSION</envar> <envar>CRITERIA</envar>. Si une seul de ces options n'est
448 pas définie le script demande interactivement les informations de configuration.
449 </para>
450
451 <itemizedlist>
452 <listitem><para>
453 <envar>BASEDIR</envar> : l'emplacement où sera créée la structure du répertoire du service de logrep.
454 Il ne faut <emphasis>pas</emphasis> que ce soit le répertoire <filename>/var/service</filename>.
455 </para></listitem>
456 <listitem><para><envar>SYSUSR</envar> : l'utilisateur unix qui lancera le service.</para></listitem>
457 <listitem><para><envar>SOURCE</envar> : nom du service de log que vous voulez suivre.</para></listitem>
458 <listitem><para><envar>EXTENSION</envar> : un tag pour différencier ce logrep de ceux qui utilisent la même source.</para></listitem>
459 <listitem><para><envar>CRITERIA</envar> : le filtre multilog que vous voulez utiliser.</para></listitem>
460 </itemizedlist>
461
462 <para> Un exemple trivial consiste à produire un fichier de log de tous les messages d'erreur
463   slon qui pourrait être utilisé pour déclencher une alerte nagios :
464   <command>EXTENSION='ERRORS'</command>
465 <command>CRITERIA="'-*' '+* * ERROR*'"</command>
466 (On relance la surveillance en déclenchant une rotation des logs avec <command>svc -a $svc_dir</command>)
467 </para>
468
469 <para> Une application plus intéressante est la surveillance de la progression d'une souscription d'un noeud :
470 <command>EXTENSION='COPY'</command>
471 <command>CRITERIA="'-*' '+* * ERROR*' '+* * WARN*' '+* * CONFIG enableSubscription*' '+* * DEBUG2 remoteWorkerThread_* prepare to copy table*' '+* * DEBUG2 remoteWorkerThread_* all tables for set * found on subscriber*' '+* * DEBUG2 remoteWorkerThread_* copy*' '+* * DEBUG2 remoteWorkerThread_* Begin COPY of table*' '+* * DEBUG2 remoteWorkerThread_* * bytes copied for table*' '+* * DEBUG2 remoteWorkerThread_* * seconds to*' '+* * DEBUG2 remoteWorkerThread_* set last_value of sequence*' '+* * DEBUG2 remoteWorkerThread_* copy_set*'"</command>
472 </para>
473
474 <para>Si vous avez un log de suscription, alors il est facile
475   de déterminer si un noeud donné est en train de réaliser une copie
476   ou une autre activité de souscription. Si les log ne sont pas vide et
477   ne se termine pas par 
478 <command>"CONFIG enableSubscription: sub_set:1"</command>
479 (ou 1 est le numéro d'ensemble de réplication que vous avez abonné)
480 alors le slon est au milieu d'une copie initiale.</para>
481
482 <para> Si vous surveiller le mtime du fichier de log de votre noeud primaire
483   pour déterminer si le slon est tombé dans le coma, vérifier ce log de souscription
484   est un bon moyen d'éviter de stopper le noeud alors qu'un souscription est en cours.
485   En bonus, puisque les slons utilise svscan, vous pouvez simplement détruire le fichier
486   ( via l'interface svc ) et laisser svscan le recommencer plus tard. J'ai également
487   découvert que les logs de COPY sont pratiques pour suivre de maniÚre interactive
488   l'activité des souscritpions.
489   </para>
490 </sect3>
491
492 </sect2>
493 </sect1>
Note: See TracBrowser for help on using the browser.