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 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 ...

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...

Resetear password de NextCloud

Estimados, recienmente he estado trabajando en la administración de archivos para una institución gubernamental, por lo que comenzamos a trabajar con NextCloud . Para mas información de la plataforma consulten la documentación Como suele pasar en muchas ocasiones, es probable que podamos olvidar la password del usuario admin o que quien instaló no haya previsto el anotarla y se olvide. Para realizar el reset o cambiar la password del administrador u otro usuario se puede realizar de la siguiente manera. 1. Click en el link de reset password en la pantalla de login, esta link aparece al intentar la primera vez en el acceso y falla. Este metodo solo funcionara si se definio un correo electrónico para el usuario, por lo que Nextcloud te enviara una correo con las instrucciones. 2. Solicitar a otro usuario que tenga permisos de administrador, para que te resetee el password. Si lo anterior no funciona o no esta en el escenario en que estas, puedes resetear el password tenie...