| 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> |
|---|