Replicación Mysql

55
MySQL Replication Miguel Ángel Nieto <[email protected]> Irontec – Internet y Sistemas sobre GNU/Linux

description

MySQL replicación. Master/Master Master/Slave Circular MMM MySQL Proxy

Transcript of Replicación Mysql

Page 1: Replicación Mysql

MySQL Replication

Miguel Ángel Nieto <[email protected]>Irontec – Internet y Sistemas sobre GNU/Linux

Page 2: Replicación Mysql

Irontec – MySQL Replication

2

Introducción

● Un solo servidor de MySQL se convierte en el SPOF de nuestra infraestructura.

● Si no hay datos, no hay servicio.● apt­get install mysql es solo el primer paso, luego

queda mucho por hacer.● En la era 2.0 todo está en bases de datos, su

optimización es imprescindible.● MySQL nos ofrece muchas posibilidades.

Page 3: Replicación Mysql

Irontec – MySQL Replication

3

Introducción

● ¿Cómo evitamos un SPOF? Añadiendo más máquinas.● Pero las máquinas deben ser iguales en cuanto a la

parte lógica, los datos deben estar replicados y mantenerse sincronizados.

● La replicación nos ayuda a solventar en parte este problema.

Page 4: Replicación Mysql

Irontec – MySQL Replication

4

Introducción

● ¿Que nos ofrece la replicación?

– Seguridad. Los datos están replicados en distintas máquinas físicas, por lo que tenemos un live backup.

– Balanceo de carga. Podemos distribuir la carga entre distintas máquinas.

– Alta disponibil idad. Al tener datos en varias máquinas, si una se cae otra puede tomar el control.

– Quebraderos de cabeza. La informática es la ciencia menos exacta que existe.

Page 5: Replicación Mysql

Irontec – MySQL Replication

5

Seguridad

● Una copia de la base de datos se puede hacer de varias formas:

– Mysqldump– Copiando las tablas del disco en caliente (parando antes la

BBDD).– Replicación– etc...

● La principal diferencia es que la replicación nos ofrece un backup siempre actualizado. Las demás será de la fecha de su programación.

● Utilizad siempre dos métodos como mínimo. Nunca se debe dejar la replicación como único sistema de backup.

Page 6: Replicación Mysql

Irontec – MySQL Replication

6

Arquitecturas de replicación

● Tenemos varias formas de montar una arquitectura de replicación.

– Maestro-Maestro– Maestro-Esclavo– Circular

● Según lo que se necesite, se monta una u otra.

Page 7: Replicación Mysql

Irontec – MySQL Replication

7

Limitaciones

● Un esclavo solo puede tener un maestro. Por el contrario, un maestro múltiples esclavos.

● No es recomendable montar una replicación por WAN. La replicación es asíncrona y sensible a latencias.

● En un servidor esclavo esta prohibido escribir datos, solo se usarán selects.

Page 8: Replicación Mysql

Irontec – MySQL Replication

8

Maestro-Esclavo

● Un maestro, múltiples esclavos.● En el maestro se escribe, en el esclavo se lee.

Page 9: Replicación Mysql

Irontec – MySQL Replication

9

Maestro-Esclavo

● Primero debemos configurar el maestro. Imprescindible:

– Habilitar los logs binarios.– Crear un usuario que permita conectarse a los esclavos.– Habilitar sync_binlog.– Elegir un server-id.

log­bin=mysql­binserver­id=1sync_binlog=1

Page 10: Replicación Mysql

Irontec – MySQL Replication

10

Maestro-Esclavo

● Dar permisos de conexión a los eslavos y dumpeamos la BD:

mysqldump BD ­­master­data=2 > dump_file;

mysql> grant replication slave on *.* to 'replication'@10.10.10.1 identified by 'slave';

mysql> grant replication slave on *.* to 'replication'@10.10.10.2 identified by 'slave';

Page 11: Replicación Mysql

Irontec – MySQL Replication

11

Maestro-Esclavo

● Configuramos el eslavo:– Seleccionamos un ID diferente para cada uno.– Importamos la BD.– Nos configuramos como esclavo de un maestro.

$mysql ­u root ­p < dump

server­id=101

mysql> CHANGE MASTER TO MASTER_HOST = ‘10.10.10.100’, MASTER_USER = ‘replication’, MASTER_PASSWORD = ‘slave’, MASTER_LOG_FILE = ‘master_log_file’, MASTER_LOG_POS = master_log_pos;

Page 12: Replicación Mysql

Irontec – MySQL Replication

12

Maestro-Esclavo

