¿Cuál es la mejor manera de sincronizar bidireccionalmente datos dynamics en tiempo real usando mysql?

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.

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 forma, 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 | |-----------| 

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 Master-Master es esencialmente la misma que la configuración 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 

Master MySQL 2:

 auto_increment_increment = 2 auto_increment_offset = 2 

Estos dos parámetros aseguran que cuando dos servidores pelean por una clave primaria por algún motivo, no duplican y eliminan la replicación. En lugar de incrementar en 1, cualquier campo de incremento automático boostá 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. Por ejemplo, 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 lo haya configurado, inicie ambos como esclavos. Luego, para comprobar que ambos funcionan bien, conéctese a ambas máquinas y ejecute el comando SHOW SLAVE STATUS y debe tener en cuenta que tanto Slave_IO_Running como Slave_SQL_Running deberían 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 claves 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 cuadro y replicarlas en el otro.

Es relativamente simple una vez que está funcionando. Pero como se ha mencionado, MySQL lo desaconseja y 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 sean correctos y así sucesivamente. Sin embargo, puede ser más realista agregar algunos esclavos adicionales.

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

Deberá considerar soluciones arquitectónicas más apropiadas: hay productos de terceros que realizarán una fusión y resolverán conflictos de forma predeterminada: esta es la única forma en la que realmente existe.

Esperar que tu architecture funcione de esta manera es ingenuo: no existe una “solución fácil” para ninguna base de datos, no solo para MySQL.

¿Es importante que los UID sean iguales? ¿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 a los que desea replicar que haga la asignación necesaria de UID para columnas de clave externa, etc.?

La única forma de garantizar que sus tablas estén sincronizadas es configurar una replicació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 que quede claro, puede “configurar” una replicación bidireccional, pero MySQL AB lo desalienta .