-
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
-
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:
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:
INSERT INTO personne SET nom = "machin1", prenom = "k"
attention, le binlog ne dira jamais a B :
Code:
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:
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:
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:
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:
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:
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:
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:
--replicate-same-server-id
-
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/