● Master_log_pos y Master_log_file indican al esclavo desde que posición del log binario deben leer, de forma que no se repliquen datos que ya tenemos.

● Podemos sacarlo con un dump como ya hemos visto o con el comando show master status;

● El log binario debe estár habilitado :)

Page 13: Replicación Mysql

Irontec – MySQL Replication

13

Maestro-Esclavo

● No se debe dejar al servidor la elección de cuando escribir los datos al disco duro.

● Si el servidor se cae sin que algunos datos se escriban en el log, es posible que estos se pierdan (dependerá del sistema de ficheros).

● sync_binlog por defecto es 0, que deja que el servidor decida cuando realizar la escritura al disco.

● Se recomienda un valor de 1, para que se fuerce la escritura.

● Esto también es lento, dependerá de los discos duros instalados.

● Si el servidor se cae, como mucho perderemos una transacción.

Page 14: Replicación Mysql

Irontec – MySQL Replication

14

Maestro-Esclavo

● Para comprobar si la replicación es correcta tenemos el comando show slave status.

● Este nos tiene que mostrar lo siguiente:

Slave_IO_Running: Se encarga de conectarse al maestro para comprobar cambiosSlave_SQL_Running: Se encarga de escribir las sentencias SQL.Seconds_Behind_Master: El lag en segundos entre el maestro y el esclavo.

[...]Slave_IO_Running: YesSlave_SQL_Running: Yes[...]Seconds_Behind_Master: 0

Page 15: Replicación Mysql

Irontec – MySQL Replication

15

Maestro-Esclavo

● Otras opciones:– replicate-do-db– Replicate-ignore-db– binlog-do-db– binlog-ignore-db– replicate-do-table– replicate-wild-do-table– replicate-ignore-table– replicate-wild-ignore-table

Page 16: Replicación Mysql

Irontec – MySQL Replication

16

Maestro-Esclavo

Page 17: Replicación Mysql

Irontec – MySQL Replication

17

Maestro-Esclavo

● El diagrama de las tablas es demasiado grande y no entra ;)http://dev.mysql.com/doc/refman/5.0/en/replication-rules-table-options.html

● Para rellenar la diapositiva pondré un dibujo:

No se quien es el autor :(

Page 18: Replicación Mysql

Irontec – MySQL Replication

18

Maestro-Maestro

● Lo que se escribe en uno se replica en el otro.● Se puede escribir en los dos.

Page 19: Replicación Mysql

Irontec – MySQL Replication

19

Maestro-Maestro

● La arquitectura maestro-maestro es igual a la maestro esclavo.

● Aquí los hosts realizan las dos tareas, maestro y esclavo al mismo tiempo.

● Esta arquitectura soporta como máximo dos hosts, ya que un esclavo solo puede tener como máximo un maestro.

A es maestro de B. B es maestro de A.A es esclavo de B. B es esclavo de A.

Page 20: Replicación Mysql

Irontec – MySQL Replication

20

Maestro-Maestro

● Se debe tener en cuenta, al igual que antes, lo siguiente:

– Habilitar el log binario.– Seleccionar un server-id.– Establecer el valor de sync_binlog.– Crear los usuarios para la replicación.

● El funcionamiento, opciones, monitorización, etc. es todo igual.

Page 21: Replicación Mysql

Irontec – MySQL Replication

21

Maestro-Maestro

● Los auto-incrementales son el gran problema de este tipo de arquitectura. Si se realizan dos insert al mismo tiempo que incluya un campo autoincremental, podemos tener un problema de ID duplicado.

● A envía a B un artículo cuyo ID autoincremental es 3000, B envía un artículo diferente a A cuyo autoincremental es 3000 también. La replicación se rompe.

– auto_increment_increment = 2– auto_increment_offset = 1

● ¿Cómo sería para el server B?

Page 22: Replicación Mysql

Irontec – MySQL Replication

22

Circular

● Lo que se escribe en uno se replica en el siguiente, este en el siguiente, este en... A B C D A→ → → →

● Es la menos recomendable. En realidad está casi prohibida también ;)

Page 23: Replicación Mysql

Irontec – MySQL Replication

23

Circular

● Es una forma de disponer de más de dos servidores en arquitectura maestro-maestro.

● Contra más sean los hosts implicados, mayor el caos de su administración.

A B C D E A→ → → → →● Si el host C se cae (por ejemplo) la replicación se

rompe. Lo escrito en B no se replica, lo escrito en D se replica en todos menos en C, etc.

● Si se cae por ejemplo B y D, el caos es infinito. La solución es salir corriendo.

