root/traduc/trunk/slony/addthings.xml

Revision 1173, 19.7 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="addthings">
8 <title>Ajouter des objets à la réplication</title>
9
10 <indexterm><primary>ajouter des objets à la réplication</primary></indexterm>
11
12 <para>Vous découvrirez peut-être que vous avez oubliez des choses que
13 vous vouliez répliquer.</para>
14
15 <para>En général, on peut trÚs aisément y remédier. Cette section propose
16 une  <quote>tour d'horizon</quote> des moyens pour répondre à la
17 question <quote>Comment réaliser la tache <emphasis>X</emphasis> avec &slony1;?</quote>, pour différente valeur de <emphasis>X</emphasis>.</para>
18
19 <para>On ne peut pas utiliser directement les commandes
20 <xref linkend="slonik"/> <xref linkend="stmtsetaddtable"/>
21 ou <xref linkend="stmtsetaddsequence"/> pour ajouter des
22 tables et des séquences à un ensemble de réplication en
23 cours de fonctionnement; on doit au contraire créer un nouvel
24 ensemble de réplication. Un fois que ce nouvel ensemble est répliqué
25 à l'identique ( c'est à dire les fournisseurs et abonnés sont
26 <emphasis>entiÚrement identiques</emphasis> à ceux de l'ensemble que
27 l'on veut compléter), les deux ensembles peuvent être fusionnés
28 avec la commande <xref
29 linkend="stmtmergeset"/>.</para>
30
31 <para>Jusqu'à la version 1.0.2 (incluse), il existait des risques
32 potentiels si <xref linkend="stmtmergeset"/> était lancée alors
33 que d'autres événements  de type abonnement étaient en attente;
34 des confusions pouvaient se produire sur les noeuds ayant ces
35 événements en attente.
36
37 Ce problÚme fut résolu avec la version 1.0.5.  Jusqu'à la version 1.2.1,
38 il existait toujours un problÚme avec <xref linkend="stmtmergeset"/>,
39 si la commande était lancée avant que tous les abonnements soient complets,
40 des <quote>perturbations</quote> pouvaient apparaître sur les noeuds
41 où l'activité d'abonnement n'était pas terminée. </para>
42
43 <para> Notez que si vous ajoutez des noeuds, vous devez également ajouter
44 les déclarations  <xref linkend="stmtstorepath"/> pour indiquer comment
45 les noeuds communiquent entre eux, et les déclarations  <xref linkend="stmtstorelisten"/>
46 pour configurer le  <quote>réseau de communications</quote> correspondant.
47 Voir le chapitre <xref linkend="listenpaths"/> pour plus de détails.
48 </para>
49
50 <para>Il est conseillé d'être trÚs prudent lorsque l'on ajoute des noeuds et des
51 voies de communications. Par exemple, soumettre de multiples demandes
52 d'abonnements à un ensemble donné dans un script  <xref linkend="slonik"/>
53 finit mal, en général. Si il est <emphasis>vraiment</emphasis> nécessaire
54 d'automatiser cette étape, il est préférable de soumettre des requêtes
55 <xref linkend="stmtwaitevent"/> entre chaque requête d'abonnement pour
56 que le script  <xref linkend="slonik"/> attende qu'un abonnement soit
57 complet avant de lancer le suivant..</para>
58
59 <para>Mais en général, il est plus facile de gérer les reconfigurations
60 complexes en s'assurant qu'un changement a été parfaitement réussi avant
61 de passer au suivant. Il est beaucoup plus simple de corriger un problÚme
62 unique que de réparer les dégâts provoqués par l'interaction erronée de cinq commandes
63 successives.</para>
64
65 <para> Voici un ensemble de  <quote>recettes</quote> pour réaliser
66 différentes modifications sur la configuration de la réplication :</para>
67
68 <sect2><title> Ajouter une table dans le cluster de réplication </title>
69
70 <indexterm><primary> ajouter une table dans le cluster de réplication </primary></indexterm>
71
72 <para> &slony1; ne vous permet pas d'ajouter une table dans un ensemble de
73 qui est déjà en cours de réplication. En principe, c'est certainement
74 <emphasis>possible</emphasis>; mais cela implique l'événement SET_ADD_TABLE
75 produise le code adéquat à partir de l'événement SUBSCRIBE_SET invoqué
76 pour analyser la table. Cela compliquerait de maniÚre significative et regrettable
77 la logique de tous ces composants, donc ce n'est pas permis. </para>
78
79 <para>En contrepartie, vous devez procéder de la maniÚre suivante :</para>
80
81 <itemizedlist>
82 <listitem><para> Ajouter la nouvelle table sur chaque noeud. </para>
83
84 <para> En principe, le script <xref linkend="stmtddlscript"/> peut être
85 utilisé pour cela, mais en réalité ce provoque des <link linkend="locking">
86 problÚmes d'inter-blocages </link> et cela nécessite la modification de
87 <emphasis>toutes</emphasis> les tables dans l'ensemble de réplication
88 existant, sur <emphasis>tous</emphasis> les noeuds, ce qui fait que
89 <xref linkend="stmtddlscript"/> est une approche peu attrayante sur un
90 serveur chargé. Ceci brise la rÚgle de &slony1; qui dit qu' <quote>il n'est pas
91 nécessaire d'interrompre l'activité normale pour ajouter la réplication.</quote>
92 </para>
93
94 <para> A contrario, vous pouvez ajouter la table via
95 <application>psql</application> sur chaque noeud.
96
97 </para> </listitem>
98
99 <listitem><para> Créer un nouvel ensemble de réplication avec <xref linkend="stmtcreateset"/>
100 </para></listitem>
101 <listitem><para>
102 Ajouter la table dans le nouvel ensemble avec <xref linkend="stmtsetaddtable"/>
103 </para></listitem>
104
105 <listitem><para> Demander l'abonnement de ce nouvel ensemble avec <xref
106 linkend="stmtsubscribeset"/>. Si il existe plusieurs noeuds, vous devez
107 utiliser <xref linkend="stmtsubscribeset"/> une fois pour chaque noeud
108 que vous voulez abonner.  </para></listitem>
109
110 <listitem><para> Si vous voulez savoir de maniÚre déterministe, si
111 un abonnement est complet, vous devez soumettre pour chaque abonnement
112 un script slonik qui ressemble à cela :
113
114 <screen>
115 SUBSCRIBE SET (ID=1, PROVIDER=1, RECEIVER=2);
116 WAIT FOR EVENT (ORIGIN=2, CONFIRMED = 1);
117 SYNC(ID = 1);
118 WAIT FOR EVENT (ORIGIN=1, CONFIRMED=2);
119 </screen></para>
120 </listitem>
121
122 <listitem><para> Une fois que les abonnements sont configurés
123 de maniÚre à ce que les abonnements du nouvel ensemble soit identiques
124 à ceux de l'ancien ensemble, vous pouvez fusionner le nouveau et l'ancien
125 avec la commande <xref
126 linkend="stmtmergeset"/> </para></listitem>
127 </itemizedlist>
128 </sect2>
129
130 <sect2><title> Comment ajouter une colonne dans une table répliquée </title>
131
132 <indexterm><primary> ajouter des colonnes dans une table </primary></indexterm>
133
134 <para> Cette réponse est la même que pour la question <quote>Comment
135 renommer des colonnes dans une table répliquée ?</quote>, et plus généralement
136 au autres questions du type <quote>Comment modifier la définition
137 de tables répliquées ?</quote></para>
138
139 <para>Si vous changez la <quote>forme</quote> d'une table répliquée, vous devez le
140 faire au même instant dans le <quote>flux de transaction</quote> sur tous les noeuds
141 qui sont abonnés à l'ensemble qui contient la table.</para>
142
143 <para> Ainsi, la méthode pour consiste à construire un script SQL
144 composé des changements DDL et de le soumettre à tous les noeuds
145 via la commande Slonik <xref linkend="stmtddlscript"/>.</para>
146
147 <para> Il existe une alternative, si vous avec installé les <link linkend="altperl">
148 scripts altperl</link>, vous pouvez utiliser <command>slonik_execute_script</command>
149 pour cela : </para>
150
151 <para> <command> slonik_execute_script [options] numero_de_l_ensemble
152 full_path_to_sql_script_file </command></para>
153
154 <para> Tapez la commande <command>slonik_execute_script -h</command> pour
155 plus d'information; notez que ce script utilise <xref linkend="stmtddlscript"/>.
156 </para>
157
158 <para> Il y a de nombreux <quote>points délicats</quote> à noter...</para>
159
160 <itemizedlist>
161 <listitem><para> Vous <emphasis>ne devez absolument jamais</emphasis> inclure
162 des commandes de contrÃŽle de transaction, notamment <command>BEGIN</command>
163 et <command>COMMIT</command>, à l'intérieur de ces scripts. &slony1;
164 encapsule les scripts DDL avec une paire <command>BEGIN</command>/<command>COMMIT</command>
165 ; ajouter de opérateur de contrÎle de transaction supplémentaire
166 implique que des parties des ordres DDL seront <quote>committés</quote>
167 en dehors du contrÃŽle de &slony1; </para></listitem>
168
169 <listitem><para> Avant la  version 1.2, il était nécessaire d'être
170 extrêmement restrictif sur ce qu'on envoyait au script
171 <xref linkend="stmtddlscript"/>. </para>
172
173 <para> Il était interdit de placer du texte <command>'entre quotes'</command>
174 dans le script, car cela l'empêchait d'être stocké et transmis correctement
175 . A partir de la version 1.2, les quotes sont correctement prises en compte. </para>
176
177 <para> Si vous soumettez une séries d'ordre DDL, les derniers
178 ne peuvent pas faire référence aux objets créés par les premiers,
179 car tous les ordres sont soumis dans un requête unique,
180 dont le plan d'exécution est basé sur l'état de la base de donnée
181 au <emphasis>début</emphasis>, avant que les modifications ne soient
182 effectuées. À partir de la version 1.2, il y a 12 ordres SQL, chacun est soumis
183 individuellement, ainsi la commande <command> alter table x add column c1
184 integer; </command> peut désormais être suivie par <command> alter table x
185 alter column c1 set not null; </command>.</para></listitem>
186
187 </itemizedlist>
188 </sect2>
189
190 <sect2><title> Comment supprimer la réplication sur un noeud</title>
191
192 <para> Vous devez supprimer les différents composants &slony1;
193 connectés à la base.</para>
194
195 <para> Considérons, un instant, que nous faisons cela pour un noeud.
196 Si vous avez de multiples noeuds, vous devrez répéter ces étapes
197 autant de fois que nécessaire.</para>
198
199 <para> Les composants à retirer : </para>
200 <itemizedlist>
201
202 <listitem><para>Triggers de logs / Triggers de blocage de mises à jour
203
204 </para></listitem>
205 <listitem><para> Le schéma <quote>cluster</quote> contenant les tables &slony1;
206 qui indiquent l'état du noeud et diverses procédures stockées
207 </para></listitem>
208 <listitem><para> Le processus &lslon; qui gÚre le noeud </para></listitem>
209 <listitem><para> Accessoirement, les scripts SQL, les scripts pl/pgsql,
210 et les binaires &slony1; qui font partie de la compilation de &postgres;.
211 (Bien sûr, cela complique la tache si vous souhaitez redémarrer la réplication;
212 il est peu probable que vous ayez besoin de supprimer ces fichiers...)
213 </para></listitem>
214 </itemizedlist>
215
216 <para> Comment effectuer facilement la suppression</para>
217 <itemizedlist>
218
219 <listitem><para> Vous pouvez utiliser la commande Slonik <xref linkend="stmtdropnode"/>
220 pour supprimer un noeud du cluster. Ceci provoquera la suppression
221 des triggers et tout ce qui se trouve dans schéma cluster.
222 Le processus <xref linkend="slon"/> sera automatiquement mourir.</para></listitem>
223
224 <listitem><para> Dans le cas d'un noeud en échec ( lorsque vous avez utilisé
225 la commande  <xref linkend="stmtfailover"/> pour basculer sur un autre noeud
226 ), vous devrez peut-être utiliser <xref linkend="stmtuninstallnode"/>
227 pour supprimer les triggers, le schéma et les fonctions.</para>
228
229 <para> Si le noeud est en échec à cause d'une panne matérielle dramatique
230 (<emphasis>par exemple</emphasis> si vos disques ont pris feu),
231 il est possible qu'il n'y ait plus de traces de la base de données sur le noeud;
232 En général, la base ne survive que lorsque la panne matérielle est un
233 problÚme de réseau qui n'endommage pas les données mais qui vous oblige à
234 supprimer le noeud à cause de coupures réseau persistantes.
235 </para></listitem>
236
237 <listitem><para> Si les opérations ci-dessus se sont particuliÚrement
238 mal passée. vous pouvez lancer la commande SQL
239 <command>DROP SCHEMA "Nom_du_cluster" CASCADE;</command>,
240 qui supprime toutes les fonctions, les tables et les triggers de
241 &slony1;. En général, c'est une opération moins pratique que
242 <xref linkend="stmtuninstallnode"/>, car cette commande
243 ne se contente pas de supprimer le schéma et son contenu, elle
244 supprime également toutes les colonnes ajoutées avec la
245 commande  <xref linkend= "stmttableaddkey"/>.
246 </para>
247
248 <note><para> Dans &slony1; version 2.0, <xref linkend=
249 "stmttableaddkey"/>  <emphasis>n'est plus supporté</emphasis>, et
250 donc <xref linkend="stmtuninstallnode"/> correspond simplement
251 à  <command>DROP SCHEMA "nom_du_cluster" CASCADE;</command>.  </para>
252 </note></listitem>
253 </itemizedlist>
254 </sect2>
255
256 <sect2><title> Ajouter un noeud dans le cluster de réplication</title>
257
258 <para>Les choses ne sont pas fondamentalement différentes entre l'ajout
259 d'un noeud flambant neuf et la restauration d'un noeud qu'on supprimé, puis reconstruit
260 . Dans les deux cas, vous ajouter un noeud dans le cluster de réplication.
261  </para>
262
263 <para>Les étapes nécessaires sont ... </para>
264 <itemizedlist>
265
266 <listitem><para> Déterminer le numéro du noeud et les DSNs adéquates
267 pour le noeuds. Utilisez la commande &postgres; <command>createdb</command>
268 pour créer la base; ajoutez les définitions des tables que vous voulez
269 répliquer, car &slony1; ne propage pas automatiquement cette information.
270 </para>
271
272 <para> Si vous ne disposez pas d'un script SQL parfaitement propre pour ajouter
273 les tables, alors vous pouvez utiliser l'outil  <link linkend="extractschema">
274 <command> slony1_extract_schema.sh</command> </link> situé dans le répertoire
275 <filename>tools</filename> afin d'obtenir le schéma utilisateur sans les
276 <quote>morceaux</quote> de &slony1;.  </para>
277 </listitem>
278
279 <listitem><para> Si le noeud était un noeud en échec, vous devez lancer
280 la commande  <xref linkend="slonik"/> <xref linkend="stmtdropnode"/>
281 afin de vous débarrasser de ses vestiges dans le cluster et de supprimer
282 le schéma que &slony1; a créé.
283 </para></listitem>
284
285 <listitem><para> Lancer la commande slonik <xref linkend="stmtstorenode"/>
286 pour établir le nouveau noeud.
287 </para></listitem>
288
289 <listitem><para> À cet instant, vous pouvez lancer le démon &lslon; sur le nouveau
290 noeud. Il ne connaîtra rien des autres noeuds, donc les logs de ce noeud seront
291 particuliÚrement calmes.
292 </para></listitem>
293
294 <listitem><para> Lancer la commande slonik <xref linkend="stmtstorepath"/>
295 pour indiquer comment les processus <xref linkend="slon"/> doivent
296 communiquer avec le nouveau noeud.
297 Dans la version 1.1 et suivante, cette commande génÚre automatiquement
298 des lignes de la table des <link linkend="listenpaths">voies d'écoute</link>;
299 Dans les versions précédentes vous devez utiliser <xref linkend="stmtstorelisten"/>
300 pour les générer manuellement.
301 </para></listitem>
302
303 <listitem><para> A cet instant, lancer le script
304 <command>test_slony_state-dbi.pl</command> est une excellente idée.
305 Ce script parcours le cluster le tout entier et pointe les anomalies
306 qu'il trouve.  Il peut notamment identifier une grande variété de
307 problÚmes de communication.</para> </listitem>
308
309 <listitem><para> Lancer commande slonik
310 <xref linkend="stmtsubscribeset"/> pour abonner le noeud à l'ensemble de réplication.
311 </para></listitem>
312
313 </itemizedlist>
314 </sect2>
315
316 <sect2><title> Comment remanier les abonnements ?</title>
317
318 <para> Par exemple, on souhaite que le noeud 3 reçoivent les données
319 en provenance du noeud 1, alors qu'actuellement il reçoit les données du noeud 2. </para>
320
321 <para> Il ne s'agit pas d'un cas d'utilisation de la commande <xref linkend="stmtmoveset"/>;
322 car on ne souhaite pas déplacer l'origine, mais simplement remanier les abonnés.
323 </para>
324
325 <para> Pour cela, on peut simplement soumettre des requêtes <xref
326 linkend="stmtsubscribeset"/> pour <emphasis>modifier</emphasis>
327 les abonnements.  Ces abonnements ne seront pas redémarrés à partir de zéro,
328 mais simplement reconfigurés.
329 </para></sect2>
330
331 <sect2><title> Comment utiliser le <link linkend="logshipping">Log Shipping</link> ?</title>
332 <para> Cette question est largement débattue dans la section <link linkend="logshipping"> Log Shipping </link>... </para>
333 </sect2>
334
335 <sect2><title> Comment savoir si la réplication fonctionne ?</title>
336
337 <para> La preuve ultime est le fait que les données ajoutées sur l'origine
338 soit présentes sur les abonnés. Il suffit <quote>simplement de lancer une
339 requête</quote> pour le savoir.</para>
340
341 <para> Cependant, il existe quelques autres méthode pour examiner l'état de la réplication : </para>
342 <itemizedlist>
343 <listitem><para> Regarder les logs des processus &lslon;.</para>
344
345 <para> Ils ne vous diront pas grand chose, même à une niveau de debug
346 élevé sur le noeud origine; Au niveau 2 de debug, vous devriez voir
347 sur les abonnés les événements SYNCs qui sont en cours de traitement.
348 À partir de la version 1.2, les informations sur le traitement des
349 SYNCs incluent le nombres de tables traitées, ainsi que le nombre
350 de tuples insérés, supprimés et mis à jour.</para> </listitem>
351
352 <listitem><para> Regarder dans la vue <command> sl_status </command>, sur
353 le noeud origine. </para>
354
355 <para> Cette vue indique quel est le retard des différents noeuds abonnés.
356 Cette information n'est pertinente que sur un noeud origine.</para> </listitem>
357
358 <listitem><para> Lancer le script
359 script <command>test_slony_state-dbi.pl</command> qui se trouve dans le répertoire
360 <filename>tools</filename>. Ce script parcours le cluster tout entier et pointe les
361 anomalies qu'il détecte, ainsi que des informations sur le statut de chaque noeud.
362 </para> </listitem>
363
364 </itemizedlist>
365
366 </sect2>
367
368 <sect2><title>Comment mettre à jour la version de &slony1; ? </title>
369
370 <para> La réponse se trouve  <link linkend="slonyupgrade"> ici </link> </para> </sect2>
371
372 <sect2><title> Que se passe-t-il lors d'une bascule d'urgence ?</title>
373
374 <para> Une partie de la réponse se trouve dans la section <xref linkend="failover"/>
375 mais il reste beaucoup de choses à écrire sur le sujet...</para> </sect2>
376
377 <sect2><title> Comment <quote>déplacer le maître</quote> vers un autre noeud ? </title>
378
379 <para> Tout d'abord il faut choisir un noeud qui est connecté à l'ancienne origine
380 (sinon il n'est pas évident de conserver les connexions lors du changement). </para>
381
382 <para> DeuxiÚmement, vous devez lancer un script &lslonik; avec la commande
383 <xref linkend="stmtlockset"/> pour verrouiller l'ensemble de réplication sur
384 le noeud origine. Notez qu'à cet instant votre application risque de ne plus fonctionner,
385 car cette opération pose des triggers sur l'origine qui rejetent toutes les mises
386 à jour. </para>
387
388 <para> Maintenant, lancez la requête &lslonik; <xref linkend="stmtmoveset"/>.
389 Il parfaitement raisonnable de soumettre les deux requêtes à l'intérieur
390 d'un même script &lslonik;. 
391
392 Désormais, l'origine est basculée vers le nouveau noeud origine. Si le nouveau noeud a quelques
393 événement de retard, il faudra un peu de temps pour que tout se mette en place. </para> </sect2>
394
395 <sect2> <title> Comment réaliser <quote>synchronisation complÚte</quote> sur une table? </title>
396
397 <para> Pour &slony1;, la  notion de <command>SYNC</command> est toujours quelque chose
398 d'<emphasis>incrémental</emphasis>; un <command>SYNC</command> représente
399 un ensemble de mises à jour qui furent <quote>committée</quote> pendant
400 durée d'un événement <command>SYNC</command> donné sur le noeud origine.
401 Si des mises à jour qui ont altérées l'ensemble du contenu d'une
402 table sont <quote>committées</quote> au cours d'un
403 <command>SYNC</command> unique, alors cela affectera l'ensemble
404 du contenu de la table. Mais du point de vue de &slony1;, ce changement est
405 <quote>incrémental</quote> même si la modification concerne
406 <quote>la table toute entiÚre</quote>.</para>
407
408 <para> La seule fois où &slony1; <quote>synchronise</quote> le contenu
409 d'une table est lors de la mise en place de l'abonnement, à ce moment-là
410 il utilise la commande <command>COPY</command> pour rapatrier la totalité
411 du contenu de la table à partir du noeud fournisseur.</para>
412
413 <para> Puisque les tables abonnées sont protégées contre les modifications
414 réalisées par un autre utilisateur que &slony1;, il est impossible
415 (mis à part d'horribles bogues) que les tables soient désynchronisées. 
416 Si c'est le cas, alors il y a vraiment un gros problÚme dans &slony1;. </para>
417
418 <para> Si une corruption trÚs grave se produit, la réponse est de retirer la table
419 hors de la réplication, puis de créer un nouvel ensemble de réplication et de l'ajouter
420 à nouveau. </para>
421 </sect2>
422 </sect1>
Note: See TracBrowser for help on using the browser.