Hemos hablado ya de cómo instalar un servidor MySQL en replicación multimaster, y también cómo solucionar el problema que aparecía en los autoincrementales. Hoy voy a comentar un problema que también aparece en este modelo y que es el de las transacciones. Por temas de rendimiento generalmente MySQL no escribe todos los datos a disco cada vez que algo nuevo se manda, sino que lo junta todo en lo que se denomina una transacción y luego lo realiza. Esto garantiza que los datos sean en todo momento consistentes. El problema que tenemos aquí es saber qué sucede si lo mismo sucede a través de la red. Un master puede enviar los datos para que sean escritos en 'su slave', pero éstos deben garantizarse que son escritos antes de que el master los escriba. De no ser así, podríamos llegar a un punto de inconsistencia: master y slave tendrían datos diferentes. Para evitarlo debemos habilitar las transacciones síncronas. Esto obliga a que los datos sean escritos en el slave antes que en el master y en caso de que el slave no responda, se escriben únicamente en el master pasado un tiempo. Luego el proceso de sincronización de datos deja master y slave en el mismo punto cuando el slave esté nuevamente vivo.
Para configurar esto debemos ejecutar los siguientes comandos en ambos nodos del clúster.
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';Y en el fichero de configuración (/etc/my.cnf) escribir lo siguiente,
[mysqld] ... rpl_semi_sync_slave_enabled = 1 rpl_semi_sync_master_enabled = 1 ...Tras ello, reiniciar el servidor MySQL.
shell> service mysql restart
Una vez terminado de aplicar en ambos nodos, podemos ver las nuevas variables aplicadas y el valor de las mismas, el cual podemos modificar a nuestro antojo, para mejorar el rendimiento si así lo consideramos oportuno.
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +------------------------------------+-------+ 6 rows in set (0.01 sec) mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+ 15 rows in set (0.00 sec)
Si quieres ampliar información, aquí.
No hay comentarios :
Publicar un comentario