● A no ser que no exista otra solución, no se recomienda.

Page 24: Replicación Mysql

Irontec – MySQL Replication

24

Circular

● Los logs que reciben los esclavos, deben logearlos en el log binario para enviarselo al siguiente en la cadena. Esto no es el funcionamiento por defecto, los que se recibe como esclavo no se logea. Para cambiarlo:

– log­slave­updates

● En algún momento de la cadena nos llegarán nuestros propios logs. Para evitar formar un bucle:

– Replicate­same­server­id=0

● También habrá que tener cuidado con los auto-incrementales:

– auto_increment_increment=4– auto_increment_offset=1

Page 25: Replicación Mysql

Irontec – MySQL Replication

25

Replicación rota

Page 26: Replicación Mysql

Irontec – MySQL Replication

26

Replicación rota

● Es recomendable tener el error-log habilitado, ahí se guardará, entre otras cosas, cualquier error relacionado con la replicación.

● ¡EJEMPLO!

Sep 11 11:13:16 test2 mysqld[6776]: 090911 11:13:16 [ERROR] Slave: Error 'Table 't' already exists' on query. Default database: 'mysql'. Query: 'CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin)', Error_code: 1050

Sep 11 11:13:16 test2 mysqld[6776]: 090911 11:13:16 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql­bin.000003' position 421

Page 27: Replicación Mysql

Irontec – MySQL Replication

27

Replicación rota

● Forma rápida y no tan buena de solucionarlo:● Decirle al esclavo que ignore esa querie y continue con

la replicación:

mysql> stop slave; Query OK, 0 rows affected (0.00 sec) 

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; Query OK, 0 rows affected (0.00 sec) 

mysql> start slave;

Page 28: Replicación Mysql

Irontec – MySQL Replication

28

Replicación rota

● Forma buena (y algo lenta) de solucionarlo:http://www.maatkit.org/

● Maatkit makes MySQL easier to manage.● Lo de “easier” ponedlo entre muchas comillas.● Son una colección de herramientas que nos puede

ayudar en la administración de nuestro servidores, y en este caso en particular, en rescatar una replicación.

● Todas las utilidades:http://www.maatkit.org/doc/

Page 29: Replicación Mysql

Irontec – MySQL Replication

29

Replicación rota

● Para saber si dos tables están sincronizadas, podemos sacar un checksum de estas y comparar:

– mk­table­checksum

● Para sincronizar los datos de dos tablas:– mk­table­sync

$ mk­table­checksum h=host1,u=user,p=password h=host2

$ mk­table­sync –execute u=user,p=pass,h=host1,D=db,t=tbl host2

Page 30: Replicación Mysql

Irontec – MySQL Replication

30

SandBox

● Para crear una laboratorio de pruebas podemos:– Montar equipos físicos e instalarlos (de locos).– Montar máquinas virtuales.– Usar ¡sandbox!

Page 31: Replicación Mysql

Irontec – MySQL Replication

31

SandBox

● SandBox nos permite:– Montar sistemas de replicación– Probar versiones nuevas de MySQL facilmente– Manejar múltiples instancias de MySQL desde un único

punto.– Te olvidas de rmps, sources, debs... ¡tar.gz binario!– Testear– Testear– Testear...

Page 32: Replicación Mysql

Irontec – MySQL Replication

32

SandBox

● No es un producto oficial de MySQL.● Está escrito el perl (puag!) y aún así funciona bien.

http://mysqlsandbox.net/● Tendremos que descargar un paquete tar.gz de MySQL

y Sandbox.

Page 33: Replicación Mysql

Irontec – MySQL Replication

33

Instalación

● ¡Como root!

root@shyris:~# tar ­xzf MySQL­Sandbox­3.0.05.tar.gz

root@shyris:~# cd MySQL­Sandbox­3.0.05/

root@shyris:~/MySQL­Sandbox­3.0.05# perl Makefile.PL

root@shyris:~/MySQL­Sandbox­3.0.05# make

root@shyris:~/MySQL­Sandbox­3.0.05# make test

root@shyris:~/MySQL­Sandbox­3.0.05# make install

root@shyris:/usr/local/bin# lslow_level_make_sandbox        make_multiple_sandbox     make_sandbox                 make_sandbox_from_source  sb      test_sandboxmake_multiple_custom_sandbox  make_replication_sandbox  make_sandbox_from_installed  msandbox                  sbtool 

Page 34: Replicación Mysql

Irontec – MySQL Replication

34

Uso de SandBox

● Crear un sandbox con una única instancia de MySQL

