Configurando MySQL Master Slave

ny

Hoy vamos a ver como configurar una replica de un servidor MySQL, despues de varios manuales que llevo viendo por la web creo que este es lo mas depurado que he conseguido, he de decir que lo he realizado sobre un CENTOS pero entiendo que cualquier distro cambiando los comandos pertinentes sera mas de lo mismo.

Vamos a empezar de 0 para los que piensan empezar ahora con la replica desde una instalación nueva, para los que ya tienen un servidor «master» tendrán que ir mas adelante cuando empecemos a configurar la replica de este servidor con su base de datos.

Para la instalación de MySQL, basta con ejecutar el siguiente código en la consola, lo que nos instalará el cliente de MySQL para conectarnos a servidores y el servidor de MySQL.

yum install mysql mysql-server

Posteriormente arrancamos el servicio

service mysqld start

Una vez instalado e iniciado el servicio para configurarlo haremos uso de un script que viene con el propio sistema y facilita esta tarea por lo que tan solo tecleamos lo siguiente:

mysql_secure_installation

cuando nos pida el default password importante darle al <enter> sin poner nada, y posteriormente nos pide que pongamos una por defecto que es donde ya pondremos la clave.

Por último Hacemos que el servicio se ejecute automáticamente con el sistema con el siguiente comando.

chkconfig –level 2345 mysqld on

Con esto ya tenemos listo nuestro servidor MySQL en nuestro centos,.

El primer paso, será modificar la configuración del master, para incluir el apartado referente a la replicación. Para ello, modificaremos su fichero /etc/my.cnf (sería recomendable hacer un backup del fichero, por si las moscas) y añadiremos lo siguiente, al final del apartado [mysqld]:

[mysqld]

# MASTER-SLAVE #
server-id=1
log-bin=mysql-bin
binlog_format=mixed
sync_binlog=1
max-binlog-size=500M
expire_logs_days=4
innodb_flush_log_at_trx_commit=1

Si ya se había modificado el fichero my.cnf, será importante revisar que no se haya declarado anteriormente alguno de estos parámetros.

Ahora pasaremos a configurar el SLAVE

El método es usar el comando CHANGE MASTER TO en el slave. La sintaxis es la siguiente:

CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
MASTER_USER=<user>, MASTER_PASSWORD=<password> ;

Por ejemplo:

CHANGE MASTER TO MASTER_HOST=’88.88.88.8′, MASTER_PORT=3306,
MASTER_USER=’replicacion’, MASTER_PASSWORD=’claverepli’;

Queda claro que se necesitará indicar lo siguiente:

  • La IP del master, con la variable «master-host«, así como el puerto (por defecto el 3306).
  • Las credenciales del usuario mysql, que se usará para la replicación, mediante «master-user» y «master-password«. Este usuario lo daremos de alta en unos momentos.

Por precaución, en un entorno con múltiples slaves, sí que he configurado en el my.cnf de cada slave, el parámetro «server-id» para que cada slave tenga un server-id diferente y que no haya problemas con la replicación.

Ahora reiniciamos en ambos servidores el servicio de mysql

service mysqld restart

Ahora en el MASTER creamos el usuario de replicación

Tal y como hemos visto antes, se necesitará un usuario mysql para la replicación. En este paso, daremos de alta al usuario en el master, únicamente.

mysql> GRANT REPLICATION SLAVE ON *.* to ‘replicacion’@’%’ IDENTIFIED BY ‘slave’;
mysql> FLUSH PRIVILEGES;
mysql> GRANT RELOAD ON *.* TO ‘replicacion’@’%’;
mysql> GRANT SUPER ON *.* TO ‘replicacion’@’%’;
mysql> FLUSH PRIVILEGES;

A partir de aquí, lo que quedaría sería pasar los datos al slave, para que tanto master como slave tengan los mismos datos, y acto seguido iniciar la replicación. Para ello, podemos hacer un backup, en el master, de la base de datos a replicar, para posteriormente restaurarla en el slave, y ahí iniciar la replicación, vamos a usar MySqlDump

mysql> FLUSH TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW MASTER STATUS;

$ mysqldump -u root -p –all-databases –master-data > master.sql
mysql> UNLOCK TABLES;

NOTA: En el ejemplo se ha usado un «–all-databases» pero se podría haber hecho el backup de las bases que nosotros queramos.

Ahora debemos restaurar el backup en el SLAVE

mysql-database-replication

Una vez tengamos el backup, deberemos restaurarlo en el/los slave/s. A continuación se describe cómo restaurar un backup hecho con mysqldump.

mysql> slave stop;
mysql -u root -p < master.sql
/etc/init.d/mysqld restart
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G

NOTA: A partir de ahora, todo lo que se cree/modifique en el master, se replicará al slave. No hará falta volver a ejecutar un «start slave» al inciar el mysqld, incluso si el mysqld se para y posteriormente se incia, no hará falta iniciar ni el master ni el slave de nuevo, ya que se iniciarán automáticamente, para los despistaos la forma mas facil de copiar el archivo de backup al otro servidor seria por scp con algo asi:

scp master.sql root@IPSERVIDORDESTINO:/tmp/

Errores

No siempre todo puede ir bien, y es posible que nos hayamos equivocado en algún punto, o que el proceso que hayamos seguido incluya algún paso extra, si por ejemplo, estamos aprovechando para migrar un entorno MySQL a nuevos servidores, que harán de Master-Slave. En cualquier caso, si nos encontramos con algún error al iniciar los slaves, tras haber restaurado el dump del master en los slaves, siempre podemos forzar la resincronización.

Para ello haremos:

  • En el master, ejecutaremos un show master status, lo cual nos devolverá el fichero de bin log y la posición en la que está.

mysql> show master status;
+——————+———–+————–+——————+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———–+————–+——————+
| mysql-bin.000060 | 315815204 |              |                  |
+——————+———–+————–+——————+
1 row in set (0.00 sec)

  • En los slaves, los resetearemos y los forzaremos a apuntar al mismo fichero y posición de logs que el master, para que empiecen a sincronizar desde ahí:

mysql> stop slave;
Query OK, 0 rows affected (0.04 sec)
mysql> RESET SLAVE;
Query OK, 0 rows affected (0.14 sec)
mysql> CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000060‘, MASTER_LOG_POS=315815204;
Query OK, 0 rows affected (0.31 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

Llegados a este punto, ya deberíamos tener la replicación Master-Slave funcionando. Una buena forma de testearlo, es creando una nueva tabla en el master, y realizando varios inserts, updates y deletes, para ver cómo se replican en el slave. En el siguiente enlace hay un paso a paso de cómo hacer este tipo de testeos:http://systemadmin.es/2010/03/como-montar-replicacion-en-master-slave-con-mysql

También te podría gustar...

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.