IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration MySQL Discussion :

Réplication de données


Sujet :

Administration MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 21
    Points
    21
    Par défaut Réplication de données
    Bonjour,

    Je suis entrain de mettre en place un système permettant de gérer la même base de données sur des lieux différents.

    J'explique le concept de l'infrastructure

    • Un site de vente en ligne
    • Un ERP d'un magasin

    J'ai donc mes bases de données qui travaillent en même temps
    Création clients, commandes, création produits... sur les bases de données différentes.

    Ce que j'aimerai, c'est que ces bases de données se maintiennent à jour mutuellement sans pour autant perde de la réactivité sur les applications.

    J'ai assimilé le concept de réplication mais je ne vois pas lequel mettre en place Master / Slave, Master / Master...
    De plus si le lien internet entre les bases est coupées, il faut que les bases se resynchronisent sans faire d'erreures d'index surtout avec les autoincremente

    En comptant sur vos expériences.

    Cordialement
    m@jOr

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Il faut faire attention au bidirectionnel, exemple :

    Contexte : un serveur mysql A, un serveur mysql B, une table "personne" (id [AUTO_INCREMENT, PRIMARY], nom, prenom) sur chaque serveur (structure identique). Pour l'exemple, on va partir de la table vide.

    Dans le cas d'une réplication bi directionnelle voila ce qui se passerai :

    Contexte : sur A, AUTO_INCREMENT = 0 sur B, AUTO_INCREMENT = 0

    T1 : Sur A, j'insere un enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin1", prenom = "k"
    l'id est fixé à 1

    Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 0


    T1bis : B récupère le binlog de A qui lui dis


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin1", prenom = "k"
    attention, le binlog ne dira jamais a B :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET id = 1, nom = "machin1", prenom = "k"
    Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 1

    T2 : Sur B, j'insere un enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin2", prenom = "k"
    l'id est fixé à 1

    Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 2

    T2bis : A récupère le binlog de B qui lui dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin2", prenom = "k"
    Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 2

    Jusque là, tout va bien ! mais entrons dans un contexte un peu plus réaliste : A recois des requetes d'INSERT, d'UPDATE de DELETE (SELECT n'est pas log dans binlog car il ne modifie pas la table), idem pour B.

    Le binlog dans la réalité est un fichier log que le serveur esclave (selon la direction, A ou B) viens chercher à intervalles régulier sur le serveur maitre puis dans un second temps l'execute sur lui meme. Les binlog sont traités au meme niveau que les autres reqûetes, pas de priorités.

    Imaginons donc maintenant que sur T3 on est la chose suivante :

    Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 2

    T3 : Sur B, j'insere un enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin3", prenom = "k"
    l'id est fixé à 3

    Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 3

    T3 (même instant) : Sur A, j'insere un enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin4", prenom = "k"
    l'id est fixé à 3

    Contexte : sur A, AUTO_INCREMENT = 3 sur B, AUTO_INCREMENT = 3

    T3bis : A récupère le binlog de B qui lui dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin3", prenom = "k"
    Contexte : sur A, AUTO_INCREMENT = 4 sur B, AUTO_INCREMENT = 3

    T3bis (même instant) : B récupère le binlog de A qui lui dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne SET nom = "machin4", prenom = "k"
    Contexte : sur A, AUTO_INCREMENT = 4 sur B, AUTO_INCREMENT = 4

    Qu'avons nous en T4 dans les deux tables ?

    A.personne :
    1 machin1
    2 machin2
    3 machin3
    4 machin4
    5

    B.personne :
    1 machin1
    2 machin2
    3 machin4
    4 machin3
    5

    On a donc une erreur dans le contenu des tables et la relation id, nom, prénom entre les deux serveurs. Mais pour A comme pour B tout est normal !

    Voila un probleme de la synchronisation bidirectionnelle.

    Ce probleme d'id en AUTO_INCREMENT peux etre résolu soit pas le programme en lui meme, soit en faisant appel à une table externe unique qui attribue l'id, soit par vérification sur les deux serveurs... bref plein de solutions, mais un casse tête a l'arrivée


    Note :
    Pour faire du bidirectionnel, il faut spécifier à mySQL qu'il peut se synchroniser avec un serveur ayant un ID supérieur ou égal a lui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    --replicate-same-server-id

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Points : 465
    Points
    465
    Par défaut
    Désolé de te contredire ionesco, mais utiliser en variables de démarage --replicate-same-server-id est un grosse erreur et va engendrer des désynchronisation. --replicate-same-server-id permets de dire au serveur qu'il doit executer les requetes pour lesquelles le server-id associés peut être le même que le sien. Ce qui peut générer des boucles car il va essayer de re-executer des requetes qu'il a lui-même intégré.

    Pour faire de la réplication master/master, il faut :
    - un id différent sur chacun de tes serveurs
    - un id d'auto increment propre au serveur.

    et la c'est du bonheur concernant les insert.

    pour plus d'info, je te renvoie à un de mes post précédents.
    http://www.developpez.net/forums/d81...maitre-maitre/
    La connaissance s'accroit lorsqu'on la partage.

Discussions similaires

  1. Réplication de données
    Par Romers dans le forum Réplications
    Réponses: 3
    Dernier message: 15/05/2008, 11h57
  2. Réplication de données MS-SQL
    Par malves dans le forum Réplications
    Réponses: 3
    Dernier message: 16/01/2008, 11h19
  3. Réplication de données via des MV entre 9i et 10g
    Par jml50 dans le forum Administration
    Réponses: 1
    Dernier message: 15/06/2007, 12h10
  4. Réplication de données ACCESS - ORACLE
    Par pyfux69 dans le forum Access
    Réponses: 2
    Dernier message: 01/03/2007, 21h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo