| 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="partitioning"> |
|---|
| 8 |
<title>Support du partitionnement </title> |
|---|
| 9 |
<indexterm><primary>partitionnement</primary></indexterm> |
|---|
| 10 |
|
|---|
| 11 |
<para> &slony1; ne supporte pas directement la méthode de partitionnement |
|---|
| 12 |
par héritage de &postgres;, cependant il n'empêche pas non plus les |
|---|
| 13 |
utilisateur de répliquer de tels héritages et ainsi que les tables |
|---|
| 14 |
qui y sont associées.</para> |
|---|
| 15 |
|
|---|
| 16 |
<para> Un des tests du <xref linkend="testbed"/>, appelé |
|---|
| 17 |
<filename>testinherit</filename>, vérifie que &slony1; se comporte |
|---|
| 18 |
comme prévu lors de la réplication de données partitionnées. Ce test |
|---|
| 19 |
crée une table maître <envar>sales_data</envar> dont plusieurs tables filles héritent : </para> |
|---|
| 20 |
|
|---|
| 21 |
<itemizedlist> |
|---|
| 22 |
<listitem><para> <envar>us_east</envar></para> </listitem> |
|---|
| 23 |
<listitem><para> <envar>us_west</envar></para> </listitem> |
|---|
| 24 |
<listitem><para> <envar>canada</envar></para> </listitem> |
|---|
| 25 |
</itemizedlist> |
|---|
| 26 |
|
|---|
| 27 |
<para> Cet exemple est un peu simpliste car il fournit uniquement des rÚgles |
|---|
| 28 |
d'insertion dans les différentes partitions; il ne permet pas de migrer des |
|---|
| 29 |
tuples d'une partition à une autre si ils sont modifiés via une commande |
|---|
| 30 |
<command>UPDATE</command> statement. D'un autre coté, à la différence de |
|---|
| 31 |
de beaucoup de partitionnement, celui-ci permet à la table <quote>parente</quote> |
|---|
| 32 |
de contenir des tuples. </para> |
|---|
| 33 |
|
|---|
| 34 |
<para> On peut remarquer quelques points intéressants :</para> |
|---|
| 35 |
|
|---|
| 36 |
<itemizedlist> |
|---|
| 37 |
<listitem><para> Chaque table de partition doit être ajoutée à la réplication individuellement. </para> </listitem> |
|---|
| 38 |
<listitem><para> &slony1; n'est pas conscient des relations entre les tables de partition; il les considÚre comme |
|---|
| 39 |
une série de tables indépendantes. </para> </listitem> |
|---|
| 40 |
</itemizedlist> |
|---|
| 41 |
|
|---|
| 42 |
|
|---|
| 43 |
<sect2><title> Support de l'ajout dynamique de partition</title> |
|---|
| 44 |
|
|---|
| 45 |
<para> Un <quote>cas d'utilisation</quote> fréquent de la réplication consiste |
|---|
| 46 |
à partitionner de large ensemble de données selon un critÚre temporel : la semaine, |
|---|
| 47 |
le moins, le trimestre ou l'année, ce qui implique par conséquent l'ajout périodique |
|---|
| 48 |
d'une nouvelle partition. </para> |
|---|
| 49 |
|
|---|
| 50 |
<para> L'approche traditionnelle pour effectuer cela avec &slony1; est la suivante : </para> |
|---|
| 51 |
|
|---|
| 52 |
<itemizedlist> |
|---|
| 53 |
<listitem><para> <xref linkend="stmtddlscript"/> pour ajouter la nouvelle table de partition sur chaque noeud</para> </listitem> |
|---|
| 54 |
<listitem><para> <xref linkend="stmtcreateset"/> pour créer un ensemble de réplication temporaire </para> </listitem> |
|---|
| 55 |
<listitem><para> <xref linkend="stmtsetaddtable"/> pour ajouter la table dans cet ensemble </para> </listitem> |
|---|
| 56 |
<listitem><para> <xref linkend="stmtsubscribeset"/>, une fois pour chaque noeud abonné, afin de mettre en place |
|---|
| 57 |
la réplication sur chaque noeud </para> </listitem> |
|---|
| 58 |
<listitem><para> <xref linkend="stmtmergeset"/>, une fois que la réplication fonctionne, afin de supprimer |
|---|
| 59 |
l'ensemble de réplication temporaire </para> </listitem> |
|---|
| 60 |
</itemizedlist> |
|---|
| 61 |
|
|---|
| 62 |
<para> Sachant qu'il y a de fortes chances pour que la nouvelle partition soit vide, |
|---|
| 63 |
il existe un mécanisme alternatif qui évite de créer un ensemble de réplication |
|---|
| 64 |
supplémentaire et l'utilisation de multiples requêtes <xref linkend="stmtsubscribeset"/> |
|---|
| 65 |
Cette alternative est la suivante : on utilise le script <xref |
|---|
| 66 |
linkend="stmtddlscript"/>, pour effectuer le script DDL suivant : </para> |
|---|
| 67 |
|
|---|
| 68 |
<itemizedlist> |
|---|
| 69 |
<listitem><para> Ajouter la nouvelle partition sur chaque noeud </para> </listitem> |
|---|
| 70 |
<listitem><para> Exécuter les fonction stockées pour inscrire la nouvelle partition dans l'ensemble de réplication.</para> |
|---|
| 71 |
|
|---|
| 72 |
<para> Sur le noeud d'origine, si la table de partitionnement contient des tuples, |
|---|
| 73 |
le script DDL s'arrêtera car le fait que la table soit vide est une condition qui ne |
|---|
| 74 |
peut pas être violée. </para> |
|---|
| 75 |
|
|---|
| 76 |
<para> Sur les noeuds abonnés, on peut effectuer sans danger un <command>TRUNCATE</command> sur la nouvelle table. </para> |
|---|
| 77 |
</listitem> |
|---|
| 78 |
</itemizedlist> |
|---|
| 79 |
|
|---|
| 80 |
<para> Il existe plusieurs fonctions qui prennent en charge cela : |
|---|
| 81 |
L'utilisateur peut utiliser celle qu'il préfÚre. La <quote> fonction de |
|---|
| 82 |
base </quote> est <function>add_empty_table_to_replication()</function>; les |
|---|
| 83 |
autres disposent d'arguments supplémentaires ou différents</para> |
|---|
| 84 |
|
|---|
| 85 |
<itemizedlist> |
|---|
| 86 |
<listitem><para> <function> add_empty_table_to_replication (set_id, tab_id, nspname, tabname, idxname, comment);</function> </para> |
|---|
| 87 |
|
|---|
| 88 |
<para> Ceci est la fonction de <quote>base</quote>; vous devez spécifier |
|---|
| 89 |
l'identifiant de l'ensemble (set_id), l'identifiant de la table (tab_id), |
|---|
| 90 |
l'espace de nom (nspname), le nom de la table(tabname), le nom de l'index (idxname) |
|---|
| 91 |
et un commentaire (comment) . La table sera alors ajouté dans la réplication. </para> |
|---|
| 92 |
|
|---|
| 93 |
<para> Notez que le nom d'index est optionnel; si la valeur est NULL, alors |
|---|
| 94 |
la fonction utilisera la clé primaire de la table, en supposant qu'il en existe une. |
|---|
| 95 |
La fonction échouera s'il n'existe pas de clé primaire. </para> |
|---|
| 96 |
|
|---|
| 97 |
</listitem> |
|---|
| 98 |
|
|---|
| 99 |
<listitem><para> <function> replicate_partition(tab_id, nspname, tabname, idxname, comment); </function> </para> |
|---|
| 100 |
|
|---|
| 101 |
<para> Si l'on sait que la table qui doit être répliquée hérite d'une table mÚre |
|---|
| 102 |
répliquée elle-aussi, alors cette fonction peut récupérer les informations sur |
|---|
| 103 |
l'ensemble de réplication et l'origine à partir de la table mÚre. |
|---|
| 104 |
</para> |
|---|
| 105 |
</listitem> |
|---|
| 106 |
</itemizedlist> |
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 |
<note><para> Comme il a été remarqué précédemment, &slony1; n'est pas conscient |
|---|
| 110 |
que les tables sont partitionnées. Ainsi, cette approche peut être utilisée |
|---|
| 111 |
pour ajouter une table vide dans la réplication. </para> </note> |
|---|
| 112 |
</sect2> |
|---|
| 113 |
|
|---|
| 114 |
</sect1> |
|---|