You are on page 1of 55

MySQL Replication

Miguel ngel Nieto <miguelangel@irontec.com> Irontec Internet y Sistemas sobre GNU/Linux

Irontec MySQL Replication

Introduccin

Un solo servidor de MySQL se convierte en el SPOF de nuestra infraestructura. Si no hay datos, no hay servicio. aptgetinstallmysql es solo el primer paso, luego queda mucho por hacer. En la era 2.0 todo est en bases de datos, su optimizacin es imprescindible. MySQL nos ofrece muchas posibilidades.

Irontec MySQL Replication

Introduccin

Cmo evitamos un SPOF? Aadiendo ms mquinas. Pero las mquinas deben ser iguales en cuanto a la parte lgica, los datos deben estar replicados y mantenerse sincronizados. La replicacin nos ayuda a solventar en parte este problema.

Irontec MySQL Replication

Introduccin

Que nos ofrece la replicacin?

Seguridad. Los datos estn replicados en distintas mquinas fsicas, por lo que tenemos un live backup. Balanceo de carga. Podemos distribuir la carga entre distintas mquinas. Alta disponibilidad. Al tener datos en varias mquinas, si una se cae otra puede tomar el control. Quebraderos de cabeza. La informtica es la ciencia menos exacta que existe.

Irontec MySQL Replication

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). Replicacin etc...

La principal diferencia es que la replicacin nos ofrece un backup siempre actualizado. Las dems ser de la fecha de su programacin. Utilizad siempre dos mtodos como mnimo. Nunca se debe dejar la replicacin como nico sistema de backup.
5

Irontec MySQL Replication

Arquitecturas de replicacin

Tenemos varias formas de montar una arquitectura de replicacin.


Maestro-Maestro Maestro-Esclavo Circular

Segn lo que se necesite, se monta una u otra.

Irontec MySQL Replication

Limitaciones

Un esclavo solo puede tener un maestro. Por el contrario, un maestro mltiples esclavos. No es recomendable montar una replicacin por WAN. La replicacin es asncrona y sensible a latencias. En un servidor esclavo esta prohibido escribir datos, solo se usarn selects.
7

Irontec MySQL Replication

Maestro-Esclavo

Un maestro, mltiples esclavos. En el maestro se escribe, en el esclavo se lee.

Irontec MySQL Replication

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.

logbin=mysqlbin serverid=1 sync_binlog=1

Irontec MySQL Replication

Maestro-Esclavo

Dar permisos de conexin a los eslavos y dumpeamos la BD:


mysqldumpBDmasterdata=2>dump_file;

mysql>grantreplicationslaveon*.*to 'replication'@10.10.10.1identifiedby'slave'; mysql>grantreplicationslaveon*.*to 'replication'@10.10.10.2identifiedby'slave';

10

Irontec MySQL Replication

Maestro-Esclavo

Configuramos el eslavo:

Seleccionamos un ID diferente para cada uno. Importamos la BD. Nos configuramos como esclavo de un maestro.

$mysqlurootp<dump serverid=101 mysql>CHANGEMASTERTOMASTER_HOST=10.10.10.100, MASTER_USER=replication,MASTER_PASSWORD=slave, MASTER_LOG_FILE=master_log_file,MASTER_LOG_POS= master_log_pos;

11

Irontec MySQL Replication

Maestro-Esclavo

Master_log_pos y Master_log_file indican al esclavo desde que posicin 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 showmasterstatus; El log binario debe estr habilitado :)

12

Irontec MySQL Replication

Maestro-Esclavo

No se debe dejar al servidor la eleccin 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 tambin es lento, depender de los discos duros instalados. Si el servidor se cae, como mucho perderemos una transaccin. 13

Irontec MySQL Replication

Maestro-Esclavo

Para comprobar si la replicacin es correcta tenemos el comando showslavestatus. Este nos tiene que mostrar lo siguiente:

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

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

Irontec MySQL Replication

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

15

Irontec MySQL Replication

Maestro-Esclavo

16

Irontec MySQL Replication

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 :(
17

Irontec MySQL Replication

Maestro-Maestro

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

18

Irontec MySQL Replication

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 mximo dos hosts, ya que un esclavo solo puede tener como mximo un maestro. A es maestro de B. B es maestro de A. A es esclavo de B. B es esclavo de A.

19

Irontec MySQL Replication

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

El funcionamiento, opciones, monitorizacin, etc. es todo igual.

20

Irontec MySQL Replication

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 enva a B un artculo cuyo ID autoincremental es 3000, B enva un artculo diferente a A cuyo autoincremental es 3000 tambin. La replicacin se rompe.

auto_increment_increment=2 auto_increment_offset=1

Cmo sera para el server B?

21

Irontec MySQL Replication

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 tambin ;)

22

Irontec MySQL Replication

Circular

