MySQL 5.5 replicación semi sincrona

Una de las novedades de MySQL 5.5 fue la introducción de la replicación semi-sincrona. Una variación sobre la replicación nativa de MySQL que otorga más estabilidad ante errores. Vamos a ver como se pone en marcha.

Antes de nada, una explicación.

Replicación convencional

Con la replicación convencional, se envía una transacción al master (1). Cuando se recibe el COMMIT, el master lo ejecuta (2) y si es correcto se loguea el evento en el “binary log” (3). Entonces el master responde al cliente su petición (4) con un resultado correcto. Mientras tanto, el esclavo replica la entrada (5). Qué pasa si el master tiene un problema después del punto 4 y antes de que el esclavo haya tenido la oportunidad de recibir los datos del punto 5? El cliente recibirá el resultado de la transacción pero los dato se habrán perdido porque nunca habrán llegado al esclavo. Resumen, CORRUPCIÓN BASE DE DATOS ESCLAVA.

Veamos el esquema ahora con la replicación semi-sincrona de MySQL 5.5

Todo es lo mismo hasta el punto 3. Entonces, el tema cambia. El master no devuelve nada al cliente. En vez de esom alerta al esclavo de que una transacción está disponible. El esclavo la recibe y lo guarda en el relay log (5). Sin otra acción, el esclavo indica al master que la transacción fue recibida (6) y sólo el master devuelve ahora el resultado al cliente (7). ¿Cuál es la mejora? Si el master deja de funcionar, la transacción se pierde. Pero el cliente no recibe la falsa información de que la transacción fue guardada. En vez de eso, si el master deja de funcionar antes de que se devuelva el resultado del cliente, el cliente recibirá un error, y sabrá que esa transacción necesita ser examinada de nuevo cuando el master vuelva a estar operativo.

Requisitos

  • MySQL 5.5
  • Tener replicación ya funcionando
  • MySQL requiere la capacidad de cargar plugins dinámicamente

Comprobamos que disponemos de esta funcionalidad

# mysqladmin -uroot -p variables |grep have_dynamic_loading
| have_dynamic_loading | YES |

Con estos tres requisitos cumplidos, vamos a ver como ponemos en marcha esto.

1. Configurar replicación convencional

Seguimos este tutorial para poner en marcha la replicación convencional.

https://www.rubenortiz.es/2011/07/08/mysql-replicacion-master-a-slave/

2. Instalar plugins

Una vez tenemos la replicación en marcha, vamos a cargar el plugin de la replicación semi-sincrona.

master> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
master> SET GLOBAL rpl_semi_sync_master_enabled = 1;
slave> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
slave> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
slave> STOP SLAVE; START SLAVE;

3. Comprobar replicación semi sincrona


SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+------------+
| Variable_name | Value |
+--------------------------------------------+------------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 3996 |
| Rpl_semi_sync_master_net_wait_time | 13611165 |
| Rpl_semi_sync_master_net_waits | 3406 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 404 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1522695 |
| Rpl_semi_sync_master_tx_wait_time | 1907936998 |
| Rpl_semi_sync_master_tx_waits | 1253 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 36 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 3593 |
+--------------------------------------------+------------+
14 rows in set (0.00 sec)

 


SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.32 sec)

Comentario: en un post sobre este tema donde comenta gente como Peter Zaitsev, recomiendan no utilizar esta replicación entre instancias con latencias altas. En el ejemplo hacen incapié en que una latencia de 85 ms tienen como resultado un tope de 11 inserts/segundo. Esto no ocurre entre instancias con baja latencia. Avisados!

Links

http://blog.9minutesnooze.com/performance-mysql-replication-high-latency/

http://www.dbi-services.com/index.php/blog/entry/mysql-data-high-availability-with-semi-synchronous-replication

http://datacharmer.blogspot.com.es/2010/11/testing-mysql-55-semi-synchronous.html

http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-installation.html

Leave a Reply

Your email address will not be published. Required fields are marked *