Journal Réplication de BDD multi-maître asynchrône.

Posté par  (site web personnel) .
Étiquettes :
9
2
sept.
2009
J'ai ce journal de rédigé depuis un moment alors pendant que j'y pense je vous le poste, ça pourrait en intéresser certains :

Ayant eu récemment besoin d'un système de réplication multi-maître asynchrone, j'ai fait tout un tas de recherches sur les différentes solutions libres existantes et souhaitait vous en faire un compte-rendu ici:

Rappel :
La réplication permet la copie automatique régulière des données d'un serveur maître vers un serveur esclave, dans la réplication de base on ne doit pas insérer de données coté esclave.
On parle de réplication multi-maître quand on peut avoir plusieurs maîtres dans le réseau de réplication. On peut donc insérer des données sur chaque maître.
On parle de réplication multi-maître asynchrone lorsque les maîtres peuvent être déconnectés un certain temps puis reconnectés et se resynchroniser. Cela implique une robuste gestion des conflits.

Les SGBD étudiés sont MySQL et PostgreSQL.

Solutions libres étudiées:
1) la réplication MySQL
Très bien documentée, la réplication offerte nativement par MySQL est une simple réplication maître/esclave. Elle survit à une déconnexion et on peut donc parler de réplication maître/esclave asynchrone.
Elle n'est cependant pas multi-maître et se bloque au moindre conflit rencontré lors de la réplication (ce qui arrive lors d'insertion de lignes conflictuelles sur l'esclave).

2) Postgres-R, la réplication PostgreSQL
Postgres-R est le futur système de réplication intégré à PostgreSQL, il n'est pas encore utilisable en production et nécessite une recompilation de PostgreSQL pour être testé.
N'étant pas encore au point et assez flou sur ses fonctionnalités, j'ai pas trop poussé les tests.

3) Symmetric DS
Solution en Java également disponible sous la forme de bibliothèque, permet la synchronisation entre différent SGBD, on peut répliquer depuis une base MySQL vers une base PostgreSQL. Tout un tas de SGBD libres ou proprio sont supportés.
Il est présenté comme supportant la réplication multi-maître mais en réalité il fait simplement une réplication dans les deux sens sans gestion des conflits, il arrive même que les deux bases se retrouvent différentes!
Donc pour tout ce qui est réplication multi-maître, à éviter. (à la rigueur pour de la réplication multi-maître synchrone mais ça reste risqué)

4)Bucardo
Solution en perl pour PostgreSQL.
Là, ça marche. Réplication multi-maitre réellement gérée, plusieurs scénarii de résolution des conflits sont disponibles comme "le serveur A a toujours raison", "le serveur B a toujours raison" ou encore "la modification la plus récente est à garder".
Il est également possible de coder sa propre fonction perl de résolution des conflits, et c'est là le plus intéressant, la fonction reçoit en paramètre les deux lignes en conflit et doit retourner la ligne à conserver, qui peut être un mélange des deux, ou même une ligne générée différemment par la fonction.

Dans mon cas j'ai finalement eu besoin d'une solution pour MySQL et je n'ai donc pas pu choisir Bucardo, du coup j'ai utilisé MySQL avec une série de script PHP permettant de gérer les conflits. Mais j'avais besoin d'un cas particulier de réplication multi-maître, je n'avais pas besoin du multi-maître quand les serveurs étaient connectés, juste durant les périodes de déconnexion.

Mon script sera peut-être disponible quelque part sur la toile une fois fini, je vous ferais signe si j'en ai connaissance. (j'ai fait ce script durant mon stage en entreprise de fin de DUT donc là c'est l'entreprise qui a le script, ils le releaseront peut-être mais pas sûr)

Liens :

Réplication MySQL : http://dev.mysql.com/doc/refman/5.0/fr/replication.html

Postgre-R : http://www.postgres-r.org/

SymmetricDS : http://symmetricds.codehaus.org/

