MySQL Master -- Slave


Una de las formas que tiene MySQL de implementar la alta disponibilidad de datos, sin irnos a arquitecturas muy complejas es el uso de máster-slave. Un servidor hace de principal o máster y otro u otros hacen de secundarios o slaves. Este tipo de arquitectura favorece desde la alta disponibilidad hasta una mejora de rendimiento. La primera se consigue gracias a tener todos los datos replicados. Aunque un equipo falle, todos los datos siguen estando disponibles en otro de los nodos. Mientras que la segunda se consigue empleando el máster para escrituras y el resto de nodos slave para lecturas. Como todos tendrán los mismos datos, se podría leer de cualquiera de los nodos del clúster.
En este post vamos a revisar cómo montar un sistema máster-slave en MySQL. Para ello tenemos que tener en cuenta los siguientes datos:
  • Un master puede tener N slave's.
  • Un slave sólo puede tener un master.
  • Cada slave tiene que tener un ID único.
Aunque en arquitecturas más complicadas esto se puede mejorar, para comenzar vamos a trabajar tal que así. Para ello partimos de lo siguiente:
  1. Master -- 192.168.0.33 -- id: 1
  2. Slave -- 192.168.0.35 -- id: 2
Ambos equipos cuentan ya con un servidor MySQL funcionando y en la misma versión 5.1.X o 5.5.X. Por lo tanto vamos ya a configurar la replicación, que no será nada complejo.
Master:
  1. Configuramos el servidor MySQL (/etc/my.cfg)
    Las siguientes líneas deben estar en la configuración del servidor.
    log-bin   = mysql-bin
    server_id = 1
    
  2. Reiniciamos el servicio
    shell> service mysqld restart
    
  3. Creamos una usuario de replicación
    mysql@master> GRANT REPLICATION SLAVE, REPLICATION CLIENT \
               -> ON *.* \
               -> TO remote_user@'192.168.0.35' \
               -> IDENTIFIED BY 'remote_user_passwd';
    
Slave:
  1. Configuramos el servidor MySQL (/etc/my.cfg)
    Las siguientes líneas deben estar presentes en la configuración del servidor MySQL. Es importante, si tenemos varios slave's, que cada uno tenga un server_id diferente.
    log-bin           = mysql-bin
    server_id         = 2
    relay_log         = mysql-relay-bin
    log_slave_updates = 1
    read_only         = 1
    
  2. Reiniciamos el servicio
    shell> service mysqld restart
    
Llegados a este punto ya sólo queda  iniciar la replicación entre todos los slave's que deseemos. Para que todo funcione y haya una consistencia de datos tenemos que tener en cuenta los siguientes puntos básicos:
  • Copia de los datos del máster
    shell> mysqldump -u root -p --master-data=2 > all.sql
    
  • Fichero de log del máster al que apunta el binary-log y punto exacto del mismo. Este valor se obtiene con el comando "SHOW MASTER STATUS".
    mysql@master> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |       98 |              |                  | 
    +------------------+----------+--------------+------------------+
    
    1 row in set (0.00 sec)
    
Una vez que tenemos todos los datos que nos interesa pasamos el dump reciente a los equipos que harán de slave y cargamos los datos en el servidor.
mysql@slave> SOURCE /home/javier/all.sql
Y a continuación configuramos el servidor réplica para que comience a funcionar,
mysql@slave> CHANGE MASTER TO MASTER_HOST='192.168.0.33',
          -> MASTER_USER = 'remote_user',
          -> MASTER_PASSWORD = 'remote_user_passwd',
          -> MASTER_LOG_FILE = 'mysql-bin.000001 ',
          -> MASTER_LOG_POS = 98;
Lo que acabamos de hacer es configurar en el MySQL slave el servidor máster, donde le indicamos la IP, el usuario/contraseña de conexión y el punto desde donde debe comenzar a replicar. Se supone que antes de este punto ya tenemos todos los datos (recién importados del dump). Sólo queda arrancar el proceso de réplica.
mysql@slave> START SLAVE;
Y comprobar que el funcionamiento es el correcto,
mysql@slave> SHOW SLAVE STATUS;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:10.0.0.1
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 951
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 951
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 382
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:

1 row in set (0.00 sec)

Si empleas este tipo de arquitectura, quizás te interese ver cómo hacer para que el Slave de MySQL sea de sólo lectura.

La entrada MySQL master -- slave la puedes leer en El mundo en bits.


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios