Anda di halaman 1dari 11

Replicacin Maestro-Maestro en MySQL

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

[client] port socket = 3306 = /tmp/mysql.sock = utf8

default-character-set [mysqld] port socket = 3306

= /tmp/mysql.sock = utf8

character_set_server 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 ests 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 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:

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 replicacin bajo el usuario replication con contrasea 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 replicacin bajo el usuario replication con contrasea 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 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

+------------------+----------+--------------+------------------+ | 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='mysqlbin.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='mysqlbin.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 estn configurados en Maestro-Maestro

CONFIGURACION REPLICACION MAESTRO-MAESTRO.


Configuracin MySQL para replicacin master/master. Replicacin de 'exampledb'
Recomiendo establecer la sincronizacin ANTES de importar la base OpenCms. Puede crearse la base de datos vaca 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 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

expire_logs_days max_binlog_size [...]

= 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 ...

Slave_IO_Running: Yes Slave_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: Yes Slave_SQL_Running: Yes

... 1 row in set (0.00 sec) Si todo sali bien, ya tenemos master-master.

CONFIGURACION REPLICACION MAESTRO MAESTRO

Anda mungkin juga menyukai