Es una forma de disponer de ms de dos servidores en arquitectura maestro-maestro. Contra ms sean los hosts implicados, mayor el caos de su administracin. ABCDEA Si el host C se cae (por ejemplo) la replicacin 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 solucin es salir corriendo. A no ser que no exista otra solucin, no se recomienda.
23

Irontec MySQL Replication

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:

logslaveupdates

En algn momento de la cadena nos llegarn nuestros propios logs. Para evitar formar un bucle:

Replicatesameserverid=0

Tambin habr que tener cuidado con los autoincrementales:


auto_increment_increment=4 auto_increment_offset=1

24

Irontec MySQL Replication

Replicacin rota

25

Irontec MySQL Replication

Replicacin rota

Es recomendable tener el error-log habilitado, ah se guardar, entre otras cosas, cualquier error relacionado con la replicacin. EJEMPLO!

Sep1111:13:16test2mysqld[6776]:09091111:13:16 [ERROR]Slave:Error'Table't'alreadyexists'on query.Defaultdatabase:'mysql'.Query:'CREATE TABLEt(cCHAR(20)CHARACTERSETutf8COLLATE utf8_bin)',Error_code:1050 Sep1111:13:16test2mysqld[6776]:09091111:13:16 [ERROR]Errorrunningquery,slaveSQLthread aborted.Fixtheproblem,andrestarttheslaveSQL threadwith"SLAVESTART".Westoppedatlog'mysql bin.000003'position421
26

Irontec MySQL Replication

Replicacin rota

Forma rpida y no tan buena de solucionarlo: Decirle al esclavo que ignore esa querie y continue con la replicacin:
mysql>stopslave;QueryOK,0rowsaffected(0.00 sec) mysql>SETGLOBALSQL_SLAVE_SKIP_COUNTER=1;Query OK,0rowsaffected(0.00sec) mysql>startslave;

27

Irontec MySQL Replication

Replicacin 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 coleccin de herramientas que nos puede ayudar en la administracin de nuestro servidores, y en este caso en particular, en rescatar una replicacin. Todas las utilidades: http://www.maatkit.org/doc/

28

Irontec MySQL Replication

Replicacin rota

Para saber si dos tables estn sincronizadas, podemos sacar un checksum de estas y comparar:

mktablechecksum mktablesync

Para sincronizar los datos de dos tablas:

$mktablechecksumh=host1,u=user,p=passwordh=host2 $mktablesyncexecute u=user,p=pass,h=host1,D=db,t=tblhost2

29

Irontec MySQL Replication

SandBox

Para crear una laboratorio de pruebas podemos:


Montar equipos fsicos e instalarlos (de locos). Montar mquinas virtuales. Usar sandbox!

30

Irontec MySQL Replication

SandBox

SandBox nos permite:


Montar sistemas de replicacin Probar versiones nuevas de MySQL facilmente Manejar mltiples instancias de MySQL desde un nico punto. Te olvidas de rmps, sources, debs... tar.gz binario! Testear Testear Testear...

31

Irontec MySQL Replication

SandBox

No es un producto oficial de MySQL. Est escrito el perl (puag!) y an as funciona bien. http://mysqlsandbox.net/ Tendremos que descargar un paquete tar.gz de MySQL y Sandbox.

32

Irontec MySQL Replication

Instalacin

Como root!

root@shyris:~#tarxzfMySQLSandbox3.0.05.tar.gz root@shyris:~#cdMySQLSandbox3.0.05/ root@shyris:~/MySQLSandbox3.0.05#perlMakefile.PL root@shyris:~/MySQLSandbox3.0.05#make root@shyris:~/MySQLSandbox3.0.05#maketest root@shyris:~/MySQLSandbox3.0.05#makeinstall root@shyris:/usr/local/bin#ls low_level_make_sandboxmake_multiple_sandboxmake_sandbox make_sandbox_from_sourcesbtest_sandbox make_multiple_custom_sandboxmake_replication_sandbox make_sandbox_from_installedmsandboxsbtool

33

Irontec MySQL Replication

Uso de SandBox

Crear un sandbox con una nica instancia de MySQL

punisher@shyris:~$make_sandbox/home/punisher/MySQL/mysql 5.0.86perconahighperfb19.tar.gz unpacking/home/punisher/MySQL/mysql5.0.86percona highperfb19.tar.gz Executinglow_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=logerror=msandbox.err

34

Irontec MySQL Replication

Uso de SandBox

Parar sandbox:

stop start use restart clean

Arrancar sandbox:

Utilizar sandbox:

Reiniciar sandbox:

Limpiar el sandbox:

35

Irontec MySQL Replication

Crear entorno maestro-esclavo

Facil, sencillo y para toda la familia:

punisher@shyris:~$make_replication_sandbox how_many_slaves=2/home/punisher/MySQL/mysql5.0.86 perconahighperfb19.tar.gz installingandstartingmaster installingslave1 installingslave2 startingslave1 .sandboxserverstarted startingslave2 .sandboxserverstarted initializingslave1 initializingslave2 replicationdirectoryinstalledin $HOME/sandboxes/rsandbox_5_0_86

