Replicación Maestro

11
Replicación Maestro-Maestro en MySQL Esta tarde me vi en la necesidad de realizar otra configuración de maestro- maestro entre dos servidores de MySQL y por fin me decido a poner una pequeña guía con los pasos que he seguido. Cabe mencionar que las instalaciones en ambos servidores deben ser idénticas, obviamente los ficheros de configuración deben ser los mismos, pero de cara a la facilidad de gestión y compatibilidades recomiendo que las instalaciones ya sean por repositorios o compilaciones sean las mismas (misma estructura de directorios, version de los mysql, etc.) Recuerdo que en mi caso fue una compilación y los directorios seguramente no coincidan con la versión instalada por repositorios, en cualquier caso el nombramiento es el mismo y podéis buscarlas por la máquina si no sabeis donde se encuentran. Partimos de una instalación limpia, en la cual tendremos que configurar absolutamente todo. Nuestros servidores serán db1 con IP 192.168.1.77 y db2 con IP 192.168.1.78 Editamos el fichero /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8 [mysqld] port = 3306 socket = /tmp/mysql.sock character_set_server = utf8 datadir = /DATABASE/data basedir = /opt/mysql

Transcript of Replicación Maestro

Page 1: Replicación Maestro

Replicación Maestro-Maestro en MySQLEsta tarde me vi en la necesidad de realizar otra configuración de maestro-maestro entre dos servidores de

MySQL y por  fin  me decido a poner una pequeña guía con los pasos que he seguido.

Cabe mencionar que las instalaciones en ambos servidores deben ser idénticas, obviamente los ficheros de

configuración deben ser los mismos, pero de cara a la facilidad de gestión y compatibilidades recomiendo que

las instalaciones ya sean por repositorios o compilaciones sean las mismas (misma estructura de directorios,

version de los mysql, etc.)

Recuerdo que en mi caso fue una compilación y los directorios seguramente no coincidan con la versión

instalada por repositorios, en cualquier caso el nombramiento es el mismo y podéis buscarlas por la máquina

si no sabeis donde se encuentran.

Partimos de una instalación limpia, en la cual tendremos que configurar absolutamente todo.

Nuestros servidores serán db1 con IP 192.168.1.77 y db2 con IP 192.168.1.78

Editamos el fichero /etc/my.cnf

[client]

port            = 3306

socket          = /tmp/mysql.sock

default-character-set   = utf8

[mysqld]

port            = 3306

socket          = /tmp/mysql.sock

character_set_server    = utf8

datadir = /DATABASE/data

basedir = /opt/mysql

pid-file = /DATABASE/data/mmm1.pid

key_buffer_size = 8GB

max_allowed_packet = 16M

thread_stack = 256K

Page 2: Replicación Maestro

thread_cache_size = 400

max_connections = 1000

query_cache_limit = 1M

query_cache_size = 1GB

read_buffer_size = 2M

expire_logs_days = 4

max_binlog_size = 100M

character_set_server = utf8

connect_timeout = 120

tmpdir = /tmpfs

default-storage-engine = InnoDB

innodb

#

innodb_buffer_pool_size = 26G

innodb_fast_shutdown = 2

innodb_file_per_table

innodb_open_files = 2048

innodb_thread_concurrency = 17

innodb_additional_mem_pool_size=20M

innodb_log_buffer_size = 8M

sync_binlog = 1

innodb_flush_method = O_DSYNC

log-bin = mysql-binlog

wait_timeout = 120

Page 3: Replicación Maestro

binlog_format=mixed

!include /etc/mysql/serverid.cnf

replicate-same-server-id = 0

auto-increment-increment = 2

auto-increment-offset = 1

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

# Descomentar el área debajo si no estás familiarizado con SQL.

#safe-updates

[myisamchk]

key_buffer_size = 8GB

sort_buffer_size = 8GB

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

Editar el fichero /etc/mysql/serverid.cnf

