Ir al contenido principal

Como replicar una base de MySQL en Linux

Lectores, en esta ocasión les traigo otro "Como" para quienes administran bases de datos en el gestor MySQL (posiblemente aplique para MariaDB pero no he probado).

Introducción


La replicación es una técnica donde a una base de datos se le indica ser copiada uno o mas destinos. Por lo que la fiabilidad, tolerancia a fallos o accesibilidad de la base de datos se puede mejorar.

Las replicaciones pueden darse:

  • Basado en instantánea de la base (snapshot), donde la base de datos completa es copiada a otro equipo.
  • Basado en combinación o fusión, donde dos o mas bases se copian y se unen en una sola.
  • Basado en transacción, donde la actualización de los datos se aplican periódicamente entre un servicio maestro y uno esclavo.

La replicación de MySQL es considerada como base transaccional. Para implementar la replicación en MySQL, el servicio maestro guarda un log de transacciones de todas las actualizaciones que ha realizado.

Los servicios esclavos, se conectan al maestro y leen el log y actualizan cada registro.  Además de mantener un log de transacciones, el maestro lleva a cabo diversas tareas de mantenimiento, como la rotación de registro y control de acceso.

Cuando se producen nuevas transacciones y el servicio maestro, actualiza el log, los servicios esclavos realizan las mismas transacciones en su copia del servicio maestro y actualizan su posición.

Este proceso de replicación maestro-esclavo se realiza de forma asíncrona, lo que significa que el servicio maestro no tiene que esperar a que los esclavos se pongan al día.

Si los esclavos no pueden conectar con el maestro por un período de tiempo, se descarga y ejecuta todas las transacciones pendientes cuando se restablezca la conectividad.

La replicación de bases de datos permite tener una copia exacta de una base de datos en vivo de un servidor maestro en otro servidor remoto (servidor esclavo) sin tener que desconectar el servidor maestro.

En caso de que el servicio principal este inactivo o tenga algún problema, se puede señalar temporalmente clientes de bases de datos o de resolución de DNS para la dirección IP del servicio esclavo, logrando un failover transparente. 

Se debe señalar que la replicación de MySQL no es una solución de copia de seguridad. Por ejemplo, si un comando DELETE no deseado es ejecutado en el servicio maestro por accidente, la misma transacción se aplicara en todos los servicios esclavos.

Se estará mostrando como realizar la replicación de MySQL en dos equipos Linux. Para este ejemplo se tomaran las direcciones IP 192.168.2.1 y 192.168.2.2 para servicio maestro y esclavo respectivamente.


Configurando el servicio maestro


Primero, acceder a la consola de MySQL y crear la base de datos test_repl


$ mysql -u root -p 

mysql> CREATE DATABASE test_repl;

 Posterior crear una tabla dentro de la base de datos e insertar 3 registros de ejemplo:


mysql> USE test_repl;
mysql> CREATE TABLE employee (
-> EmployeeID int, 
-> LastName varchar(255), 
-> FirstName varchar(255), 
-> Address varchar(255), 
-> City varchar(255));

mysql> INSERT INTO employee VALUES(1,"LastName1","FirstName1","Address1","City1"),
-> (2,"Lastname2","FirstName2","Address2","City2"),
-> (3,"LastName3","FirstName3","Address3","City4");

Posterior de salir de la consola de MySQL, editar el archivo my.cnf utilizando su editor favorito, el archivo puede encontrarse en /etc o en /etc/mysql.

Agregar las siguientes lineas


[mysqld]
server-id=1
log-bin=master-bin.log
binlog-do-db=test_repl
innodb_flush_log_at_trx_commit=1
sync_binlog=1


La opción server-id asigna un ID entero (en el rango de 1 a 2^32) al servidor master. Para temas de ejemplo, el ID 1 y 2  seran asignados para el servidor master y esclavo respectivamente.

El servidor master debe tener activo en logging binario (con la opción log-bin) el cual activara la replicación. Asignar a la opción binlog-do-db el nombre de la base de datos que replicara al servidor esclavo.

Las opciones innodb_flush_log_at_trx_comming = 1 y sync_binlog=1deben estar activo para una mejor posibilidad de durabilidad y consistencia en la replicación.

Posterior a guardar los cambios en el archivo my.cnf, reiniciar el servicio mysqld.

# systemctl restart mysqld
o con el comando

# /etc/init.d/mysqld restart

Posterior, entrar a la consola del servidor master para crear un nuevo usuario para el servidor esclavo. Asignar el permiso de replicación al usuario creado.

mysql> CREATE USER repl_user@192.168.2.2;
mysql> GRANT REPLICATION SLAVE ON *.* TO repl_user@192.168.2.2 IDENTIFY BY 'repl_user_password';
mysql> FLUSH PRIVILEGES;


El usuario creado (en este ejemplo) es repl_user y la contraseña es repl_user_password. Confirmar que el servidor MySQL master no este asignado a la interfaz looback, es decir, que escuche peticiones solo en la dirección local del servidor, ya que el servidor esclavo necesita registrarse al servidor master vía su dirección IP.

Finalmente, revisar en el servidor master su estado ejecutando el siguiente comando en la consola:

mysql> SHOW MASTER STATUS;