punisher@shyris:~$ make_sandbox /home/punisher/MySQL/mysql­5.0.86­percona­highperf­b19.tar.gz unpacking /home/punisher/MySQL/mysql­5.0.86­percona­highperf­b19.tar.gzExecuting low_level_make_sandbox ­­basedir=/home/punisher/MySQL/5.0.86 \

­­sandbox_directory=msb_5_0_86 \­­install_version=5.0 \­­sandbox_port=5086 \­­no_ver_after_name \­­my_clause=log­error=msandbox.err

Page 35: Replicación Mysql

Irontec – MySQL Replication

35

Uso de SandBox

● Parar sandbox:– stop

● Arrancar sandbox:– start

● Utilizar sandbox:– use

● Reiniciar sandbox:– restart

● Limpiar el sandbox:– clean

Page 36: Replicación Mysql

Irontec – MySQL Replication

36

Crear entorno maestro-esclavo

● Facil, sencillo y para toda la familia:

punisher@shyris:~$ make_replication_sandbox ­­how_many_slaves=2 /home/punisher/MySQL/mysql­5.0.86­percona­highperf­b19.tar.gz installing and starting masterinstalling slave 1installing slave 2starting slave 1. sandbox server startedstarting slave 2. sandbox server startedinitializing slave 1initializing slave 2replication directory installed in $HOME/sandboxes/rsandbox_5_0_86

Page 37: Replicación Mysql

Irontec – MySQL Replication

37

Crear entorno maestro-esclavo

● Acceder al maestro– m1

● Acceder al esclavo 1– s1

● Acceder al esclavo 2– s2

● Chequear esclavos– check_slaves

Page 38: Replicación Mysql

Irontec – MySQL Replication

38

Crear entorno maestro-maestro

● Es muy dificil, ¡atentos!

punisher@shyris:~$ make_replication_sandbox ­­master_master /home/punisher/MySQL/mysql­5.0.86­percona­highperf­b19.tar.gz installing node 1installing node 2# server: 1: # server: 2: # server: 1: # server: 2: Circular replication activatedgroup directory installed in $HOME/sandboxes/rcsandbox_5_0_86

Page 39: Replicación Mysql

Irontec – MySQL Replication

39

Crear replicación circularpunisher@shyris:~$ make_replication_sandbox ­­circular=4 /home/punisher/MySQL/mysql­5.0.86­percona­highperf­b19.tar.gz # server: 1: # server: 2: executing "clear" on node 1executing "clear" on node 2installing node 1installing node 2installing node 3installing node 4# server: 1: # server: 2: # server: 3: # server: 4: # server: 1: # server: 2: # server: 3: # server: 4: Circular replication activatedgroup directory installed in $HOME/sandboxes/rcsandbox_5_0_86

Page 40: Replicación Mysql

Irontec – MySQL Replication

40

MMM

● Cuando ya sabemos que queremos y lo montamos, llega el mantenimiento.

● Si tenemos un cluster de, por ejemplo, 2 maestros y 50 esclavos, comprobar el correcto funcionamiento es complicado.

● ¿Y si deseamos parar algún esclavo?● ¿Y si deseamos parar algún maestro?● Es necesario reducir el tiempo de parada de

servicio al mínimo.

Page 41: Replicación Mysql

Irontec – MySQL Replication

41

MMM

Page 42: Replicación Mysql

Irontec – MySQL Replication

42

MMM

● También el Perl. El mundo se ha vuelto loco...● Características:

– Monitorización de la replicación– Monitorización de los hosts– Gestión del failover– Balanceo de IPs entre nodos– Gestión de grupos de escritura/lectura

Page 43: Replicación Mysql

Irontec – MySQL Replication

43

MMM

● La alta disponibilidad se hace mediante el balanceo de Ips virtuales que saltarán de un servidor a otro en caso de ser necesario.

– Exclusivo: Una única IP para muchos hosts. Si el host que la tiene se cae se balancea a otro. Generalmente se usa en los nodos de escritura.

– Balanceado: Una IP por cada host. Si uno de los hosts se cae la IP se balancea a cualquier otro, pasando a tener dos IPs virtuales. Se usa para nodos en lectura.

Page 44: Replicación Mysql

Irontec – MySQL Replication

44

MMM

● Se pueden meter los servidores dentro de dos roles, escritura y lectura. Escritura es obligatorio, mientras que el de lectura no tiene porque definirse.

● La diferencia es lógica:– Nodos de escritura son aquellos en los que los datos se

escribirán.– Nodos de lectura son aquellos de los cuales se leerán

