Replicacion de Mysql en FreeBSD
Master To Slave
El punto es.. mantener tus B.D sincronizanadas y no tener perdida de datos , y tener nuestros backups al día.
Manos a la Obra
Requerimientos mínimos
Tener Acceso root tanto en el sistema como en las base de datos.
Servidor 1 FreeBSD 6.3 (será Nuestro servidor Master)
Mysql Server mysql-server-5.0.51a (Corriendo N cantidad de Base de datos)
Servidor 2 FreeBSD 7.0
Mysql Server mysql-server-5.0.67_1 (Sin Bases de datos)
La teoría es replicar las bases de datos del Servidor 1 al Servidor 2 Y ya en el servidor 2 sacarle un backup a todas nuestras base de datos, para no sobre cargar nuestro servidor 1 que se encuentra en producción.
Aquí pueden replicar 1 base de datos o todas las base de datos mi caso es el segundo.
Les recomiendo se lean http://dev.mysql.com/doc/refman/5.0/es/replication.html antes de comenzar todo.
y si por algun motivo algo no les funciona revisen de nuevo sus configuraciones en ambos servidores por que si no pasaran horas tratando de dar con el problema y resultara que se les fue algún carácter raro en los archivos de configuración de mysql “Experiencia Personal” , al mejor cazador se le va la liebre no?.
Manos a la obra.
En nuestro Servidor 1 Que es nuestro servidor Master de Mysql daremos de alta
un usuario que nos servira para replicar las bases de datos con esta sentencia
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘replicador’@’host_esclavo’ IDENTIFIED BY ‘mi_contraseña’;
Donde replicador=Es el usuario que nos permitira hacer la replica de nuestras bases de datos
hosts_esclavo=la ip o el host de nuestro servidor esclavo
mi_contraseña= Sera igual a la contraseria del usuario que replicara las bases de datos.
En nuestro Servidor 2 Ingresamos la misma sentencia
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘replicador’@’host_master’ IDENTIFIED BY ‘mi_contraseña’;
El Unico cambio aqui sera el host_master que sera igual a la Ip o el nombre del host.
Siguiente paso configuración de los servidores de Base de Datos tanto en el Servidor 1 (Master) Como en el Servidor 2 (Slave)
Editaremos En el Servidor1 (Master) El archivo my.cnf , si usamos Linux/Unix/Windows usaremos nuestro editor de texto preferido.
nano /var/db/mysql/my.cnf
Agregaremos estas opciones
[mysqld]
server-id = 1
log-bin = /var/log/mysql/bin.log
Donde server-id es un numero con el que se identificare al servidor maestro.
La segunda linea log-bin es la ruta de la bitacora binaria, Asegurarnos que ese directorio exista y que el usuario mysql sea el propietario y tenga
permisos de escritura sobre el mismo directorio.
#mkdir /var/log/mysql; chown mysql.mysql /var/log/mysql
Para Nuestro Servidor Esclavo o Slave, añadiremos unas lineas extras al archivo de configuración de my.cnf
Buscamos la sección
[mysqld]
server-id= 2
master-host = host_maestro,com # o la IP del servidor maestro
master-port = 3306
master-user = replicador
master-password = mi_contraseña
log-bin = /var/log/mysql/bin.log
log-bin-index = /var/log/mysql/log-bin.index
log-error = /var/log/mysql/error.log
relay-log = /var/log/mysql/relay.log
relay-log-info-file = /var/log/mysql/relay-log.info
relay-log-index = /var/log/mysql/relay-log.index
Y ahora que ? Ya tenemos las configuraciones tanto en el servidor 1 (master) como en el Servidor2(Slave)
El siguiente paso sera copiar todas las BD del Servidor 1 Hacia el Servidor2
Pero si el servidor Master esta en produccion si sacamos un respaldo de nuestro servidor master
y lo llevamos al servidor slave, podrian existir inconsistencias en nuestras base de datos
Para eso tendremos que prevenir todo eso.
En nuestro servidor master hacemos esto
mysql> SHOW VARIABLES LIKE ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 100 |
+—————–+——-+
mysql> SET GLOBAL max_connections = 0;
Lo que hicimos es indicarle a mysql que ya no podran realizarse conexiones a la BD y solo se reserva
1 sola conexion que es para root .
Y procedemos a sacar el dump de todas las bases de datos.
# mysqldump –user=root –password=mi_root_pwd –extended-insert –all-databases –master-data > /tmp/backup.sql
Necesita explicacion? .
Procederemos a llevarnos nuestro backup de nuestras BD hacia el servidor esclavo ya sea usando
scp or ftp como sea de nuestro agrado tranferirlas.
Ok Cuando Establecimos las conexiones a 0 y al sacar el dump de eso
Nos agrega unos datos que probablemente necesitaremos mas adelante.
####
—
— Position to start replication from
—
CHANGE MASTER TO MASTER_LOG_FILE=’bin.00046′ ;
CHANGE MASTER TO MASTER_LOG_POS=8827 ;
###
O podemos obtener estos datos en el servidor master
En el servidor maestro visualizamos el estado del servidor:
mysql> SHOW MASTER STATUSG
File: bin.00046
Position: 8827
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
Bueno nos quedamos en la parte de mover el backup hacia nuestro servidor esclavo y restauraremos
todas las bases de datos con la siguiente sentencia.
Siguiente paso
#mysql –user=root –password=mi_root_pwd < /tmp/backup.sql
Si no nos da ningun error eso quiere decir que todas nuestras bases de datos fueron restauradas en nuestro
servidor slave.
Iniciamos con esta sentencia nuestro servidor SLAVE no olviden regresar a 100 la opcion de max_connection.
#mysql>CHANGE MASTER TO MASTER_HOST=’ip-maestro’,MASTER_USER=’slave’, MASTER_PASSWORD=’slaveabdul’,MASTER_LOG_FILE=’bin.00046′, MASTER_LOG_POS=8827;
#mysql> START SLAVE;
Aqui si todo esta bien se empezaran a sincronizar los ultimos cambios del servidor master
al servidor slave.
Facil no?
Ahora si necesitamos sacar un respaldo en nuestro servidor Slave
Solo basta con parar la replicacion
mysql> STOP SLAVE;
Y sacar el dump de cualquier base de datos y luego volver a arrancarlo
mysql> START SLAVE;
O podemos sacar respaldos Automatizados, mediante este script en bash.
#!/bin/sh
fecha=`date +%Y%m%d`
mysqladmin –user=root –password=mi_root_pwd stop-slave
mysqldump –user=root –password=mi_root_pwd –lock-all-tables –all-databases > /roa/mysql/respaldo-$fecha.sql
mysqladmin –user=root –password=mi_root_pwd start-slave
Se le pueden agregar mas opciones pero ya es cuestion de uno. Si son algo paranoicos podremos hacerlo sobre ssh-tunels para Mysql aqui en un tutorial que anteriormente escribi espero que le sirva
Dudas a [email protected],[email protected]