
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:
- Master -- 192.168.0.33 -- id: 1
- 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.
- 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
- Reiniciamos el servicio
shell> service mysqld restart
- 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';
- 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
- Reiniciamos el servicio
shell> service mysqld restart
- 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