Replicación asíncrona unidireccional con MySQL en freeBSD


En un artículo pasado abordé el tema de la replicación asíncrona en los servidores de bases de datos instalados con PostgreSQL. Hoy les traigo la misma tónica pero con el mucho más conocido MySQL. Sus funciones de replicación exceden en estos momentos a las del PostgreSQL pero la variante que les mostraré hoy coincide con las mostradas en el pasado artículo. Lo siguiente fue implementado en freeBSD y puede ser implementado en cualquier distribución UNIX/LINUX por supuesto haciendo los cambios necesarios en cuanto a la ubicación de los ficheros de configuración.

La réplica asíncrona en MySQL es un proceso muy parecido a su homóloga en PostgreSQL. La replicación asíncrona unidireccional en la que un servidor actúa como maestro y uno o más actúan como esclavos. El servidor maestro escribe actualizaciones en el fichero de log binario, y mantiene un índice de los ficheros para rastrear las rotaciones de logs. Cuando un esclavo se conecta al maestro, informa al maestro de la posición hasta la que el esclavo ha leído los logs en la última actualización satisfactoria. El esclavo recibe cualquier actualización que han tenido lugar desde entonces, y se bloquea y espera para que el Maestro le envíe nuevas actualizaciones. Importante decir que un esclavo puede servir de maestro si se quiere en una cadena de replicaciones.

El servidor MySQL puede ser instalado en freeBSD desde las fuentes y compilado o desde los ports, utilidad de preferencia en freeBSD para la instalación de paquetes.

Configuración del servidor Maestro

El servidor maestro es el encargado de servir las actualizaciones, todos los cambios los escribe en un log binario el cual será leído por los esclavos para actualizarse. Lo primero es crear el usuario con que los esclavos se conectarán al maestro. Este usuario debe tener privilegios de REPLICATION SLAVE en las tablas que se necesite replicar. Recomendado que estas credenciales solo se usen para procesos de replicación y no para ningún otro servicio.

  // Nos conectamos al servidor MySQL local
  user@mysql1$mysql -u root -p 
  // Nos ubicamos dentro de la base de datos mysql la cual tiene configuraciones, usuarios y roles necesarios para el servidor
  mysql>use mysql; 
  // Concedemos el rol de REPLICATION al usuario esclavo desde cualquier servidor (puede especificarse la dirección IP)
  mysql>GRANT REPLICATION SLAVE ON *.* TO 'esclavo'@'%' IDENTIFIED BY 'esclavopass'; 
  // Aplicamos cambios
  mysql>FLUSH PRIVILEGES; 

El fichero principal de configuración del MySQL en freeBSD necesitamos configurarlo para que tome el rol de Maestro.

  // Fichero /etc/my.cnf

[mysqld]                                                                                                                                                                                             
bind-address=1.1.1.1 // Dirección IP por la que brindaremos el servicio                                                                                                                                                                                                     
  server-id=1 // ID único del servidor, importante que los esclavos u otro Maestro no lo posean
  expire_logs_days=10 // El número de días para eliminar el log binario automáticamente
  max_binlog_size=500M // Si una escritura en el log binario excede el valor dado, rota el log binario. No puede cambiar este valor a más de 1GB o a menos de 4096 bytes. Valor por defecto es 1GB.
  log-bin=mysql-bin.log // Activar logs binarios que serán procesados por los Esclavos
  log-error=mysql-bin.err // Nombre del log binario de errores ocurridos durante transacciones
  query_cache_size=256M // La cantidad de memoria reservada para cachear resultados de consultas
  query_cache_type=1 // Cachea todos los resultados de consultas excepto los que empiecen con <strong>SELECT SQL_NO_CACHE</strong>
  query_cache_limit=1048576 // No cachea resultados mayores que este número de bytes

Una vez hechas las configuraciones necesarias procedemos a reiniciar o iniciar según sea el caso el servicio de MySQL con el comando en la consola /usr/local/etc/rc.d/mysql-server restart o /usr/local/etc/rc.d/mysql-server start

Configuración del servidor Esclavo

Esta configuración se repite en cada uno de los esclavos que podamos necesitar. Siempre tener en cuenta el valor de la variable server-id que debe ser único en todo este proceso de replicaciones.

// Fichero /etc/my.cnf

[mysqld]
  bind-address=1.1.1.2
  server-id=2
  replicate-same-server-id=0 // Usualmente puede usar el valor por defecto de 0, para evitar bucles infinitos en replicación circular
  auto-increment-increment=2
  auto-increment-offset=1
  replicate-do-db=postfix // Le dice al esclavo que restrinja replicación a comandos donde la base de datos por defecto (esto es, la seleccionada por USE) es postfix
  log-bin=mysql-bin.log
  log-error=mysql-bin.err
  binlog-do-db=postfix // Registro binario de logs de transacciones de la base de datos postfix
  relay-log=slave-relay.log // El nombre para el log retardado
  relay-log-index=slave-relay-log.index // Localización y nombre que deben usarse para el fichero índice del log retardado
  expire_logs_days=10
  max_binlog_size=500M
  binlog-ignore-db=information_schema
  binlog-ignore-db=performance_schema
  innodb_flush_log_at_trx_commit=1
  sync_binlog=1
  query_cache_size=256M
  query_cache_type=1
  query_cache_limit=1048576

Luego reinicio o inicio el servicio MySQL en el servidor esclavo. La implementada es una configuración básica que replica los datos de la base de datos llamada postfix en el servidor maestro a uno o más servidores esclavos. Es simple y puede mejorarse. MySQL implementa una serie de posibilidades configurables a través de opciones en los ficheros de configuración o a través de herramientas que brindan en su página web.

Latest posts by Leroy Ley (see all)