2008-11-28 17 views
11

Aquí está el escenario. 2 servidores web en dos ubicaciones separadas que tienen dos bases de datos mysql con tablas idénticas. También se espera que los datos dentro de las tablas sean idénticos en tiempo real.Cuál es la mejor manera de sincronizar bidireccionalmente datos dinámicos en tiempo real usando mysql

Aquí está el problema. si un usuario en cualquier ubicación introduce simultáneamente un nuevo registro en tablas idénticas, como se ilustra en las dos primeras tablas a continuación, donde el tercer registro en cada tabla ha sido ingresado simultáneamente por las diferentes personas. Los datos en las tablas ya no son idénticos. ¿Cuál es la mejor manera de mantener que los datos permanecen idénticos en tiempo real como se ilustra en la tercera tabla a continuación, independientemente de dónde se realicen las actualizaciones? De esta manera, en las siguientes ilustraciones en lugar de terminar con 3 filas en cada tabla, los nuevos registros se replican bidireccionalmente y se insertan en ambas tablas para crear 2 tablas idénticas de nuevo con 4 columnas esta vez.

Server A in Location A 
============== 

Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
|-----------| 
| 3 | John | 
|-----------| 

Server B in Location B 
============== 
Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
|-----------| 
| 3 | Peter | 
|-----------| 


Expected Scenario 
=========== 
Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
| 3 | Peter | 
| 4 | John | 
|-----------| 

Respuesta

11

No hay mucho rendimiento que obtener al replicar su base de datos en dos maestros. Sin embargo, hay un poco de failover ingenioso si codifica su aplicación correctamente.

La configuración de Master-Master es esencialmente la misma que la configuración de Slave-Master, pero tiene ambos Slaves iniciados y un cambio importante en sus archivos de configuración en cada cuadro.

Maestro MySQL 1:

auto_increment_increment = 2 
auto_increment_offset = 1 

Maestro MySQL 2:

auto_increment_increment = 2 
auto_increment_offset = 2 

Estos dos parámetros aseguran que cuando dos servidores están luchando por una clave principal, por alguna razón, no se duplican y matan la replicación En lugar de incrementar en 1, cualquier campo de incremento automático aumentará de forma predeterminada en 2. En un cuadro, comenzará el desplazamiento desde 1 y ejecutará la secuencia 1 3 5 7 9 11 13, etc. En el segundo cuadro, comenzará el desplazamiento en 2 y corra a lo largo de 2 4 6 8 10 12 etc. A partir de las pruebas actuales, el incremento automático parece tomar el siguiente número libre, no uno que haya quedado antes. P.ej.Si el servidor 1 inserta los primeros 3 registros (1 3 y 5), cuando el Servidor 2 inserta el 4to, se le dará la clave de 6 (no 2, que no se utiliza).

Una vez que haya configurado eso, inicie ambos como esclavos. Luego, para verificar que ambos estén funcionando bien, conéctese a ambas máquinas y realice el comando SHOW SLAVE STATUS y debe tener en cuenta que tanto Slave_IO_Running como Slave_SQL_Running deben decir "SÍ" en cada cuadro.

Luego, por supuesto, cree unos pocos registros en una tabla y asegúrese de que una casilla solo está insertando las teclas primarias impares y la otra solo está incrementando las pares.

A continuación, realice todas las pruebas para asegurarse de que puede ejecutar todas las aplicaciones estándar en cada caja y replicarlas en la otra.

Es relativamente simple una vez que está funcionando. Pero como se ha mencionado, MySQL lo desaconseja y le aconseja que se asegure de tener en cuenta esta funcionalidad al escribir el código de la aplicación.

Editar: Supongo que teóricamente es posible agregar más maestros si se asegura de que los desplazamientos son correctos y así sucesivamente. Sin embargo, puede ser más realista agregar algunos esclavos adicionales.

+0

Para la redundancia, dos maestros deberían ser suficientes. Para equilibrar la carga, se pueden usar configuraciones individuales de maestro y esclavo en ambas ubicaciones. Pero el uso de un maestro con un esclavo externo, al cual se puede cambiar manualmente en caso de falla, es otra opción. – jishi

+0

También, asegúrese de que los servidores tienen valores diferentes para id_servidor y que réplica-misma-server-id está ajustado a su valor predeterminado de 0. Esto puede ser ya, pero se repetirá y encuentro errores si no. – benlumley

+0

me gusta la idea de hacer que los servidores aumenten automáticamente en 2, luego escribo un complemento personalizado para rastrear inserciones/ediciones y el complemento se encargará del resto. entonces, si el servidor 1 se inserta (1,3,5), el complemento puede elegirlo y exportarlo al servidor 2 usando el mismo ID y viceversa, por lo tanto, no hay conflictos. –

0

La única forma de garantizar que sus tablas estén sincronizadas es configurar una duplicación bidireccional entre las bases de datos.

Pero, MySQL solo permite la replicación unidireccional, por lo que no puede simplemente resolver su problema en esta configuración.

Para ser claros, puede "configurar" una replicación bidireccional pero MySQL AB discourages this.

1

¿Es importante que los UID sean los mismos? ¿O pensaría en tener una tabla o columna mapeando el UID remoto al UID local y escribiendo un código de sincronización personalizado para los objetos que desea replicar a través de que haga cualquier asignación necesaria de UID para columnas de clave externa, etc.?

+0

Sí, es importante que los UID sean los mismos en ambos servidores. sin embargo, no tienen que seguir una secuencia, solo necesitan ser similares y únicos en ambos servidores. Gracias de cualquier manera. tengo una muy buena idea de lo que haré. –

2

MySQL no es compatible con la replicación sincrónica, sin embargo, incluso si lo hiciera, probablemente no querría usarlo (no puede tomar el rendimiento de esperar a que el otro servidor se sincronice en cada transacción).

Tendrás que considerar soluciones arquitectónicas más apropiadas para ello - hay productos de terceros que realizarán una fusión y resolverán conflictos de forma predeterminada - esta es la única manera realmente.

Esperar que su arquitectura funcione de esta manera es ingenuo: no hay una "solución fácil" para ninguna base de datos, no solo para MySQL.

+0

no espera como usted describe - como arriba, es realmente dos instancias de maestro-esclavo – benlumley

+0

Quise decir en la situación hipotética donde MySQL soportaba la replicación sincrónica. – MarkR

Cuestiones relacionadas