Nótese que la primera y la segunda columna será utilizada por el servidor esclavo para realizar la replicación.

Configurando el servicio esclavo


Ahora es el turno del servidor esclavo. Primero editar el archivo my.cnf con el editor favorito y agregar las siguientes lineas dejo de la sección [mysqld].

server-id   = 2
master-host = 192.168.2.1
master-connect-retry    = 60
master-user = repl_user
master-password = repluser
master-info-file    = mysql-master.info
relay-log-index = /var/lib/mysql/slave-relay-bin.index
relay-log-info-file = /var/lib/mysql/mysql-relay-log.info
relay-log   = /var/lib/mysql/slave-relay-bin
log-error   = /var/lib/mysql/mysql.err
log-bin = /var/lib/mysql/slave-bin

Posterior, guardar los cambios y reiniciar el servicio.

# systemctl restart mysqld

Entrar a la consola del servidor esclavo y ejecutar los siguientes comandos

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.1', MASTER_USER='repl_user',
         -> MASTER_PASSWORD='repl_user_password', MASTER_LOG_FILE='master-bin.00002',
         -> MASTER_LOG_POS=107;
mysql> SLAVE START;
mysql> SHOW SLAVE STATUS \G;

Con el comando anterior el servicio MySQL local se convierte en servidor esclavo para el servidor master en 192.168.2.1. Entonces el servidor esclavo se conecta al servidor master con el usuario repl_user y monitorea el archivo log binario master-bin.000002 para la replicación.


La imagen anterior muestra el estado del servidor esclavo. Para confirmar que la replicación se ha realizado, revisar los 3 campos marcados de la salida del comando de estado.

Primero, el dato Master_Host debe mostrar la dirección IP del servidor maestro. Segundo, el dato Master_User indica el usuario utilizado para la replicación. Y tercero el dato Slave_IO_Running debe mostrar el valor 'Yes'

Cuando el servidor esclavo comienza a trabajar, este leerá automáticamente el log de la base de datos del servidor maestro y creara las mismas tablas y entradas en caso que no se encuentren el servido esclavo.

Con lo anterior quedaría configurada la replicación entre ambos servidores. Esperando que sea de utilidad a mas de alguno.

Saludos y nos leemos en una próxima entrada.

Comentarios

Entradas más populares de este blog

Como montar particiones LVM en Linux

Como están lectores, reportandome después de varios meses fuera. Hace un par de días vi un howto que me gusto y quiero compartir. Nota: lo siguiente es una traducción, el original lo pueden ver el siguiente link: How to mount an LVM partition on Linux Introducción LVM es una herramienta de administración de volúmenes lógicos (particiones) la cual te permite administrar el espacio de disco usando la connotación de volúmenes lógicos y grupo de volúmenes. El mayor beneficio de usar LVM sobre las particiones clásicas es la flexibilidad en la asignación de almacenamiento para usuarios y aplicaciones sin verse limitado por el tamaño de los discos individuales. En LVM, el almacenamiento físico, en el cual se crean los volúmenes lógicos, son particiones tradicionales (/dev/sda1, /dev/sda2). Estas particiones deben ser marcadas como "volúmenes físicos" y etiquetadas como "Linux LVM", esto para ser usadas en LVM. Como no montar Unas vez que las particiones h

Configurando interfaces de red virtuales en Linux

Estimados, de nuevo en acción retomando mi rumbo. Les traigo un traducción de un howto que me llamo la atención y creo que es bueno tener información en castellano. Así que aquí esta: La entrada original la pueden tener aqui (si te gusta leer en ingles), comencemos. Introducción ¿Sabia que puedes asignar mas de una dirección IP a una única interfaz de red? Esta técnica es muy utilizada, por ejemplo cuando se trabaja con Apache y host virtuales, esto para permitir accesar al mismo servicio pero usando dos direcciones IP. Interfaz de red virtual temporal  El proceso de crear interfaces de red virtual en +GNU/Linux  es muy simple. Esto involucra una ejecución simple del comando ifconfig ifconfig eth0:0 123.123.22.22 El comando anterior creara una nueva interfaz de red virtual basada en la interfaz física de eth0 . Lo condición mas importante para crear una interfaz de red virtual es la interfaz física de red, como en nuestro ejemplo, eth0 debe existir. El ejemplo comple

Como leer/visualizar archivos utmp, wtmp y btmp en Linux

Lectores, les paso este "Como" de linux, algo que debe ser usado por cualquier sysadmin de Linux. Esperando aportar conocimiento, aqui les dejo. Introducción. En sistemas operativos Linux/Unix todo es registrado en algun lado (los conocidos logs). La mayoria de registros del sistema se almacenan en el directorio /var/log . El directorio contiene registros relacionados a distintos servicios y/o aplicaciones. En este directorio tenemos algunos archivos como utmp , wtmp y btmp . Estos archivos contienen todo el detalle de registro de inicio (login) y termino (logout) de sesiones de usuarios ya sea local, sistemas remoto, como estado en el sistema, tiempo en linea, etc. Informacion sobre los archivos utmp : te mostrara informacion completa del acceso de usuarios, la terminal que usa, termino de sesion, eventos del sistema y el estado actual del mismo, etc. wtmp : contiene el historio del archivo utmp btmp : registros solo intentos fallidos de sesion. Como no