| 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="listenpaths"><title>Voies d'écoute</title> |
|---|
| 8 |
|
|---|
| 9 |
<indexterm><primary>voies d"écoute</primary></indexterm> |
|---|
| 10 |
|
|---|
| 11 |
<note><para> Si vous utilisez une version &slony1; 1.2 ou ultérieure, il |
|---|
| 12 |
est <emphasis>complÚtement inutile</emphasis> de lire cette section car |
|---|
| 13 |
cette version dispose d'un méthode de gestion automatique de cette partie |
|---|
| 14 |
de sa configuration. Pour les versions antérieures, cependant, ce qui va |
|---|
| 15 |
suivre est nécessaire. |
|---|
| 16 |
</para> |
|---|
| 17 |
</note> |
|---|
| 18 |
|
|---|
| 19 |
<para>Si vous avez plus de deux ou trois noeuds et un niveau d'abonnement |
|---|
| 20 |
en cascade ( <emphasis>c'est à dire</emphasis> des noeuds qui s'abonne |
|---|
| 21 |
à des noeuds abonnés ), vous devez être trÚs prudent avec la configuration |
|---|
| 22 |
des <quote>voies d'écoute</quote> par les commandes Slonik |
|---|
| 23 |
<xref linkend="stmtstorelisten"/> et <xref linkend="stmtdroplisten"/> qui |
|---|
| 24 |
contrÃŽle le contenu de la table <xref linkend="table.sl-listen"/>.</para> |
|---|
| 25 |
|
|---|
| 26 |
<para>Les entrées de cette table contrÎlent où chaque noeuds doit écouter afin |
|---|
| 27 |
d'obtenir les événements propagés par les autres noeuds. Vous vous dites |
|---|
| 28 |
peut-être que chaque noeud doit simplement écouter le noeud |
|---|
| 29 |
<quote>parent</quote> qui leur transmet les mise à jours, mais en réalité, ils doivent |
|---|
| 30 |
pouvoir recevoir des messages de ma part de <emphasis>tous</emphasis> les noeuds |
|---|
| 31 |
afin de pouvoir déterminer si les <command>SYNC</command>s ont été reçus |
|---|
| 32 |
partout et que les entrées de <xref linkend="table.sl-log-1"/> et <xref |
|---|
| 33 |
linkend="table.sl-log-2"/> ont été appliquées partout et qu'elles |
|---|
| 34 |
peuvent être purgées. Ces communications supplémentaires permettent à |
|---|
| 35 |
<productname>Slony-I</productname> de déplacer les origines vers d'autres |
|---|
| 36 |
noeuds.</para> |
|---|
| 37 |
|
|---|
| 38 |
<sect2><title>Comment l'écoute peut être rompue</title> |
|---|
| 39 |
|
|---|
| 40 |
<indexterm><primary> rupture d'écoute </primary></indexterm> |
|---|
| 41 |
|
|---|
| 42 |
<para>A une occasion, j'ai eu besoin de supprimer un noeud abonné (#2) et |
|---|
| 43 |
de la recréer. Ce noeud était le fournisseur d'un autre abonné (#3) qui |
|---|
| 44 |
était, de facto, un <quote>esclave en cascade</quote>. |
|---|
| 45 |
La suppression du noeud abonné ne fonctionna, en effet |
|---|
| 46 |
<xref linkend="slonik"/> m'informa qu'il existait un noeud dépendant. |
|---|
| 47 |
Je fit pointer le noeud dépendant vers le noeud <quote>maître</quote> |
|---|
| 48 |
de l'ensemble de réplication, ce qui se déroula, pour un temps, |
|---|
| 49 |
sans difficultés.</para> |
|---|
| 50 |
|
|---|
| 51 |
<para>Je supprimais alors l'abonnement du <quote>node 2</quote>, et tentais de |
|---|
| 52 |
l'abonner de nouveau. Cela déclencha un événement &slony1; |
|---|
| 53 |
<command>set_subscription</command>, qui commença à copier les tables. |
|---|
| 54 |
à ce moment, les événements ne furent plus propagés au <quote>noeud 3</quote>, |
|---|
| 55 |
et tandis qu'il était en parfait état de fonctionnement, plus aucun |
|---|
| 56 |
événement ne lui parvenait.</para> |
|---|
| 57 |
|
|---|
| 58 |
<para>Le problÚme était que le noeud #3 attendait de recevoir des événements de la part |
|---|
| 59 |
du noeud #2, qui était occupé par le traitement de l'événement <command>set_subscription</command> |
|---|
| 60 |
et ne transmettait aucune autre information.</para> |
|---|
| 61 |
|
|---|
| 62 |
<para>Nous supprimames les rÚgles qui ordonnait au noeud #3 d'écouter le noeud #2, |
|---|
| 63 |
en les remplaçant par des rÚgles qui lui indiquait d'attendre les événements en provenance |
|---|
| 64 |
du noeud #1 ( le noeud origine de la réplication ). à ce moment, |
|---|
| 65 |
<quote>comme par magie</quote>, le noeud #3 recommença à répliquer, car |
|---|
| 66 |
il avait découvert une source ou écouter les évÚnements <command>SYNC</command>.</para> |
|---|
| 67 |
</sect2> |
|---|
| 68 |
<sect2><title>Comment configurer les écoutes</title> |
|---|
| 69 |
|
|---|
| 70 |
<para>Les cas simples sont facile à gérer. Intéressons-nous plutÎt |
|---|
| 71 |
à un configuration plus complexe.</para> |
|---|
| 72 |
|
|---|
| 73 |
<para>Considérons un ensemble de noeuds, de 1 à 6, où 1 est l'origine, |
|---|
| 74 |
2-4 sont abonnés directement à l'origine, 5 est abonné à 2, |
|---|
| 75 |
et 6 est abonné à 5.</para> |
|---|
| 76 |
|
|---|
| 77 |
<para>Voici un <quote>réseau d'écoute</quote> qui montre où chaque noeud doit |
|---|
| 78 |
écouter les messages en provenance des autres noeuds : |
|---|
| 79 |
|
|---|
| 80 |
<screen> |
|---|
| 81 |
1| 2| 3| 4| 5| 6| |
|---|
| 82 |
-------------------------------------------- |
|---|
| 83 |
1 0 2 3 4 2 2 |
|---|
| 84 |
2 1 0 1 1 5 5 |
|---|
| 85 |
3 1 1 0 1 1 1 |
|---|
| 86 |
4 1 1 1 0 1 1 |
|---|
| 87 |
5 2 2 2 2 0 6 |
|---|
| 88 |
6 5 5 5 5 5 0 |
|---|
| 89 |
</screen> |
|---|
| 90 |
</para> |
|---|
| 91 |
<para>La ligne 2 indique toutes les rÚgles d'écoute pour le noeud 2; |
|---|
| 92 |
il obtient les événements des noeuds 1, 3 et 4 chez le noeud 1 et il |
|---|
| 93 |
écoute sur le noeud 5 les événements des noeuds 5 et 6. |
|---|
| 94 |
</para> |
|---|
| 95 |
|
|---|
| 96 |
<para>La derniÚre ligne composée de 5, celle du noeud 6, indique que le noeud 6 |
|---|
| 97 |
écoute le noeud 5 pour obtenir les événements des noeuds 1 à 5.</para> |
|---|
| 98 |
|
|---|
| 99 |
<para>Les commandes slonik <command>set listen</command> qui exprime |
|---|
| 100 |
ce <quote>réseau d'écoute</quote> sont les suivantes : |
|---|
| 101 |
|
|---|
| 102 |
<programlisting> |
|---|
| 103 |
store listen (origin = 1, receiver = 2, provider = 1); |
|---|
| 104 |
store listen (origin = 1, receiver = 3, provider = 1); |
|---|
| 105 |
store listen (origin = 1, receiver = 4, provider = 1); |
|---|
| 106 |
store listen (origin = 1, receiver = 5, provider = 2); |
|---|
| 107 |
store listen (origin = 1, receiver = 6, provider = 5); |
|---|
| 108 |
store listen (origin = 2, receiver = 1, provider = 2); |
|---|
| 109 |
store listen (origin = 2, receiver = 3, provider = 1); |
|---|
| 110 |
store listen (origin = 2, receiver = 4, provider = 1); |
|---|
| 111 |
store listen (origin = 2, receiver = 5, provider = 2); |
|---|
| 112 |
store listen (origin = 2, receiver = 6, provider = 5); |
|---|
| 113 |
store listen (origin = 3, receiver = 1, provider = 3); |
|---|
| 114 |
store listen (origin = 3, receiver = 2, provider = 1); |
|---|
| 115 |
store listen (origin = 3, receiver = 4, provider = 1); |
|---|
| 116 |
store listen (origin = 3, receiver = 5, provider = 2); |
|---|
| 117 |
store listen (origin = 3, receiver = 6, provider = 5); |
|---|
| 118 |
store listen (origin = 4, receiver = 1, provider = 4); |
|---|
| 119 |
store listen (origin = 4, receiver = 2, provider = 1); |
|---|
| 120 |
store listen (origin = 4, receiver = 3, provider = 1); |
|---|
| 121 |
store listen (origin = 4, receiver = 5, provider = 2); |
|---|
| 122 |
store listen (origin = 4, receiver = 6, provider = 5); |
|---|
| 123 |
store listen (origin = 5, receiver = 1, provider = 2); |
|---|
| 124 |
store listen (origin = 5, receiver = 2, provider = 5); |
|---|
| 125 |
store listen (origin = 5, receiver = 3, provider = 1); |
|---|
| 126 |
store listen (origin = 5, receiver = 4, provider = 1); |
|---|
| 127 |
store listen (origin = 5, receiver = 6, provider = 5); |
|---|
| 128 |
store listen (origin = 6, receiver = 1, provider = 2); |
|---|
| 129 |
store listen (origin = 6, receiver = 2, provider = 5); |
|---|
| 130 |
store listen (origin = 6, receiver = 3, provider = 1); |
|---|
| 131 |
store listen (origin = 6, receiver = 4, provider = 1); |
|---|
| 132 |
store listen (origin = 6, receiver = 5, provider = 6); |
|---|
| 133 |
</programlisting> |
|---|
| 134 |
</para> |
|---|
| 135 |
<para>Ces lignes de commandes d'écoute sont lues lorsque...</para> |
|---|
| 136 |
|
|---|
| 137 |
<para>... le noeud <quote>récepteur</quote>, cherche un noeud <quote>fournisseur</quote> |
|---|
| 138 |
pour obtenir les événements en provenance du noeud d'<quote>origine</quote>.</para> |
|---|
| 139 |
|
|---|
| 140 |
<para>L'outil <filename>init_cluster</filename> parmi les scripts |
|---|
| 141 |
<filename>altperl</filename> produit un réseau d'écoute optimisé |
|---|
| 142 |
sous forme de tableau et ainsi qu'une liste de commandes |
|---|
| 143 |
<xref linkend="slonik"/>.</para> |
|---|
| 144 |
|
|---|
| 145 |
<para>Il y a trois <quote>épines</quote> dans ce bouquet de roses : |
|---|
| 146 |
|
|---|
| 147 |
<itemizedlist> |
|---|
| 148 |
|
|---|
| 149 |
<listitem><para> Si vous changez la structure du l'ensemble de noeuds, alors |
|---|
| 150 |
les noeuds sont abonnés différemment et vous devez supprimer les entrées |
|---|
| 151 |
de la table <xref linkend="table.sl-listen"/> et en créez de nouvelles |
|---|
| 152 |
pour décrire les nouvelles voies d'écoute entre les noeuds. |
|---|
| 153 |
Jusqu'à &slony1; 1.2, il n'y a aucune maniÚre automatique de réaliser |
|---|
| 154 |
cette <quote>restructuration</quote>.</para></listitem> |
|---|
| 155 |
|
|---|
| 156 |
<listitem><para> Si vous <emphasis>ne changez pas</emphasis> les entrées |
|---|
| 157 |
<xref linkend="table.sl-listen"/>, les événements se propageront |
|---|
| 158 |
tant que les noeuds fonctionnerait correctement. Le problÚme se |
|---|
| 159 |
déclenchera lorsqu'un noeud sera retiré,,rendant <quote>orphelin</quote> |
|---|
| 160 |
les noeuds qui l'écoutaient.</para></listitem> |
|---|
| 161 |
|
|---|
| 162 |
<listitem><para> Vous pouvez essayer de multiples ensembles de réplication |
|---|
| 163 |
qui ont des structures <emphasis>différentes</emphasis> pour leur arborescence |
|---|
| 164 |
d'abonnés. Il n'y aucune configuration d'écoute qui convienne parfaitement |
|---|
| 165 |
dans ce cas.</para></listitem> |
|---|
| 166 |
|
|---|
| 167 |
<listitem><para> Afin de créer une voie <xref linkend="table.sl-listen"/>, |
|---|
| 168 |
il <emphasis>doit</emphasis> exister une série d'entrées<xref linkend="table.sl-path"/> |
|---|
| 169 |
qui connectent l'origine au récepteur. Cela implique que si le contenu |
|---|
| 170 |
de <xref linkend="table.sl-path"/> ne définit pas réseau <quote>connecté</quote> |
|---|
| 171 |
de noeuds, alors certains noeuds ne seront pas accessibles. Typiquement cela |
|---|
| 172 |
peut se produire, lorsque vous avez deux ensembles de noeuds, placés sur deux |
|---|
| 173 |
sous-réseaux séparés, avec simplement deux noeuds <quote>pare-feu</quote> |
|---|
| 174 |
qui communiquent d'un sous-réseau à l'autre. Couper un de ces noeuds et les |
|---|
| 175 |
sous-ensembles de réplication s'arrêtent.</para></listitem> |
|---|
| 176 |
|
|---|
| 177 |
</itemizedlist></para> |
|---|
| 178 |
|
|---|
| 179 |
</sect2> |
|---|
| 180 |
|
|---|
| 181 |
<sect2 id="autolisten"><title>Génération automatique de voie d'écoute</title> |
|---|
| 182 |
|
|---|
| 183 |
<indexterm><primary>génération automatique de voie d'écoute </primary></indexterm> |
|---|
| 184 |
|
|---|
| 185 |
<para> Dans &slony1; version 1.1, une rÚgle heuristique est introduite pour |
|---|
| 186 |
générer automatiquement les entrées <envar>sl_listen</envar>. |
|---|
| 187 |
Cela se fait en fonction de 3 types d'informations : |
|---|
| 188 |
|
|---|
| 189 |
<itemizedlist> |
|---|
| 190 |
|
|---|
| 191 |
<listitem><para>Les entrées <xref linkend="table.sl-subscribe"/> sont |
|---|
| 192 |
les informations primordiales et vitales sur qui doit écouter quoi; |
|---|
| 193 |
nous <emphasis>savons</emphasis> qu'il doit y avoir une voie |
|---|
| 194 |
directe entre chaque abonné et son fournisseur. |
|---|
| 195 |
</para></listitem> |
|---|
| 196 |
|
|---|
| 197 |
<listitem><para>Les entrées <xref linkend="table.sl-path"/> sont |
|---|
| 198 |
le second indicateur; si a table <xref linkend="table.sl-subscribe"/> |
|---|
| 199 |
n'indique pas <quote>comment écouter</quote>, alors un noeud |
|---|
| 200 |
peut écouter directement l'origine si il existe une voie praticable |
|---|
| 201 |
dans <xref linkend="table.sl-path"/>.</para></listitem> |
|---|
| 202 |
|
|---|
| 203 |
<listitem><para> Enfin, si aucune indication n'a été obtenue à partir des |
|---|
| 204 |
informations précédentes. alors les noeuds peuvent écouter indirectement |
|---|
| 205 |
via un noeud qui est fournisseur de l'abonné, ou qui utilise l'abonné comme |
|---|
| 206 |
fournisseur.</para></listitem> |
|---|
| 207 |
|
|---|
| 208 |
</itemizedlist></para> |
|---|
| 209 |
|
|---|
| 210 |
<para> Ã chaque fois que les tables <xref linkend="table.sl-subscribe"/> ou <xref |
|---|
| 211 |
linkend="table.sl-path"/> sont modifiées, la fonction |
|---|
| 212 |
<function>RebuildListenEntries()</function> est appelée pour |
|---|
| 213 |
mettre à jour les voies d'écoute.</para> |
|---|
| 214 |
|
|---|
| 215 |
</sect2> |
|---|
| 216 |
</sect1> |
|---|