La replicación maestro-maestro no es tan buena como podría pensar, lo mismo ocurre con el proxy round-robin y soluciones 'fáciles' similares. Si confirma la colisión de datos en servidores separados lo suficientemente rápido (más rápido que la demora entre los servidores, que en servidores de producción puede ser de hasta un segundo completo *
), ambos aceptarán los datos. Si tiene un servidor de subastas, acaba de vender el mismo automóvil dos veces . Quien lo compro? ¡Depende de qué DB preguntarás!
La aplicación debe tener en cuenta que en realidad hay 2 bases de datos y debe conocer sus dos direcciones IP. Si desea "vender", debe fe
DB_number = `auction_number` % `number_of_databases`
( %
es para modulo
)
... y confirmarlo en la base de datos DB_number. Si obtiene un error de conexión, quizás lo haga con el otro (pero en el caso de un servidor de subastas, solo mostraría un error).
Además, las direcciones IP deben ser wackamole -d entre ambos servidores. En un escenario de desastre, donde un servidor de base de datos deja de funcionar durante un par de horas en el tiempo de uso máximo, encontrará que la aplicación intentará conectarse al servidor ausente y se bloqueará hasta que se agote el tiempo de espera, digamos, 3 segundos. De repente, la mitad de sus consultas se ejecutan 3 segundos más (y eventualmente todas van a la misma base de datos, lo que no hace que se ejecute más rápido que antes del desastre). Esto no hace feliz a su httpd, ya que probablemente tiene un grupo limitado de conexiones de subprocesos de controlador de solicitudes simultáneas ...
*
el retraso de la replicación en los servidores de producción puede ser de hasta un segundo completo : lo probé en una ubicación remota y en nuestro centro de datos y durante aproximadamente el 99% del tiempo es 0, pero a veces mysql muestra 1s. En el tráfico masivo tuve muchas colisiones debido a que la aplicación del cliente realizó dos solicitudes que dieron como resultado dos consultas, insertar y seleccionar. En algunos casos, la fila todavía no estaba allí , por lo que utilizamos el hash del ID de usuario y solucionó el problema
Espero que aprendas de mis errores ;-)