Avant d'enregistrer un serveur à un ensemble, assurez-vous d'avoir un processus slon(1) pour chacune des deux parties à savoir le fournisseur et pour le nouveau nœud de souscription. Si les démons slon respectifs ne sont pas en cours d'exécution, alors il ne se passera rien et vous vous éverturez à comprendre pourquoi cela ne fonctionne pas.
Ajouter un serveur à un ensemble de serveurs est fait en exécutant la commande SLONIK SUBSCRIBE SET(7) de slonik(1) . Il peut sembler tentant d'essayer de souscrire plusieurs nœuds à un ensemble dans un bloc d'essai simple comme celui-ci :
try {
echo 'Subscribing sets';
subscrifbe set (id = 1, provider=1, receiver=2, forward=yes);
subscribe set (id = 1, provider=1, receiver=3, forward=yes);
subscribe set (id = 1, provider=1, receiver=4, forward=yes);
} on error {
echo 'Enregistrement du jeu des serveurs : impossible!';
exit -1;
}
Mais vous êtes juste en train de vous demander quel est le souci en enregistrant les ensembles de serveurs de cette façon. La méthode appropriée exige de procéder à l'enregistrement des serveurs, à raison d'un seul à la fois, tout en examinant le journal de l'instance de la base de donnée, avant de vous occuper du prochain enregistrement. Il est également intéressant de noter que le « succès » dans l'essai slonik(1) ci-dessus, n'implique pas que les nœuds 2, 3, et 4 soient tous enregistrés avec succès. Il indique simplement que les commandes de slonik ont été reçues avec succès le démon slon fonctionnant sur le nœud d'origine.
Un cas typique de problème pouvant surgir est qu'un abonné en cascade, recherche un fournisseur qui n'est pas encore prêt. Dans ce cas d'échec, le nœud souscripteur ne deviendra jamais l'abonné. Il sera « bloquée » en attente d'un évènement déjà survenu. Les autres nœuds seront persuadés que, ce nœud bloqué s'est enregistré correctement (parce qu'aucune erreur ne leur est parvenu) ; la demande pour désabonner le nœud sera « bloqué » car le nœud en question est coincé en attente d'enregistrement.
Lorsque vous enregistrez un nœud à un ensemble de nœuds, vous devez voir quelque chose de ce genre dans les traces du démon slon pour le nœud fournisseur :
DEBUG2 remoteWorkerThread_3: Received event 3,1059 SUBSCRIBE_SET
Vous devriez également commencer à voir des messages de ce genre dans les traces du démon slon pour le nœud de souscription :
DEBUG2 remoteWorkerThread_1: copy table public.my_table
La copie de grandes tables entre le nœud de fournisseur et le nouvel abonné peut prendre un certain temps. Si vous vérifiez la table pg_stat_activity sur le nœud du fournisseur, vous devriez voir une requête qui copie la table vers stdout.
La table sl_subscribe pour le fournisseur comme pour le nouveau souscripteur, doit contenir un enregistrement pour le nouveau abonnement :
sub_set | sub_provider | sub_receiver | sub_forward | sub_active
---------+--------------+--------------+-------------+------------
1 | 1 | 2 | t | t
Un ultime test est d'insérer un enregistrement dans une des tables répliquées depuis le nœud d'origine, et de vérifier que cet enregistrement est bien répliqué chez le souscripteur.
Si vous créez et souscrivez à un ensemble de nœud qui ne contient aucune table, cela peut mener à une situation qui empêchera la réplication de se faire.
Notez que ce bug est corrigé depuis la version 1.1.5.
Si un abonné particulier est seulement alimenté par une séquence d'ordre d'un de ces fournisseurs, la requête qui collecte l'évènement SYNC ne sera pas correctement créée, et vous pouvez voir une erreur similaire celle-ci :
2007-04-13 07:11:28 PDT ERROR remoteWorkerThread_11: "declare LOG cursor for select log_origin, log_xid, log_tableid, log_actionseq, log_cmdtype, log_cmddata from "_T1".sl_log_1 where log_origin = 11 and ( order by log_actionseq; " PGRES_FATAL_ERROR ERROR: syntax error at or near "order" at character 162
La fonction schemadocsubscribeset( integer, integer, integer, boolean ) va générer un avertissement si un ensemble de réplication donné ne contient aucune table à répliquer, comme l'exemple suivant le montre :
cbbrowne@dba2:/tmp> cat create_empty_set.slonik cluster name = T1; node 11 admin conninfo = 'dbname=slony_test1'; node 22 admin conninfo = 'dbname=slony_test2'; create set (id = 255, origin = 11, comment='blank empty set'); subscribe set (id=255, provider = 11, receiver = 22, forward = false);
Ceci mène au message d'avertissement suivant :
bbrowne@dba2:/tmp> slonik create_empty_set.slonik create_empty_set.slonik:6: NOTICE: subscribeSet:: set 255 has no tables - risk of problems - see bug 1226 create_empty_set.slonik:6: NOTICE: http://gborg.postgresql.org/project/slony1/bugs/bugupdate.php?1226 cbbrowne@dba2:/tmp>