36

Irontec MySQL Replication

Crear entorno maestro-esclavo

Acceder al maestro

m1 s1 s2 check_slaves

Acceder al esclavo 1

Acceder al esclavo 2

Chequear esclavos

37

Irontec MySQL Replication

Crear entorno maestro-maestro

Es muy dificil, atentos!

punisher@shyris:~$make_replication_sandbox master_master/home/punisher/MySQL/mysql5.0.86percona highperfb19.tar.gz installingnode1 installingnode2 #server:1: #server:2: #server:1: #server:2: Circularreplicationactivated groupdirectoryinstalledin $HOME/sandboxes/rcsandbox_5_0_86

38

Irontec MySQL Replication

Crear replicacin circular


punisher@shyris:~$make_replication_sandboxcircular=4 /home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gz #server:1: #server:2: executing"clear"onnode1 executing"clear"onnode2 installingnode1 installingnode2 installingnode3 installingnode4 #server:1: #server:2: #server:3: #server:4: #server:1: #server:2: #server:3: #server:4: Circularreplicationactivated groupdirectoryinstalledin$HOME/sandboxes/rcsandbox_5_0_86

39

Irontec MySQL Replication

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 algn esclavo? Y si deseamos parar algn maestro? Es necesario reducir el tiempo de parada de servicio al mnimo.

40

Irontec MySQL Replication

MMM

41

Irontec MySQL Replication

MMM

Tambin el Perl. El mundo se ha vuelto loco... Caractersticas:


Monitorizacin de la replicacin Monitorizacin de los hosts Gestin del failover Balanceo de IPs entre nodos Gestin de grupos de escritura/lectura

42

Irontec MySQL Replication

MMM

La alta disponibilidad se hace mediante el balanceo de Ips virtuales que saltarn 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.

43

Irontec MySQL Replication

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 lgica:

Nodos de escritura son aquellos en los que los datos se escribirn. Nodos de lectura son aquellos de los cuales se leern datos.

Escritura (maestro) Lectura (esclavo)

44

Irontec MySQL Replication

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 mysql-mmm-common_2.0.10-1_all.deb mysql-mmm-agent_2.0.10-1_all.deb

En los nodos:

Junto con todas las dependencias!

45

Irontec MySQL Replication

MMM

Los ficheros de configuracin se guardan en /etc/mysqlmmm Todos tendrn un fichero llamado mmm_common.conf que ser exactamente igual. El nodo de control mmm_mon.conf Los servidores de MySQL mmm_agent.conf

46

Irontec MySQL Replication

MMM

mmm_common.conf Incluye la configuracin de:


Los Hosts Sus Ips Los roles Usuario/Contrasea del agente Usuario/Contrasea para la replicacin La interfaz de red en la que se trabaja

47

Irontec MySQL Replication

MMM

mmm_mon.conf Incluye la configuracin de:


Usuario/Contrasea para la monitorizacin Ips a las que pingar Ruta de los binarios Ruta del PID Nidel de debug

48

Irontec MySQL Replication

MMM

mmm_agent Incluye la configuracin de:


El nombre de este servidor Todo el mmm_common.conf Y nada ms :P

49

Irontec MySQL Replication

MMM

Como hemos visto, hay varios usuarios y contraseas definidos. Hay que crerlos en MySQL.
GRANTREPLICATIONCLIENTON*.*TO'mmm_monitor'@'10.100.1.%' IDENTIFIEDBY'RepMonitor'; GRANTSUPER,REPLICATIONCLIENT,PROCESSON*.*TO 'mmm_agent'@'10.100.1.%'IDENTIFIEDBY'RepAgent'; GRANTREPLICATIONSLAVEON*.*TO'replication'@'10.100.1.%' IDENTIFIEDBY'slave';

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 replicacin ;) 50

Irontec MySQL Replication

MMM

Una vez puesto en marcha los servicios, se deben poner online los servidores desde el comando de control.
MMM:~#mmm_controlshow 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_controlset_onlinedb1 OK:Stateof'db1'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb2 OK:Stateof'db2'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb3 OK:Stateof'db3'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb4 OK:Stateof'db4'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles!
51

Irontec MySQL Replication

MMM

Ejemplo! Parando un servidor en produccin:


MMM:~#mmm_controlset_offlinedb1 OK:Stateof'db1'changedtoADMIN_OFFLINE.Nowyoucan waitsometimeandcheckallroles! MMM:~#mmm_controlshow 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)

52

Irontec MySQL Replication

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.

53

Irontec MySQL Replication

MySQL Proxy

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


Reescribir queries. Balanceo de carga. Loggeo avanzado. Failover. Anlisis de queries.

54

Irontec MySQL Replication

Se acab

miguelangel@irontec.com miguel2angel http://miguelangelnieto.net

55

You might also like