Replicación Maestro
-
Upload
erick-david -
Category
Documents
-
view
116 -
download
2
Transcript of 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
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
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
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
+------------------+----------+--------------+------------------+
| 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
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.
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
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
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 ...
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.
CONFIGURACION REPLICACION MAESTRO MAESTRO