Bucardo : http://bucardo.org/
  • # conflits sur clef auto incrémentée

    Posté par  . Évalué à 7.

    juste pour participer, avec mysql la réplication multi-maitre peut fonctionner, si ton application prend quelques mesures pour ne pas avoir de problèmes.
    Une astuce est aussi de configurer chaque serveur pour qu'il génère des clef primaires qui n'entrent pas en conflit (par exemple un serveur génère des clefs "paires" et l'autre des clefs "impaires"). cela se fait dans mysql.ini

    server-id = 1
    auto-increment-increment = 2
    auto-increment-offset = 1

    server-id = 1
    auto-increment-increment = 2
    auto-increment-offset = 2

    en fait le GROS problème de la réplication multi-maitre asynchrone est qu'en cas de crash il est extremement compliqué de garantir la restauration exhaustive de toutes les transactions en cours. la réplication asynchrone n'aide pas, et le multi maitre complique encore les choses. Quel backup garder ? comment etre sur d'avoir tous les journaux necessaires ? comment les rejouer après une restauration de serveur ?? bref c'est bien pour certaines applis mais compliqué a opérer correctement.
  • # Pas tout à fait

    Posté par  (site web personnel) . Évalué à 5.

    Postgres-R est le futur système de réplication intégré à PostgreSQL

    Non, pas du tout : il n'y a aucune volonté d'intégrer Postgres-R dans PostgreSQL.

    Les travaux actuels sur l'intégration d'une réplication à l'intérieur de PostgreSQL ne sont pas basés dessus (et ce ne sera pas du multi-master).

    Dernièrement, on entend pas mal parler de http://www.rubyrep.org/ aussi. Ca peut valoir le coup d'oeil.
  • # Propriété intelectuelle & stagiaire

    Posté par  . Évalué à 6.

    j'ai fait ce script durant mon stage en entreprise de fin de DUT donc là c'est l'entreprise qui a le script, ils le releaseront peut-être mais pas sûr

    Sauf que, après avoir remué un peu mes souvenirs de DUT, et cherché avec un célèbre ami, j'ai trouvé quelques informations sur http://www.adbs.fr/stagiaires-et-droits-de-propriete-intelle(...)

    Petit extrait :
    * Les droits d'auteur du stagiaire

    Le stagiaire n'est pas un salarié [note 5] et son statut est défini par la loi du 31 mars 2006 pour l'égalité des chances [réf. i]. Mais ni cette loi, ni aucun des textes pris pour son application, ne contient de dispositions sur le droit d'auteur.

    Le droit d'auteur s'interprétant toujours en faveur de l'auteur, le stagiaire reste titulaire des droits sur ses créations, tant qu'il n'a pas expressément autorisé par écrit l'entreprise qui l'accueille à utiliser ses créations sauf, bien sûr, si sa contribution alimente une œuvre collective.


    Donc sauf particularité dans la convention de stage, tu peux releaser ca comme tu l'entends :)
    • [^] # Re: Propriété intelectuelle & stagiaire

      Posté par  (site web personnel) . Évalué à 5.

      Je viens de recevoir un mail de mon maître de stage me disant qu'il était tombé sur mon journal et que je pouvais tout à fait publier mon script ^^

      Voilà donc un zip avec la dernière version dont je dispose : http://dl.free.fr/getfile.pl?file=/r9uVAlxU (ce lien n'est pas éternel, si quelqu'un est disposé à faire un miroir... )

      Le fichier replication_config.php est à adapter à votre cas, là c'était pour répliquer un joomla (mais ça marchait pas complètement d'ailleurs, vu que joomla utilise les sessions)

      Pour l'utilisation :

      La bibliothèque s'utilise comme une sur-couche aux fonctions MySQL:

      On inclut replication_classe.php
      Il faut également démarrer une session avec session_start() en tout début de fichier PHP.
      On configure le script pour nos serveurs grâce au fichier replication_config.php
      On créer un objet de la classe replication_interface : "$replication = new replication_interface();"
      Ensuite il suffit de d'appeler $replication->executerRequete() au lieu de mysql_query(), $replication->selectionBase() au lieu de mysql_select_db() et $replication->executerRequete_db() au lieu de mysql_query(requete,base) (équivalent à un selectionBase() puis un executerRequete()).
      La fonction « $replication->insert_id() » est à utiliser au lieu de mysql_insert_id().
      La fonction « $replication->affected_rows() » est à utiliser au lieu de mysql_affected_rows().
      Le script nécessite l'installation du paquet pear "SQL_Parser"

      Mon script nécessite la configuration d'une réplication MySQL des bases devant être synchronisées

      Pour le paquet pear SQL_Parser, j'ai créé deux patchs corrigeant des bugs, qui sont nécessaires pour que mon script marche : http://pear.php.net/bugs/bug.php?id=16215
      http://pear.php.net/bugs/bug.php?id=16139
      • [^] # Re: Propriété intelectuelle & stagiaire

        Posté par  . Évalué à 2.

        Est-ce que tu compte faire vivre ton script, ou tu le laisse à la communauté tel que ?

        Si je pose la question c'est plus pour la pertinence de sa conservation sur un site (exemple si tes patchs sont intégrés au paquet PEAR etc ..)
        • [^] # Re: Propriété intelectuelle & stagiaire

          Posté par  (site web personnel) . Évalué à 1.

          Non, à moins d'en avoir à nouveau besoin un jour, je le laisse dans cet état là.

          En plus c'est pas impossible que d'ici un an ou deux il devienne obsolète si des fonctionnalités de réplication multi-maître asynchrônes sont incluses dans les SGBD libres existants.
  • # Et Sequoia ?

    Posté par  (site web personnel) . Évalué à 2.

    As-tu regardé Sequoia ?
    cf : http://www.continuent.com/community/lab-projects/sequoia

    D'après la description :
    "Sequoia offers a multi-master approach for replication."
    • [^] # Re: Et Sequoia ?

      Posté par  (site web personnel) . Évalué à 2.

      Je déconseille fortement Sequoia mis à part s'il a les compétences pour débugger et comprendre les problèmes rencontrés.

      C'est plus que pointu et on a rencontré pas mal de problèmes de bloquage dans certains cas bizarres avec des vraies applications. On a corrigé ce qu'on a pu dans Sequoia mais certains problèmes n'étaient pas assez reproductibles pour qu'on puisse comprendre d'où ça vient.

      Sequoia est plus ou moins abandonné par Continuent et il n'y a qu'Emmanuel Cecchet qui continue à travailler dessus.

      Par ailleurs :
      - Sequoia ne règle pas vraiment le problème du multi-master dans le sens où tu ne vas pas réussir à scaler tes écritures (elles sont répliquées en logiciel sur chaque noeud) ;
      - Sequoia introduit un overhead non négligeable et ça dégrade quand même bien les performances sur une utilisation web standard (plein de petites requêtes).

      Je n'ai pas eu le temps de regarder Tungstene le nouveau produit de Continuent. Ils ont annoncé du nouveau côté Open Source pour les prochaines semaines.
  • # Extension Weave de Mozilla

    Posté par  . Évalué à 1.

    Bonjour,

    J'ai lu ton journal il y a quelques jours déjà et je me demande si ta problématique ne serait pas identique au greffon weave de mozilla firefox.

    En effet, celui-ci permet d'avoir une BDD multi-maitre (chaque clients firefox sur un même compte recensant liens visités, marques-pages,flux-rss,mot de passe,etc) et asynchrone (tous les postes ne sont pas connectés en même temps).

    J'utilise ce greffon au quotidien et je me demande si le code ne te serait pas intéressant à regarder car dans la pratique, c'est la même problématique que toi, non ?

    D'ailleurs, je ne sais pas si on peut le voir, le code...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.