Esta tarde me vi en la necesidad de realizar otra configuracin de maestro-maestro entre dos servidores de MySQL y por fin me decido a poner una pequea gua con los pasos que he seguido. Cabe mencionar que las instalaciones en ambos servidores deben ser idnticas, obviamente los ficheros de configuracin deben ser los mismos, pero de cara a la facilidad de gestin 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 compilacin y los directorios seguramente no coincidan con la versin instalada por repositorios, en cualquier caso el nombramiento es el mismo y podis buscarlas por la mquina si no sabeis donde se encuentran. Partimos de una instalacin limpia, en la cual tendremos que configurar absolutamente todo. Nuestros servidores sern db1 con IP 192.168.1.77 y db2 con IP 192.168.1.78 Editamos el fichero /etc/my.cnf
= /tmp/mysql.sock = utf8
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 ests familiarizado con SQL. #safe-updates [myisamchk] key_buffer_size = 8GB sort_buffer_size = 8GB read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
Con esto habremos terminado la configuracin en ambos servidores MySQL. Ahora nos quedar hacer la parte de la replicacin entre cada servidor. Para eso entramos en el mysql de nuestro db1 (192.168.1.77) y ponemos:
Con esto daremos privilegios a la maquina db2 con IP 192.168.1.78 para realizar la replicacin bajo el usuario replication con contrasea password. Ahora repetimos el mismo proceso en la maquina db2 (192.168.1.78)
Con esto daremos privilegios a la maquina db1 con IP 192.168.1.77 para realizar la replicacin bajo el usuario replication con contrasea password. Ejecutamos en db1:
+------------------+----------+--------------+------------------+ | mysql-bin.000001 | 98 | | |
Anotamos el nombre del fichero y la posicin. Estos datos sern necesarios cuando configuremos el maestro en db2 Ejecutamos el mismo comando sobre db2 para anotar los mismos datos cuando c8onfiguremos el maestro en db1
Ahora con los datos anotados de los pasos anteriores, procedemos a la configuracion de maestro en db1:
Ahora lanzamos el mismo comando (pero modificando los datos necesarios) para db2:
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 estn configurados en Maestro-Maestro
Habilitamos los usuarios de replicacin 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 replicacin 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 = 1 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 1 master-host = 192.168.0.101 master-user = slave1_user master-password = slave1_password master-connect-retry = 60 replicate-do-db = exampledb log-bin = /var/log/mysql/mysql-bin.log binlog-do-db = exampledb relay-log = /var/lib/mysql/slave-relay.log relay-log-index = /var/lib/mysql/slave-relay-log.index expire_logs_days = 10 max_binlog_size = 500M [...]
5. Restartear MySQL server2: /etc/mysql/my.cnf [...] server-id = 2 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 2 master-host = 192.168.0.100 master-user = slave2_user master-password = slave2_password master-connect-retry = 60 replicate-do-db = exampledb log-bin= /var/log/mysql/mysql-bin.log binlog-do-db = exampledb relay-log = /var/lib/mysql/slave-relay.log relay-log-index = /var/lib/mysql/slave-relay-log.index
= 10 = 500M
Restartear MySQL NOTA: Si la base en el server1 tuviera datos, deberamos 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 continuacin 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 root@192.168.0.101:/tmp Despus de copiar a server2, podemos cerrar esta consola, no la que contena 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 Despus 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 ...
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: Yes Slave_SQL_Running: Yes
... 1 row in set (0.00 sec) Si todo sali bien, ya tenemos master-master.