viernes, 28 de agosto de 2009

Configuración de réplicas de MySQL

Es bastante frecuente encontrarse con la necesidad tener, no un único servidor de base datos, sino un conjunto de ellos sincronizados. A menudo esto se hace por razones de rendimiento y escalabilidad.

MySQL nos ofrece dos posibilidades para solucionar este problema: la replicación y el cluster.

En la replicación de nodos MySQL existe un servidor maestro y N servidoes esclavos. Los esclavos se sincronizan a partir del maestro. Esta sincronización es en un único sentido: del maestro al esclavo. Es por ello por lo que los esclavos únicamente deben usarse para leer, lo que implica que todas las consultas de escritura, habrá que hacerlas sobre el maestro.

A grandes rasgos se puede decir que en el cluster MySQL existen N servidores MySQL donde todos se tratan de igual a igual. En todos los servidores se puede leer y escribir, ya que el sistema de cluster se encarga de sincronizar todos los nodos. Realmente es más complejo que lo que dicen estas 3 líneas, por lo que si tienes curiosidad puedes leer la documentación oficial acerca del Cluster MySQL.

Mientras que en primer caso no existiría la alta disponibilidad, al menos en lo que a escritura se refiere, ya que la caída del maestro implica que no se pueden ejecutar las consultas de escritura; en el segundo caso la alta disponibilidad sí que existe, ya que ante la caída de un nodo, el resto podría seguir funcionando perfectamente.

Este post se centra en la configuación de réplicas MySQL. Me gustaría probar el cluster porque tiene buena pinta. Si lo hago pondré un post sobre cómo se configura.

Configuración

A continuación se describen los pasos que hay que seguir para configurar una réplica de un servidor MySQL.

1. Crear usuario de replicación en el servidor maestro para poder replicar

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

2. Ajustar la configuración del maestro en el my.cnf

[mysqld]
log-bin=mysql-bin
server-id=1

Para mejorar el rendimiento en innodb, ajustar también en el maestro lo siguiente:

innodb_flush_log_at_trx_commit=1
sync_binlog=1

Reiniciar MySQL.

3. Ajustar la configuración del esclavo en el my.cnf

[mysqld]
server-id=2

Reiniciar MySQL

4. Obtener información de replicación del maestro. (Se utilizará en el paso siguiente)

mysql> show master status;

5. Configurar la conexión con el maestro en el esclavo. Los datos MASTER_LOG_FILE y MASTER_LOG_POS hay que cogerlos del resultado del paso anterior.

mysql> CHANGE MASTER TO MASTER_HOST='master_host_name',
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position;

6. Iniciar la sincronización en el esclavo.

mysql> START SLAVE;
Y listo. En caso de que Hubiera más de un esclavo el proceso es análogo.

Espero que sea de utilidad.

2 comentarios:

Andres dijo...

Muy bueno. Antes de mirar el cluster repasa las restricciones que hay para el motor de almacenamiento, verás que muchas veces es mejor quedarse con la replicación...

Xela dijo...

Muchas gracias, Andrés. Tienes razón cuando lo estuve viendo me pareció ver eso, pero ahora que lo has comentado, le he echado un vistazo y tiene más limitaciones de lo que pensaba. Limitaciones del Cluster MySQL.

;-)