24 de febrero de 2011

Replicación semisíncrona en MySQL bajo Windows

La replicación en MySQL por defecto es asíncrona (dejando a un lado MySQL Cluster). El servidor maestro actualiza sus bases de datos replicadas y escribe los eventos en el log binario sin preocuparse del estado en el que se encuentren los servidores esclavos o si estos han procesado dichos eventos correctamente. 
Sin embargo MySQL 5.5 si que nos proporciona una interface para utilizar replicaciones semisíncronas. Este es su funcionamiento:
  • Si el maestro tiene activado el modo semisíncrono y hay al menos un esclavo también semisíncrono, el servidor maestro espera confirmar la transacción hasta que el esclavo semisíncrono reconoce que ha recibido todos los eventos de dicha transacción, o hasta que pasa un tiempo determinado.
  • El esclavo reconoce que recibe los eventos de la transacción cuando han sido tratados por el proceso IO. No tienen que reproducirse en las tablas replicadas (proceso SQL).
  • Si pasa un determinado tiempo sin que ningún esclavo reconozca la transacción, el maestro vuelve a la replicación asíncrona automáticamente. En cuanto un esclavo semisíncrono vuelva a la actividad, el maestro regresa al modo semisíncrono.
Veamos cómo podemos configurar esta replicación en Windows. Partimos de una estructura típica de replicación maestro-esclavo. A continuación lo que tenemos que hacer es cargar los plugins que nos permitirán activar esta funcionalidad. Si lo hacemos tal y como lo explica el manual (http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-installation.html) obtendremos un error:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
ERROR 1126 (HY000): Can't open shared library 'C:\Program Files\MySQL\MySQL Server A\lib/plugin/semisync_master.so' (errno: 2 )

Obtenemos un error, puesto que este comando se utiliza cuando el servidor funciona sobre Unix. Sin embargo en Internet la información de cómo realizarlo en sistemas Windows es casi inexistente, así que sirva este artículo para ver cómo tenemos que realizarlo en este sistema operativo. La solución es sencilla, y se trata de cargar liberías dinámicas .dll en lugar de las indicadas anteriormente:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.dll';
Query OK, 0 rows affected (0.07 sec)

Y comprobamos que se ha cargado correctamente:
mysql> show plugins;
+-----------------------+----------+--------------------+---------------------+---------+
| Name                  | Status   | Type               | Library             | License |
+-----------------------+----------+--------------------+---------------------+---------+
| binlog                | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| mysql_native_password | ACTIVE   | AUTHENTICATION     | NULL                | GPL     |
| mysql_old_password    | ACTIVE   | AUTHENTICATION     | NULL                | GPL     |
| CSV                   | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| MEMORY                | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| MyISAM                | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| MRG_MYISAM            | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| ARCHIVE               | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| BLACKHOLE             | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| FEDERATED             | DISABLED | STORAGE ENGINE     | NULL                | GPL     |
| InnoDB                | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| INNODB_TRX            | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_LOCKS          | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_LOCK_WAITS     | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_CMP            | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_CMP_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_CMPMEM         | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| INNODB_CMPMEM_RESET   | ACTIVE   | INFORMATION SCHEMA | NULL                | GPL     |
| PERFORMANCE_SCHEMA    | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| partition             | ACTIVE   | STORAGE ENGINE     | NULL                | GPL     |
| rpl_semi_sync_master  | ACTIVE   | REPLICATION        | semisync_master.dll | GPL     |
+-----------------------+----------+--------------------+---------------------+---------+
21 rows in set (0.01 sec)


Y posteriormente realizamos algo parecido en el esclavo:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.dll';
Query OK, 0 rows affected (0.00 sec)


El último paso es activar este tipo de replicación. Lo podemos hacer modificando los ficheros de configuración de los servidores (lo que motivaría tener que reiniciarlos) o también podemos hacerlo dinámicamente (lo configuramos hasta el próximo reinicio). Vamos a hacerlo de esta última forma:
En el maestro:
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)


En el esclavo:
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)

Reiniciamos el esclavo para que el maestro se de por enterado del cambio efectuado en el esclavo:
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)


Y ya estaría configurado. Si os resulta interesante este artículo, igual próximamente os hago alguna demostración de funcionamiento y monitorización de este tipo de replicación.
Powered By Blogger