root/traduc/trunk/slony/bestpractices.xml

Revision 1173, 34.1 kB (checked in by gleu, 3 weeks ago)

Modifications pour permettre la génération du manuel.
Patch de Christophe Bouchet, avec quelques modifications supplémentaires de ma
part.
Cependant, il reste encore du travail pour avoir une génération parfaite.

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="bestpractices">
8   <title> &slony1; <quote>Bonnes Pratiques</quote> </title>
9   <indexterm><primary>bonnes pratiques pour utiliser &slony1;</primary></indexterm>
10   <para> Il est courant pour les administrateurs de vouloir exploiter des systÚmes
11   en utilisant un ensemble de <quote>bonnes pratiques</quote> disponibles et documentées.
12   Documenter ce genre de choses est essentiel pour l'ISO 9000, l'ISO 9001,
13   et d'autres type de certifications d'organisation. </para>
14
15   <para> Il est intéressant d'introduire toute discussion sur des <quote>bonnes
16   pratiques</quote> en mentionnant que chaque organisation utilisant &slony1; est unique,
17   et qu'il est nécessaire qu'une politique locale reflÚte les caractéristiques administratives locales.
18   C'est pour cette raison que &slony1; n'impose <emphasis>as</emphasis> ses propres rÚgles pour des
19   choses telles que <link linkend="failover">les bascules d'urgence</link>; elles devront être déterminées
20   en fonction de l'architecture globale de votre réseau, de votre ensemble de serveurs de base de données,
21   et de votre maniÚre d'utiliser ces serveurs.</para>
22
23   <para> Il y a toutefois, un certain nombre de choses que les pionniers de &slony1; ont
24   découvertes qui peuvent au moins aider à concevoir le genre de rÚgles d'administration
25   que vous pourriez mettre en place. </para>
26   <itemizedlist>
27     <listitem>
28       <para> &slony1; est systÚme multi-clients et multi-serveurs complexe,
29       ce qui implique qu'il existe un ensemble presque infini d'endroits
30       où des problÚmes peuvent surgir.</para>
31
32       <para> c'est donc naturellement que la maintenance d'un environnement propre, cohérent
33       est réellement décisif, car tout type de <quote>cafouillage</quote> dans l'environnement
34       peut provoquer des problÚmes ou masquer le problÚme réel. </para>
35
36       <para> De nombreux utilisateurs ont rapportés des problÚmes provenants d'incompatibilités
37       entre les versions de &slony1;, les librairies locales, et les librairies de &postgres;.
38       Chaque détail compte : vous devez identifier clairement sur quels hÃŽtes sont hébergées
39       quelles versions de quels logiciels. </para>
40
41       <para> Normalement il s'agit juste d'être discipliné lors du déploiement de vos logiciels, et
42       ce défi est une conséquence naturelle lorsqu'on met en place un systÚme distribué constitué
43       par un grand nombre de composants qui doivent correspondre.</para>
44     </listitem>
45
46     <listitem>
47       <para> Si un script slonik ne fonctionne pas comme prévu à la premiÚre
48       tentative, il serait téméraire de tenter de l'exécuter à nouveau tant que le
49       problÚme n'a pas été trouvé et résolu.  </para>
50
51       <para> Il y a trÚs peu de commandes slonik tel que <xref
52       linkend="stmtstorepath"/> qui se comporte de maniÚre déterministe;
53       si vous exécuter <xref linkend="stmtstorepath"/> plusieurs fois,
54       cela mettra plusieurs fois la même valeur dans la table
55       <envar>sl_path</envar>.  </para>
56
57       <para> Au contraire <xref linkend="stmtsubscribeset"/> se comporte de
58       deux maniÚres <emphasis>trÚs</emphasis> différentes selon si
59       l'abonnement a déjà été activé ou pas; si l'initialisation de
60       l'abonnement n'a pas fonctionné à la toute premiÚre tentative,
61       soumettre à nouveau cette requête n'arrangera <emphasis>pas</emphasis>
62       la situation. </para>
63     </listitem>
64
65     <listitem>
66       <para> Principe: Utilisez un zone de temps ("timezone") stable et non-ambigÃŒe
67       tel que UTC ou GMT.</para>
68
69       <para> Les utilisateurs ont rencontrés des problÚmes pour faire fonctionner
70       &lslon; correctement lorsque leur systÚme utilisait une zone de temps que
71       &postgres; ne pouvait pas reconnaître tel que CUT0 ou WST. Il est nécessaire
72       que vous utilisiez une zone de temps que &postgres; reconnaît correctement.
73       De plus, il est préférable d'utiliser une zone qui n'est pas soumise au
74       basculement entre heure d'été et heure d'hivers.</para>
75
76       <para> Le choix <quote>géographiquement neutre</quote> semble être
77       <command><envar>TZ</envar>=UTC</command> ou
78       <command><envar>TZ</envar>=GMT</command>, par ailleurs Assurez-vous que
79       vos serveurs sont <quote>synchronisés</quote> grâce à l'utilisation
80       de NTP sur l'ensemble de votre environnement. </para>
81
82       <para> Voir aussi <xref linkend="times"/>.</para>
83     </listitem>
84
85     <listitem>
86       <para> Principe: Les transactions longues c'est mal </para>
87
88       <para> La FAQ a un chapitre sur la <link linkend="pglistenerfull">croissance de
89       &pglistener; </link> qui explique tout cela en détails; pour simplifier :
90       les transactions longues ont de nombreux effets secondaires. Elles sont problématiques
91       en particulier sur un noeud <quote>origine</quote>, s'accaparant les verrous, rendant inefficace
92       les vacuums , et ainsi de suite.</para>
93
94       <para> Dans la version 1.2, certains comportement <quote>désagréables</quote> devraient
95       être diminués car :</para>
96
97       <itemizedlist>
98         <listitem>
99           <para> Les événements dans &pglistener; sont seulement générés lorsque
100           les mise à jours de réplication sont relativement rare, ce qui devrait
101           impliquer que les systÚmes chargés ne vont pas générer beaucoup de tuples morts
102           dans cette table.</para>
103         </listitem>
104
105         <listitem>
106           <para> Le systÚme va périodiquement faire une rotation (en utilisant
107           <command>TRUNCATE</command> pour nettoyer l'ancienne table) entre les deux tables de logs,
108           <xref linkend="table.sl-log-1"/> et <xref linkend="table.sl-log-2"/>, évitant une croissance illimitée de l'espace <quote>mort</quote> à cet endroit.  </para>
109         </listitem>
110       </itemizedlist>
111     </listitem>
112     <listitem>
113       <para>Les rÚgles de  <link linkend="failover"> Bascule en urgence </link>
114       devraient être planifiées à l'avance.  </para>
115
116       <para> Cela peut simplement se résumer à réfléchir à une liste
117       de priorité indiquant ce qui devrait basculer vers quoi, plutÃŽt
118       que d'essayer d'automatiser la bascule. Quoiqu'il en soit savoir
119       au préalable ce qu'il faut faire réduit le nombre d'erreurs commises.</para>
120
121       <para> Chez Afilias, une grande variété de guide interne, tel que <citation>Le guide
122       de l'administrateur réveillé à 3 heures du matin..</citation>, ont été
123       rédigé pour fournir les procédures à suivre en cas d'événements <quote>malheureux</quote>.
124       Ce genre de matériel est hautement spécifique à l'environnement  et à l'ensemble d'applications
125       présentes, donc vous devriez rédiger vos propres documents. Ceci est un des composants vitaux de
126       tout procédure de reprise aprÚs crash.</para>
127     </listitem>
128
129     <listitem>
130       <para> <xref linkend="stmtmoveset"/> doit être utliséᅵ pour
131       la maintenance préventive afin d'éviter l'apparition des
132       problÚmes nécessitant une <link linkend="failover">
133       bascule aprÚs panne ("failover") </link>. </para>
134     </listitem>
135
136     <listitem>
137       <para> La politique de <command>VACUUM</command> doit être
138       définie avec soin.</para>
139
140       <para> Comme indiqué précédemment, <quote>les transactions longues sont maléfiques.</quote>
141       La commande <command>VACUUM</command> n'est pas une exception à cette rÚgle.
142       Un <command>VACUUM</command> sur une grande table ouvrira une transaction longue
143       qui aura tous les effets négatifs déjà cités.</para>
144     </listitem>
145
146     <listitem>
147       <para> Si vous utiliser le processus autovacuum process avec une
148       version récente de &postgres;, vous pouvez éviter de le faire pour les tables &slony1;
149       car &slony1; est un peu plus intelligent que le démon autovaccuum lorsqu'il s'agit de
150       vacuum dans des conditions de réplication ( <emphasis>par exemple</emphasis> : la purge
151       des anciennes données ).</para>
152
153       <para> Reportez-vous au chapitre <xref linkend="maintenance-autovac"/> pour plus de
154       détails. </para>
155     </listitem>
156
157
158     <listitem>
159       <para> Il a été prouvé qu'il est préférable d'exécuter tous les démons &lslon;
160       sur un serveur central pour chaque sous-réseau. </para>
161
162       <para> Chaque &lslon; doit être hébergé par hÃŽte sur le même réseau local que
163       le noeud qu'il opÚre, car il envoie <emphasis>beaucoup</emphasis> de
164       communications avec sa base de donnée et que la connexion doit être aussi fiable
165       que possible.</para>
166
167       <para> En théorie, les <quote>meilleures</quote> performances sont prévues lorsque
168       le &lslon; fonctionne sur le même serveur que la base qu'il opÚre. </para>
169
170       <para> En pratique, déployer les processus &lslon; processes et leur configuration
171       à travers un réseau d'une douzaine de serveurs se révÚle être difficilement gérable.</para>
172     </listitem>
173
174     <listitem>
175       <para>Les processus &lslon; doivent évoluer dans le même
176       <quote>contexte réseau</quote> que le noeud qu'il opÚre, afin que la
177       liaison entre eux soir une connexion <quote>locale</quote>. 
178       N'établissez <emphasis>pas</emphasis> ce genre de liaison à
179       travers un réseau WAN. </para>
180
181       <para> Une coupure de lien WAN  peut provoquer des connexions
182       <quote>zombies</quote>, et le comportement typique du TCP/IP consiste à
183       <link linkend="multipleslonconnections"> laisser ces connexions persister,
184       empêchant le démon slon de redémarrer pendant environ deux heures. </link></para>
185
186       <para> Il n'est pas difficile de remédier à cela; Vous devez simplement tuer les
187       processus liés aux connexions persistantes avec la commande <command>kill
188       SIGINT</command>. Cependant en exécutant  les &lslon; localement, vous êtes
189       généralement à l'abri de ce genre de problÚmes. </para>
190     </listitem>
191
192     <listitem>
193       <para> Si vous rencontrez ce genre de problÚmes, avant de vous exciter,
194       essayez de tuer et redémarrer tous les processus &lslon;.
195       Historiquement, cette méthode a souvent résolu ce genre de
196       <quote>petit tracas.</quote>.</para>
197
198       <para>A quelques rares exceptions, il n'est pas trÚs grave de tuer et relancer les
199       processus &lslon;. Chaque &lslon; se connecte à la base de données qu'il gÚre, puis
200       ouvre les connexions nécessaires à la propagation des événements.
201       Si vous tuer un &lslon;, vous provoquez simplement l'interruption de ces connexions.
202       Si un évÚnement <command>SYNC</command> ou un autre événement est en cours de propagation,
203       il n'y a pas de problÚme : la transaction sera annulée ("roll back") et lorsque le &lslon;
204       sera relancé, l'évÚnement sera retraiter à partir de zéro.</para>
205
206       <para> L'exception qui rend un redémarrage de &lslon; indésirable est le cas
207       où une commande <command>COPY_SET</command> est en cours d'exécution sur un
208       grand ensemble de réplication. Dans ce genre de cas, arrêter un &lslon; peut
209       annuler plusieurs heures de travail. </para>
210
211       <para> Dans les premiÚres versions de &slony1;, il était fréquent que
212       des connexions soient un peu <quote>dérangée</quote>, ce qu'on pouvait
213       réparer en redémarrant &lslon;.  Ceci est devenu nettement plus rare,
214       mais il est parfois utile de redémarrer &lslon;.  En cas de 
215       <quote>panne réseau</quote>, cela peut résoudre le problÚme des
216       connexions à la base défuntes.</para>
217     </listitem>
218
219     <listitem>
220       <para>La section sur les <link linkend="ddlchanges">changements de modÚle de données</link>
221       détaille quelques bonnes pratiques qui sont utiles lorsque l'on souhaite modifier le
222       schémas de la base de données. </para>
223     </listitem>
224
225     <listitem>
226       <para> Gestion des clefs primaires </para>
227
228       <para> Comme précisé dans la section <link linkend="definingsets">
229       Ensembles de réplication</link>, il est <emphasis>idéal</emphasis> que
230       chaque table répliquée dispose d'un vraie contrainte de clef primaire;
231       il est <emphasis>acceptable</emphasis> d'utiliser une <quote>clef primaire
232       candidate.</quote></para>
233
234       <para> Il n'est <emphasis>pas recommandé</emphasis> d'utiliser une clef définie
235       par &slony1; (crée par <xref linkend="stmttableaddkey"/>) pour
236       proposer une clef primaire candidate, car cela introduit la possibilité
237       d'échecs de certaines mises à jour sur la table à cause de l'index unique de cette
238       clef. Ceci entraînerait potentiellement des bugs dans votre application à cause
239       de &slony1;.</para>
240
241
242       <warning><para> Dans la version 2 de &slony1;, <xref
243       linkend="stmttableaddkey"/> n'est plus supportée. Vous <emphasis>devez</emphasis> absolument
244       avoir soit une vraie clef primaire, soit une clef primaire candidate.</para></warning>
245     </listitem>
246
247     <listitem>
248       <para> La section <link linkend="definesets"> Définir les ensembles de réplication
249       </link> vous suggÚre des stratégies pour déterminer comment regrouper les tables
250       et les séquences en ensembles de réplication. </para>
251     </listitem>
252
253     <listitem>
254       <para> Il est évident que les actions qui peuvent supprimer beaucoup
255       de données doivent être effectuées avec le plus grand soin; La section
256       <link linkend="dropthings">Supprimer des éléments de la réplication</link>
257       évoque les différentes sortes de <quote>suppression</quote> que &slony1; supporte.  </para>
258     </listitem>
259
260     <listitem>
261       <para> <link linkend="locking">ProblÚmes d'inter-blocages</link></para>
262
263       <para> Certaines opérations &slony1;, notament <link linkend="stmtsetaddtable"> <command>set add table</command> </link>,
264       <link linkend="stmtmoveset"> <command> move set</command> </link>,
265       <link linkend="stmtlockset"> <command> lock set </command> </link>,
266       et <link linkend="stmtddlscript"> <command>execute script</command>
267       </link> nécessite l'acquisition de <emphasis>verrous exclusifs</emphasis> sur les tables répliquées.</para>
268
269       <para> En fonction de type d'activité de votre base de données, cela
270       peut ( ou pas ) provoquer des coupures de services ( heureusement assez brÚves ). </para>
271     </listitem>
272
273     <listitem>
274       <para> Que faire des ordres DDL ? </para>
275
276       <para> &slony1; fonctionne en détectant les mises à jour sur les tables
277       grâce à des triggers qui sont placés sur ces tables.
278       Cela implique que les mises à jours que sont font au moyen de
279       méthodes qui ne déclenche pas les triggers ne seront pas propagées.
280       Les commandes <command>ALTER TABLE</command>, <command>CREATE OR
281       REPLACE FUNCTION</command>, <command>CREATE TABLE</command>, sont toutes
282       des requêtes SQL que &slony1; ne peut pas détecter. </para>
283      
284       <para> Pour ce genre de situation, la philosophie de &slony1;
285       consiste à considérer que les développeurs compétents n'écrivent
286       jamais de code auto-modifiant et en particulier du code modifiant
287       les modÚles de données à la volée. &slony1; ne cherche pas à faciliter
288       ce genre de modification du schémas de données. </para>
289      
290       <para> Cependant il existe des cas où cela est nécessaire, ainsi la <link
291       linkend="stmtddlscript"> <command>execute script</command> est fournie
292       pour appliquer des changements DDL au même point dans
293       le flux de transactions sur tous les serveurs.</link> </para>
294      
295       <para> Malheureusement, cela provoque de nombreux verrous sur
296       les objets de la base de données. Modifier les tables nécessite
297       de l'acquisition d'un verrou exclusif sur ces objets; ainsi le
298       <command>script d'exécution des modification</command> entraîne
299       un verrous exclusif sur <emphasis>toutes</emphasis> les tables
300       répliquées. Cela peut s'avérer trÚs problématiques lorsque les
301       applications fonctionnent; des inter-blocages ("deadlocks") peuvent
302       alors se produire.</para>
303
304       <para> Une position particuliÚrement dogmatique défendue par certains
305       consiste à dire qu'il faut <emphasis>toujours</emphasis> propager
306       les changements de modÚles de données avec un <command>script d'exécution</command>.
307       Cela garantit que les noeuds restent consistants, cependant le coût des verrous
308       et des inter-blocages est trop élevé pour certains utilisateurs.</para>
309
310       <para> Chez Afilias, notre approche est moins dogmatique; il y a
311       <emphasis>certains</emphasis> changements qui
312       <emphasis>doivent</emphasis> être appliquées avec un <command>script d'exécution</command>,
313       mais nous appliquons certaines modification de maniÚre indépendante.</para>
314    
315       <itemizedlist>
316         <listitem>
317           <para> Liste de changements qui doivent être effectuée dans un <command>script d'exécution</command> :</para>
318           <itemizedlist>
319             <listitem>
320               <para> Toutes les commandes <command>ALTER TABLE</command></para>
321             </listitem>
322           </itemizedlist>
323         </listitem>
324         <listitem>
325           <para> Listes des changement qui ne nécessitent pas un <command>script d'exécution :</command> </para> 
326           <itemizedlist>
327             <listitem>
328               <para> <command>CREATE INDEX</command> </para>
329             </listitem>
330             <listitem>
331               <para> <command>CREATE TABLE</command> </para>
332               <para> Les tables qui ne sont pas répliquées n'ont pas besoin de ces mécanismes.</para>
333             </listitem>
334             <listitem>
335               <para> <command>CREATE OR REPLACE FUNCTION </command> </para>
336               <para> Typiquement, le chargement de nouvelles version de fonctions
337               peut être effectuée sans que &slony1; en soit <quote>averti</quote>.
338               A l'exception évidente des cas où la nouvelle fonction est déployée suite
339               à la modification d'une table. Dans ce cas là, la nouvelle version
340               doit être déployé de maniÚre synchronisée avec le
341               <command>script d'exécution</command> qui modifie la table.</para>
342
343               <para> De la même maniÚre, les ordres <command>CREATE TYPE</command>, <command> CREATE
344               AGGREGATE </command>,  etc. n'ont pas besoin d'être forcément insérés de
345               maniÚre <quote>parfaitement synchronisés</quote> sur l'ensemble des noeuds.</para>
346             </listitem>
347             <listitem>
348               <para> Les ordres de gestion des autorisations, tels que <command> CREATE USER
349               </command>, <command> CREATE ROLE </command>, <command>GRANT
350               </command>, etc. sont inutile pour &slony1; car il est exécuté avec les droits
351               de <quote>super-utilisateur</quote>. </para>
352
353               <para>Dans la pratique, il est utile d'avoir différentes politiques de sécurité
354               sur les noeuds. L'accÚs au noeud <quote>maître</quote> doit être limité aux
355               applications qui en ont réellement besoin; Les utilisateurs effectuant de
356               l'extraction de données ("reporting") ont généralement des droits plus limités
357               sur le noeud maître que sur les noeuds abonnés.</para>
358             </listitem>
359           </itemizedlist>
360         </listitem>         
361       </itemizedlist>
362     </listitem> 
363     <listitem id="slonyuser">
364       <para> Noms d'utilisateur spécifiques à &slony1;. </para>
365
366       <para> Il s'est avéré utile de définir un utilisateur <command>slony</command> employé
367       uniquement par &slony1;, un utilisateur distinct de l'utilisateur générique
368       <command>postgres</command> ou <command>pgsql</command>.  </para>
369
370       <para> Lorsque toutes sortes d'activités de <quote>maintenance</quote>
371       automatiques, telles que les <command>vacuum</command> et les sauvegardes,
372       sont effectuées avec l'<quote>identité</quote> de l'utilisateur &postgres;
373       , cela peut assez facilement provoquer des problÚmes d'inter-blocages ("deadlocks").</para>
374
375       <para> Par exemple, une série de <command>vacuums</command> qui sont
376       lancés de maniÚre inattendue sur une base de donnée avec un gros événement
377       <command>SUBSCRIBE_SET</command> en cours d'exécution pourra entraîner des
378       inter-blocages qui annuleront plusieurs heures de travail de copie de données.
379       </para>
380
381       <para> À l'inverse, si les différentes opérations de maintenance sont exécutées par
382       différents utilisateurs, vous pourrez assurer la réussite d'une opération vitale
383       telle que <command>SUBSCRIBE_SET</command>, en bloquant les autres utilisateurs
384       au niveau du fichier <filename>pg_hba.conf</filename>, et autorisant uniquement
385       l'utilisateur slony, ce qui réduit considérablement le risque de problÚmes lors d'un
386       processus de souscription.</para>
387     </listitem>
388     <listitem>
389       <para> Configuration des chemins</para>
390       <para> La section sur les <link linkend="plainpaths"> voies de communications
391       </link> évoque les problÚmes liés aux connexions réseau nécessaire au
392       bon fonctionnement de &slony1;.</para>
393     </listitem>
394
395     <listitem>
396       <para> Réduction des super-pouvoirs </para>
397       <para> Traditionellement, on considÚre que <quote>&slony1; a besoin
398       de connexions en mode super-utilisateurs</quote>. Cela n'est pas
399       totalement vrai et si l'usage excessif de comptes super-utilisateurs
400       pose problÚme, il est possible de réduire nettement cet usage.</para>
401
402       <para> Il est vrai que chaque  &lslon; <emphasis>doit</emphasis>
403       avoir une connexion super-utilisateur afin de gérer le noeud dont il opÚre.
404       Il doit pouvoir modifier le catalogue systÚme afin de mettre en place les
405       souscriptions et  procéder aux modifications
406       (<emphasis>par exemple</emphasis> - pour exécuter <xref linkend="stmtddlscript"/> et
407       d'autres évÚnement qui peuvent modifier le rÃŽle d'une tables répliquées sur un noeud
408       local).  </para>
409
410       <para> Toutefois, les connexions que les processus &lslon; ouvrent vers d'autres noeuds
411       afin d'accéder aux événements et aux souscriptions n'ont pas besoin d'avoir
412       d'autant de permissions. Ainsi, on peut mettre en place un  <quote>utilisateur
413       faible</quote> assigné à toutes les requêtes <xref linkend="stmtstorepath"/>.
414       Les permissions minimales de cet utilisateur, appellons-le
415       <command>weakuser</command>, sont les suivantes :</para>
416       <itemizedlist>
417         <listitem>
418           <para> Il doit avoir accÚs en lecture sur le namespace spécifique de &slony1;</para>
419         </listitem>
420         <listitem>
421           <para> Il doit avoir accÚs en lecture sur toutes les tables et les séquences de ce namespace</para>
422         </listitem>
423         <listitem>
424           <para> Il doit avoir accÚs en écriture sur la table <envar>sl_nodelock</envar> et la séquence <envar>sl_nodelock_nl_conncnt_seq</envar> </para>
425         </listitem>
426         <listitem>
427           <para> Lors de la souscrition, il doit avoir accÚs en lecture sur toutes les tables répliquées.</para>
428           <para> AprÚs la souscription, il n'est plus nécessaire d'accéder aux tables répliquées. </para>
429         </listitem>
430         <listitem>
431           <para> Il est parfois nécessaire de lire les tables dans pg_catalog; sans qu'on ait pu vérifier
432           à quel niveau d'accÚs est convenable. </para>
433         </listitem>
434       </itemizedlist>
435     </listitem>
436     <listitem>
437       <para> Dans la version 1.3, les tests du <xref linkend="testbed"/>
438       permettent l'utilisation d'un utilisateur faible (<envar>WEAKUSER</envar>) afin de
439       tester si les permissions définies sont suffisantes pour supporter la réplication.</para>
440     </listitem>
441     <listitem>
442       <para> La section sur les <link linkend="listenpaths"> voies d'écoute </link>
443       parle des problÚmes entourant la table <xref linkend="table.sl-listen"/>.</para>
444
445       <para> A partir la version &slony1; 1.1, le contenu de cette table
446       était calculé automatiquement en se basant sur les informations
447       dont disposait &slony1; ce qui devrait supprimer les problÚmes
448       rencontrés. Beaucoup de problÚmes de communication inexplicables,
449       avec des noeuds qui n'arrive pas à se parler alors que c'est techniquement
450       possible, étaient du à une configuration incorrecte des voies d'écoutes.</para>
451     </listitem>
452
453     <listitem>
454       <para> Utilisez <filename>test_slony_state.pl</filename> pour rechercher
455       les problÚmes de configuration.</para>
456
457       <para>Il s'agit d'un script Perl qui se connecte à un noeud &slony1; puis
458       parcours la configuration &slony1; à la recherche de différentes conditions
459       qui indique la présence de problÚmes, en particulier :</para>
460       <itemizedlist>
461         <listitem><para>le gonflement de certaines tables de congfiguration;</para></listitem>
462         <listitem><para>l'analyse des voies d'écoute;</para></listitem>
463         <listitem><para>l'analyse de la propagation et de la confirmation des événements.</para></listitem>
464       </itemizedlist>
465
466       <para> Si, de maniÚre mystérieuse, la réplication <quote>ne marche pas</quote>, cet outil
467       peut vérifier beaucoup de problÚmes potentiels pour vous. </para>
468     </listitem>
469     <listitem>
470       <para> Configurer &lslon; </para>
471
472       <para> A partir de la version 1.1, la configuration de &lslon;
473       peut être définie par ligne de commande ou dans des fichiers de
474       configuration. De <quote>bonnes</quote> pratiques sont
475       conseillédans les deux cas :
476       </para>
477       <itemizedlist>
478         <listitem>
479           <para> Configuration via les options en ligne de commande</para>
480
481           <para> Cette approche à le mérite de rendre visible dans
482           l'environnement systÚme toutes les options actives.
483           (Ainsi s'il y en a beaucoup cela peut devenir pénible
484           à lire)</para>
485
486           <para>Malheureusement, si vous invoquer &lslon; à partir d'une
487           ligne de commande, vous pouvez <emphasis>oublier</emphasis> d'inclure
488           la configuration de &logshiplink; et ainsi détruire les
489           séquences de logs pour les noeuds de log shipping.</para>
490         </listitem>
491         <listitem>
492           <para> A la différence  des options en ligne de
493           commande les options actives ne sont <emphasis>pas</emphasis> visible.
494           Elles peuvent seulement être positionnées à partir u nom
495           et du contenu du fichier de configuration de &lslon;, et ne
496           refléteront pas les changements apparus dans le fichier de
497           configuration.</para>
498
499           <para> En plaçant les options dans un fichier, vous n'oublierez
500           aucune, ce qui est plus sur pour &logshiplink;. </para>
501         </listitem>
502       </itemizedlist>
503     </listitem>
504     <listitem>
505       <para> Taches à faire loque l'on abonne un noeud </para>
506       <para> Lorsqu'un nouveau noeud exécute l'événement <command>COPY_SET</command>
507       sur un grand ensemble de réplication (<emphasis>par
508       exemple</emphasis> - un ensemble qui nécessite un abonnement de
509       plusieurs heures) il est prouvé qu'il est souhaitable de
510       verrouiller l'accÚs au noeud pour tous les utilisateurs
511       autres que <command>slony</command> car :</para>
512       <itemizedlist>
513         <listitem>
514           <para> Les applications s'exécutent sur des
515           données partiellemen copiées qui ne seront pas
516           consistantes.</para>
517         </listitem>
518         <listitem>
519           <para>Il est possible que certaines applications (et
520           certains scripts de maintenance) soumettent une combinaison
521           de requêtes qui placeront le systÚme dans une situation
522           d'inter-blocage ("deadlock"), ce qui annulera l'événement
523           <command>COPY_SET</command>, et impliquera le ré-abonnement
524           complet du noeud.</para>
525         </listitem>
526       </itemizedlist>
527     </listitem>
528 </itemizedlist>   
529 <para> Il <emphasis>peut</emphasis> être intéressant de
530 désactive la fonctionnalité<function>fsync</function> de &postgres;
531 pendant le copie des données, car cela améliorera les performances,
532 et en cas d'échec lors de l'évÚnement
533 <command>COPY_SET</command>, vous pourrez redémarrer avec un copie entiÚre de l'ensemble de réplication.</para>
534 <itemizedlist>           
535     <listitem>
536       <para> Gestion de slonik </para>
537       <para> Les notes sur <link linkend="usingslonik">l'utilisation de
538       Slonik </link> décrivent certaines lessons apprises en
539       gérant un grand nombre de scripts <xref linkend="slonik"/>.</para>
540       <para> Voici les principes importants se sont dégagés lors de
541       la création de ces scripts :</para>
542       <itemizedlist>
543         <listitem>
544           <para>Utiliser des fichiers <quote>préambule</quote>
545           est <emphasis>hautement recommandé</emphasis> car cela implique
546           que vous utilisiez et    réutilisiez des
547           préambules vérifié maintes fois.</para>
548         </listitem>
549         <listitem>
550           <para>Toute opportunité de générer automatiquement
551           la configuration soit en la récpérant dans une base de
552           données, soit en utilisant un script de génération vous
553           aidera à éviter les erreurs humaines.</para>
554         </listitem>
555       </itemizedlist>
556     </listitem>
557     <listitem>
558       <para>GÚrer un trÚs grand ensemble de réplication</para>
559       <para> Certains utilisateurs ont bâti des réplications sur des
560       ensembles de plusieurs dizaines, voire plusieurs centaines de
561       gigabytes, ce qui ajoute des <quote>contraintes</quote> sur le
562       systÚme, n particulier lorsqu'il faut plusieurs jours pour
563       effectuer un évÚnement  <command>COPY_SET</command>.
564       Voici quelques principes qui ont été définis
565       pour gérer ce genre de situations.</para>
566     </listitem>
567     <listitem>
568       <para> Supprimer tous les index autres que les index
569       primaire lorsque l'évÚnement en<command>COPY_SET</command>
570       est exécuté.</para>
571  
572       <para> Lorsque les données sont copiées dans une table qui
573       dispose d'index, &postgres; construit les index de maniÚre
574       incrémentale, à la vole.
575       Ceci est beaucoup plus lent que simplement copier les donnés
576       dans une table puis de recréerchaque index <quote>ex nihilo</quote>,
577       car cette derniÚre opération profite de l'avantage de la
578       mémoire de tri. </para>
579  
580       <para> Dans &slony1; version 1.1.5 et dans les versions
581       ultérieures, les index sont supprimés et
582       recréés automatiquement, ce qui rend caduque ce
583       conseil.</para>
584     </listitem>
585     <listitem>
586       <para> Si beaucoup de mises à jour ont lieu lorsque de
587       grands ensemble sont copiés, ceci peut mener à un nombre
588       énormed'événements<command>SYNC</command> sur le
589       noeud qui s'abonne.</para>
590
591       <para>Si un <command> SYNC </command> est généré
592       une fois par seconde, ceci conduit à un <quote>retard</quote>
593       de plus de 90,000 <command>SYNC</command>s par jour, pendant
594       probablement plusieurs jours.  </para>
595  
596       <para>ParallÚlement
597       on constatera une croissance <emphasis>énorme</emphasis>
598       des tables <xref linkend="table.sl-log-1"/> et <xref
599       linkend="table.sl-seqlog"/>. 
600       Malheureusement, une fois que <command>COPY_SET</command>
601       est complété, on constate que les requêtes sur
602       ces tables se font via <command>seq scans</command>,
603       mémé si le <command>SYNC</command> ne traite qu'une petite
604       partie de ces 90 000 événements<command>SYNC</command>
605       la table sera lue dans son ensemble. Dans de tel cas, il
606       est possible que le noeud abonné ne rattrape
607       jamais le noeud origine.</para>
608
609       <para> Plusieurs taches peuvent résoudre ce problÚme,
610       notamment en réglant avec soin les paramÚtres
611       &lslon; :</para>
612     </listitem>
613     <listitem>
614       <para>Assurez-vous qu'il existe sur le noeud
615       <quote>maître</quote>, un index sur  <function> sl_log_1(log_xid)</function>.
616       S'il n'y en a pas, comme avec les versions de &slony1;
617       inférieure à la version 1.1.1, regardez dans le fichier
618       <filename> slony1_base.sql </filename> pour
619       la configuration correcte de cet index. </para>
620
621       <para> Dans les versions 1.2 et suivantes, il y a un processus
622       qui ajoute automatiquement les index partiels par numéro de noeud
623       d'origine, ce qui est la forme optimale pour ces index.</para>
624     </listitem>
625     <listitem>
626       <para>Sur un noeud abonné, ajouter le nombres
627       d'évÚnements<command>SYNC</command>
628       traités ensemble, en réglant le paramÚtre
629       <xref linkend= "slon-config-sync-group-maxsize"/>
630       à une valeur lui permettant une portion significative
631       de la masse d'événements <command>SYNC</command>. </para>
632     </listitem>
633     <listitem>
634       <para>Sur le noeud abonné, régler le paramÚtre
635       <xref linkend="slon-config-desired-sync-time"/>
636       à 0, car le systÚme de regroupent adaptatif des
637       <command>SYNC</command>
638       fonctionne a avec de petits groupes, qui sous certaines
639       circonstances, donne de mauvaises performances.
640       </para>
641     </listitem>
642     <listitem>
643       <para> Augmenter le
644       <xref linkend="slon-config-sync-interval"/>
645       sur le noeud origine  <xref linkend="slon"/>
646       afin que les événement<command>SYNC</command>
647       soit générés moins fréquemment.
648       Si un <command>SYNC</command> est simplement
649       généré une fois par minute plutÃŽt qu'une fois par seconde, cela
650       divisera par soixante le nombre d'évÚnements.
651       </para>
652     </listitem>
653     <listitem>
654       <para> Il faudra probablement utiliser le
655       <xref linkend="slon-config-vac-frequency"/> pour
656       désactiver les vacuum lancés par<xref linkend="slon"/>
657       afin d'utiliser vos propres scripts de vacuum,
658       car il y aura un masse de données non-purgeables pendant
659       que les données seront copiées et
660       que l'abonné commencera à rattraper le fournisseur.
661       </para>
662     </listitem>
663   </itemizedlist>
664 </sect1>
Note: See TracBrowser for help on using the browser.