datos.● Escritura (maestro) – Lectura (esclavo)

Page 45: Replicación Mysql

Irontec – MySQL Replication

45

MMM

http://mysql-mmm.org/● En el sistema de control se instalará:

– mysql-mmm-common_2.0.10-1_all.deb– mysql-mmm-monitor_2.0.10-1_all.deb

● En los nodos:– mysql-mmm-common_2.0.10-1_all.deb– mysql-mmm-agent_2.0.10-1_all.deb

● ¡Junto con todas las dependencias!

Page 46: Replicación Mysql

Irontec – MySQL Replication

46

MMM

● Los ficheros de configuración se guardan en /etc/mysql-mmm

● Todos tendrán un fichero llamado mmm_common.conf que será exactamente igual.

● El nodo de control mmm_mon.conf● Los servidores de MySQL mmm_agent.conf

Page 47: Replicación Mysql

Irontec – MySQL Replication

47

MMM

● mmm_common.conf● Incluye la configuración de:

– Los Hosts– Sus Ips– Los roles– Usuario/Contraseña del agente– Usuario/Contraseña para la replicación– La interfaz de red en la que se trabaja

Page 48: Replicación Mysql

Irontec – MySQL Replication

48

MMM

● mmm_mon.conf● Incluye la configuración de:

– Usuario/Contraseña para la monitorización– Ips a las que pingar– Ruta de los binarios– Ruta del PID– Nidel de debug

Page 49: Replicación Mysql

Irontec – MySQL Replication

49

MMM

● mmm_agent● Incluye la configuración de:

– El nombre de este servidor– Todo el mmm_common.conf– Y nada más :P

Page 50: Replicación Mysql

Irontec – MySQL Replication

50

MMM

● Como hemos visto, hay varios usuarios y contraseñas definidos. Hay que crerlos en MySQL.

– El usuario monitor se usa para comprobar el estado de los servidores Mysql.

– El usuario agent se usa para cambiar el read only mode, poner offline un equipo, ejecutar un change_master, etc.

– El usuario replication slave... para replicación ;)

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'10.100.1.%' IDENTIFIED BY 'RepMonitor';

GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.100.1.%' IDENTIFIED BY 'RepAgent';

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.100.1.%' IDENTIFIED BY 'slave';

Page 51: Replicación Mysql

Irontec – MySQL Replication

51

MMM

● Una vez puesto en marcha los servicios, se deben poner online los servidores desde el comando de control.MMM:~# mmm_control show  db1(10.100.1.1) master/AWAITING_RECOVERY. Roles:   db2(10.100.1.2) master/AWAITING_RECOVERY. Roles:   db3(10.100.1.3) slave/AWAITING_RECOVERY. Roles:   db4(10.100.1.4) slave/AWAITING_RECOVERY. Roles:

MMM:~# mmm_control set_online db1OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!MMM:~# mmm_control set_online db2OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!MMM:~# mmm_control set_online db3OK: State of 'db3' changed to ONLINE. Now you can wait some time and check its new roles!MMM:~# mmm_control set_online db4OK: State of 'db4' changed to ONLINE. Now you can wait some time and check its new roles!

Page 52: Replicación Mysql

Irontec – MySQL Replication

52

MMM

● ¡Ejemplo! Parando un servidor en producción:

MMM:~# mmm_control set_offline db1OK: State of 'db1' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!

MMM:~# mmm_control show  db1(10.100.1.1) master/ADMIN_OFFLINE. Roles:   db2(10.100.1.2) master/ONLINE. Roles: writer(10.100.1.10)  db3(10.100.1.3) slave/ONLINE. Roles: reader(10.100.1.12)  db4(10.100.1.4) slave/ONLINE. Roles: reader(10.100.1.11)

Page 53: Replicación Mysql

Irontec – MySQL Replication

53

MySQL Proxy

● El balanceo de carga se puede hacer bien por hardware como por software.

● Existe un software creado para MySQL que nos puede “ayudar”.

● Para que te ayude debes saber LUA.http://forge.mysql.com/wiki/MySQL_Proxy

● Es un proxy que se pone entre el cliente y los servidores de MySQL.

Page 54: Replicación Mysql

Irontec – MySQL Replication

54

MySQL Proxy

● Trae scripts de ejemplo, que entre otras cosas te permite:

– Reescribir queries.– Balanceo de carga.– Loggeo avanzado.– Failover.– Análisis de queries.

Page 55: Replicación Mysql

Irontec – MySQL Replication

55

Se acabó

[email protected]

miguel2angel

http://miguelangelnieto.net