[mysqld]

server-id = 1000

Page 4: Replicación Maestro

Con esto habremos terminado la configuración en ambos servidores MySQL. Ahora nos quedará hacer la

parte de la replicación entre cada servidor. Para eso entramos en el mysql de nuestro db1 (192.168.1.77) y

ponemos:

GRANT REPLICATION SLAVE ON *.* TO 'replication'@192.168.1.78 identified

by 'password';

FLUSH PRIVILEGES;

Con esto daremos privilegios a la maquina db2 con IP 192.168.1.78 para realizar la replicación bajo el usuario

replication con contraseña password. Ahora repetimos el mismo proceso en la maquina db2 (192.168.1.78)

GRANT REPLICATION SLAVE ON *.* TO 'replication'@192.168.1.77 identified

by 'password';

FLUSH PRIVILEGES;

Con esto daremos privilegios a la maquina db1 con IP 192.168.1.77 para realizar la replicación bajo el usuario

replication con contraseña password.

Ejecutamos en db1:

show master status;

El resultado devuelto tiene que ser algo así:

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 | 98 | | |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

Anotamos el nombre del fichero y la posición. Estos datos serán necesarios cuando configuremos el maestro

en db2 Ejecutamos el mismo comando sobre db2 para anotar los mismos datos cuando c8onfiguremos el

maestro en db1

Page 5: Replicación Maestro

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000005 | 102 | | |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

Ahora con los datos anotados de los pasos anteriores, procedemos a la configuracion de maestro en db1:

CHANGE MASTER TO master_host = '192.168.1.78', master_port=3306,

master_user='slave',master_password='password', master_log_file='mysql-

bin.000001', master_log_pos=98;

Ahora lanzamos el mismo comando (pero modificando los datos necesarios) para db2:

CHANGE MASTER TO master_host = '192.168.1.77', master_port=3306,

master_user='slave',master_password='password', master_log_file='mysql-

bin.000005', master_log_pos=102;

Una vez hecho esto ejecutamos el siguiente comando tanto en db1 como en db2:

START SLAVE;

Y con esto habremos terminado. Ahora nuestros servidores db1 y db2 de MySQL están configurados en

Maestro-Maestro

Page 6: Replicación Maestro

CONFIGURACION REPLICACION MAESTRO-MAESTRO.

Configuración MySQL para replicación master/master.

Replicación de 'exampledb'

Recomiendo establecer la sincronización ANTES de importar la base OpenCms. Puede crearse la

base de datos vacía a los efectos de comprobar.

Server1 server1.example.com / IP address 192.168.0.100 Server2 server2.example.com / IP address 192.168.0.101

Habilitamos los usuarios de replicación en ambos Mysql

SERVER1:

GRANT REPLICATION SLAVE ON *.* TO 'slave2_user'@'%' IDENTIFIED BY 'slave2_password';FLUSH PRIVILEGES;quit;

SERVER2:

GRANT REPLICATION SLAVE ON *.* TO 'slave1_user'@'%' IDENTIFIED BY 'slave1_password';FLUSH PRIVILEGES;quit;

Editamos los my.cnf de ambos servidores para contemplar la replicación MASTER / MASTER

(auto_increment_increment y auto_increment_offset)

auto_increment_increment controls the increment between successive AUTO_INCREMENT values. auto_increment_offset determines the starting point for AUTO_INCREMENT column values.

Page 7: Replicación Maestro

Asumimos N nodos MySQL (N=2 en este caso), entonces auto_increment_increment tiene el valor

N en todos los nodos, y cada uno debe tener un valor diferente para auto_increment_offset (1,

2, ..., N).

server1:

/etc/mysql/my.cnf

