domingo, 6 de febrero de 2011

Replicación Mysql Master-Master

Introducción

El objetivo es montar una replicación nativa de mysql en modo master-master mediante la herramienta mmm (Mysql MultiMaster). Es este caso vamos a usar dos servidores mysql5.1 sin datos (salvo las db de test y mysql).
Para el correcto funcionamiento del cluster el demonio mmm_monitor encargado de gestionar los roles del cluster lo vamos a sacar a otra máquina. (Tambien podriamos montarlo en el nodo pasivo).

Requisitos previos:

Los datafiles deben de ir en un volumen LVM para aprovecharnos de la posibilidad de hacer el mmm_clone para restore de datos. Por ejemplo para el ejemplo hemos creado un volumen LVM de 4 GB montado en el /DATABASE (los datafile estan dentro de /DATABASE/data).
Es importante dejar espacio sin asignar en LVM para realizar los snapshots.
Para nuestra configuración vamos a necesitar 4 ips:
  1. mmm1 (ip para la máquina física).
  2. mmm2 (ip para la máquina física).
  3. rol writer.
  4. rol reader (para un cluster activo-pasivo no es necesario, pero si queremos separar las lecturas de las excrituras si).

Configuración del mysql y la replicación.

Compilar un mysql de manera standard(o descargar los binarios).
Modificar el /etc/my.cnf
log-bin=mysql-bin
binlog_format=mixed
server-id = 10
read-only = 1
max_binlog_size                 = 100M
max_relay_log_size              = 100M
Creamos el usuario de replicaron en ambas maquinas.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' 
IDENTIFIED BY 'replicator'; 
Migramos los datos. Si están vacíos los mysql no hace falta.
Configuramos la replicacion:
mmm1 mysql>CHANGE MASTER TO MASTER_HOST='mmm2', 
MASTER_USER='replicator', MASTER_PASSWORD='replicator', 
MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=380;
mmm2 mysql>CHANGE MASTER TO MASTER_HOST='mmm1', 
MASTER_USER='replicator', MASTER_PASSWORD='replicator', 
MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=512; 
El valor de los campos MASTER_LOG_POS y MASTER_LOG_FILE lo sacamos ejecutando el comando SHOW MASTER STATUS en cada nodo.
Activamos la replicaición:
mysql> START SLAVE; 

Configuración mmm

Crear los usuarios que necesita el mmm:
- monitor user
- agent user
- replication user
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' 
IDENTIFIED BY 'mmm_monitor';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' 
IDENTIFIED BY 'mmm_agent';
GRANT REPLICATION SLAVE ON *.* TO 'mmm_replication'@'192.168.1.%' 
IDENTIFIED BY 'mmm_replication';
GRANT SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'mmm_tools'@'192.168.1.%'
 IDENTIFIED BY 'mmm_tools'; 
Creamos el usuario “mmmd”
useradd --comment "MMM Script Owner" --shell /sbin/nologin mmmd 
Configuramos las mmm_tools:
mkdir /mmm_snapshot /mmm_backup /DATABASE/data/_mmm 

Ficheros de configuración

  • /etc/mysql-mmm/mmm_agent.conf (personalizar por cada nodo)
include mmm_common.conf
this mmm1
  • /etc/mysql-mmm/mmm_common.conf (este fichero es comun a todos los nodos incluido el monitor)
active_master_role      writer
<host default>
      cluster_interface               eth0
      pid_path                                /var/run/mmm_agentd.pid
      bin_path                                /usr/lib/mysql-mmm/
      replication_user        mmm_replication
      replication_password    mmm_replication
      agent_user                              mmm_agent
      agent_password                  RepAgent
</host>
<host mmm1>
      ip                                              192.168.1.242
      mode                                    master
      peer                                    mmm2
</host>
<host mmm2>
      ip                                              192.168.1.243
      mode                                    master
      peer                                    mmm1
</host>
<role writer>
      hosts                                   mmm1, mmm2
      ips                                     192.168.1.244
      mode                                    exclusive
      prefer                                  mmm1
</role>
<role reader>
      hosts                                   mmm1, mmm2
      ips                                     192.168.1.245
      mode                                    balanced
</role>
  • /etc/mysql-mmm/mmm_tools.conf (común a todos los nodos)
include mmm_agent.conf
default_copy_method                     scp
clone_dirs                                      data
<host default>
      ssh_user                                root
lvm_snapshot_size           1G
      lvm_logical_volume          database
      lvm_volume_group            vol0
      lvm_mount_dir                       /mmm_snapshot
      lvm_mount_opts                      -orw
      tools_user                              mmm_tools
      tools_password                          mmm_tools
      backup_dir                              /mmm_backup
      restore_dir                             /DATABASE
</host>
<copy_method scp>
  backup_command scp -c blowfish -r %SSH_USER%@%IP%:%SNAPSHOT%/%CLONE_DIR% 
%DEST_DIR%/
  restore_command cp -axv %BACKUP_DIR%/* %DEST_DIR%/
      true_copy 1
</copy_method>
<copy_method rdiff>
      backup_command rdiff-backup --ssh-no-compression -v 5 !--include 
%SNAPSHOT%/%CLONE_DIR%! --exclude %SNAPSHOT% %SSH_USER%@%IP%::%SNAPSHOT%/ %DEST_DIR%/
      restore_command rdiff-backup --force -v 5 -r %VERSION% %BACKUP_DIR% 
%DEST_DIR%/.mmm_restore; cp -axvl --remove-destination %DEST_DIR%/.mmm_restore/* 
 %DEST_DIR%/; rm -r %DEST_DIR%/.mmm_restore/
      incremental_command rdiff-backup --parsable-output -l %BACKUP_DIR%
      single_run 1
      incremental 1
</copy_method>
<copy_method ssh-gz>
      backup_command ssh -c blowfish %SSH_USER%@%IP% "cd '%SNAPSHOT%'; tar cv !'
%CLONE_DIR%'!" | gzip > %DEST_DIR%/backup.tar.gz
      restore_command cd %DEST_DIR%; tar xzfv %BACKUP_DIR%/backup.tar.gz
      single_run 1
</copy_method>
  • /etc/mysql-mmm/mmm_mon.conf (solo la máquina que tenga el rol de monitor)
include mmm_common.conf
<monitor>
      ip                                      127.0.0.1
      pid_path                                /var/run/mmm_mond.pid
      bin_path                                /usr/lib/mysql-mmm/
      status_path                             /var/lib/misc/mmm_mond.status
      ping_ips                                192.168.1.242, 192.168.1.243
</monitor>
<host default>
      monitor_user                    mmm_monitor
      monitor_password                mmm_monitor
</host>
debug 0

Enlaces externos

2 comentarios:

  1. to do with the parameters:
    lvm_logical_volume database
    lvm_volume_group vol0
    lvm_mount_dir / mmm_snapshot
    lvm_mount_opts-ORW

    in the case of RAID10 configured on a hard disk

    ResponderEliminar