Pregunta

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 ingresa 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 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 esa 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 nuevamente 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  |
|-----------|
¿Fue útil?

Solución

No se puede obtener mucho rendimiento replicando 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 ha iniciado tanto Slaves como un cambio importante en sus archivos de configuración en cada cuadro.

Master 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 están peleando por una clave primaria por alguna razón, no duplican y matan la replicación. En lugar de aumentar en 1, cualquier campo de incremento automático aumentará por defecto 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 corre a lo largo de 2 4 6 8 10 12 etc. 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 se deja sin usar).

Una vez que haya configurado eso, comience a ambos como esclavos.
Luego, para verificar que ambos funcionen correctamente, 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 ambos dicen & # 8220; SÍ & # 8221; en cada caja

Luego, por supuesto, cree algunos registros en una tabla y asegúrese de que una casilla solo inserte claves primarias impares y la otra solo incremente las pares.

A continuación, realice todas las pruebas para asegurarse de que puede realizar 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 desalienta y aconseja que se asegure de tener en cuenta esta funcionalidad al escribir el código de su aplicación.

Editar: supongo que es teóricamente posible agregar más maestros si se asegura de que los desplazamientos sean correctos, etc. Sin embargo, puede ser más realista agregar algunos esclavos adicionales.

Otros consejos

MySQL no admite la replicación síncrona, sin embargo, incluso si lo hiciera, probablemente no querrá usarlo (no puede soportar el impacto en el rendimiento de esperar que el otro servidor se sincronice en cada confirmación de transacción).

Tendrá que considerar soluciones arquitectónicas más apropiadas: hay productos de terceros que fusionarán y resolverán conflictos de una manera 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 cualquier base de datos, no solo MySQL.

¿Es importante que los UID sean iguales? ¿O le gustaría tener una tabla o columna que asigne el UID remoto al UID local y escriba un código de sincronización personalizado para los objetos que desea replicar que haga cualquier 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 ser claros, puede " configurar " una replicación de 2 vías pero MySQL AB desalienta esto .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top