[...][mysqld]server-id = 1replicate-same-server-id = 0auto-increment-increment = 2auto-increment-offset = 1master-host = 192.168.0.101master-user = slave1_usermaster-password = slave1_passwordmaster-connect-retry = 60replicate-do-db = exampledblog-bin = /var/log/mysql/mysql-bin.logbinlog-do-db = exampledbrelay-log = /var/lib/mysql/slave-relay.logrelay-log-index = /var/lib/mysql/slave-relay-log.indexexpire_logs_days = 10max_binlog_size = 500M[...]

5. Restartear MySQL

server2:

/etc/mysql/my.cnf

[...]server-id = 2replicate-same-server-id = 0auto-increment-increment = 2auto-increment-offset = 2master-host = 192.168.0.100master-user = slave2_usermaster-password = slave2_passwordmaster-connect-retry = 60replicate-do-db = exampledblog-bin= /var/log/mysql/mysql-bin.logbinlog-do-db = exampledbrelay-log = /var/lib/mysql/slave-relay.log

Page 8: Replicación Maestro

relay-log-index = /var/lib/mysql/slave-relay-log.indexexpire_logs_days = 10max_binlog_size = 500M[...]

Restartear MySQL

NOTA: Si la base en el server1 tuviera datos, deberíamos bloquear la database y hacer un SQL

dump de exampledb e importando en server2 para que ambas bases contengan los mismos datos

(no olvidar desbloquear server1). A continuación un ejemplo.

server1:

USE exampledb; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000009 | 98 | exampledb | |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)

mysql>

No salir del MySQL en este caso, porque si nos vamos, remueve el lock de la base, abrir una

segunda consola para hacer el dump de server1

server1:

cd /tmp mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql scp

snapshot.sql [email protected]:/tmp

Después de copiar a server2, podemos cerrar esta consola, no la que contenía el status y lock de

la base

server1: Salir de MySQL UNLOCK TABLES; quit;

En server2 importamos la base de server1

server2:

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave cd /tmp mysql -u root -

pyourrootsqlpassword exampledb < snapshot.sql

Page 9: Replicación Maestro

Después veremos el master status de server,

server2:

USE exampledb; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000009 | 783 | exampledb | |+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql>

Desbloqueamos las tablas.

server2:

UNLOCK TABLES;

Ahora ejecutamos el comando sigueinte para convertir a server2 en slave de server1 (es

importante que reemplacemos los valores correctos obtenidos en nuestra sincronizacion obtenidos

de ejecutar en server1 SHOW MASTER STATUS; Lo habiamos echo en el paso anterior):

CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave2_user', MASTER_PASSWORD='slave2_password', MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=98;

Finalmente, arrancar el esclavo

server2:

START SLAVE;

Verificamos el estado

server2:

SHOW SLAVE STATUS;

Es importante que ambos valores, Slave_IO_Running and Slave_SQL_Running tengan el valor

"Yes" en la salida (sino, algo salio mal en los pasos anteriores):

mysql> SHOW SLAVE STATUS\G ...

Page 10: Replicación Maestro

Slave_IO_Running: YesSlave_SQL_Running: Yes

...

1 row in set (0.00 sec)

mysql>

Hasta acá, finalizamos con server2. De esta manera, replicamos server1 en server2, ahora

necesitamos replicar server2 a server1

Para hacer esto, paramos el slave en server1

server1:

STOP SLAVE;

Ahora usamos los resultados de SHOW MASTER STATUS; que corrimos previamente en server2:

server1:

CHANGE MASTER TO MASTER_HOST='192.168.0.101', MASTER_USER='slave1_user', MASTER_PASSWORD='slave1_password', MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=783;

Arrancamos el slave en server1:

server1:

START SLAVE;

Ahora verificamos el slave status:

server1:

SHOW SLAVE STATUS;

mysql> SHOW SLAVE STATUS; ...

Slave_IO_Running: YesSlave_SQL_Running: Yes

... 1 row in set (0.00 sec)

Si todo salió bien, ya tenemos master-master.

Page 11: Replicación Maestro

CONFIGURACION REPLICACION MAESTRO MAESTRO