55
 MySQL Replication Miguel Ángel Nieto <miguelangel@i rontec.com> Irontec – Internet y Sistemas sobre GNU/Linux

REPLICACION MYSQL.pdf

Embed Size (px)

Citation preview

  • MySQL Replication

    Miguel ngel Nieto Irontec Internet y Sistemas sobre GNU/Linux

  • Irontec MySQL Replication

    2

    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

    3

    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

    4

    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 disponibil idad. 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

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

  • Irontec MySQL Replication

    6

    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

    7

    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.

  • Irontec MySQL Replication

    8

    Maestro-Esclavo

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

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

    logbin=mysqlbinserverid=1sync_binlog=1

  • Irontec MySQL Replication

    10

    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';

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

    $mysqlurootpCHANGEMASTERTOMASTER_HOST=10.10.10.100,MASTER_USER=replication,MASTER_PASSWORD=slave,MASTER_LOG_FILE=master_log_file,MASTER_LOG_POS=master_log_pos;

  • Irontec MySQL Replication

    12

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

  • Irontec MySQL Replication

    13

    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.

  • Irontec MySQL Replication

    14

    Maestro-Esclavo

    Para comprobar si la replicacin es correcta tenemos el comando showslavestatus.

    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

  • 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

  • Irontec MySQL Replication

    16

    Maestro-Esclavo

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

  • Irontec MySQL Replication

    18

    Maestro-Maestro

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

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

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

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

  • 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 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?

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

  • Irontec MySQL Replication

    23

    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.

    A B C D E A 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.

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

    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 auto-incrementales:

    auto_increment_increment=4 auto_increment_offset=1

  • Irontec MySQL Replication

    25

    Replicacin rota

  • Irontec MySQL Replication

    26

    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'onquery.Defaultdatabase:'mysql'.Query:'CREATETABLEt(cCHAR(20)CHARACTERSETutf8COLLATEutf8_bin)',Error_code:1050

    Sep1111:13:16test2mysqld[6776]:09091111:13:16[ERROR]Errorrunningquery,slaveSQLthreadaborted.Fixtheproblem,andrestarttheslaveSQLthreadwith"SLAVESTART".Westoppedatlog'mysqlbin.000003'position421

  • Irontec MySQL Replication

    27

    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.00sec)

    mysql>SETGLOBALSQL_SLAVE_SKIP_COUNTER=1;QueryOK,0rowsaffected(0.00sec)

    mysql>startslave;

  • Irontec MySQL Replication

    28

    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/

  • Irontec MySQL Replication

    29

    Replicacin rota

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

    mktablechecksum

    Para sincronizar los datos de dos tablas: mktablesync

    $mktablechecksumh=host1,u=user,p=passwordh=host2

    $mktablesyncexecuteu=user,p=pass,h=host1,D=db,t=tblhost2

  • Irontec MySQL Replication

    30

    SandBox

    Para crear una laboratorio de pruebas podemos: Montar equipos fsicos e instalarlos (de locos). Montar mquinas virtuales. Usar sandbox!

  • Irontec MySQL Replication

    31

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

  • Irontec MySQL Replication

    32

    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.

  • Irontec MySQL Replication

    33

    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#lslow_level_make_sandboxmake_multiple_sandboxmake_sandboxmake_sandbox_from_sourcesbtest_sandboxmake_multiple_custom_sandboxmake_replication_sandboxmake_sandbox_from_installedmsandboxsbtool

  • Irontec MySQL Replication

    34

    Uso de SandBox

    Crear un sandbox con una nica instancia de MySQL

    punisher@shyris:~$make_sandbox/home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gzunpacking/home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gzExecutinglow_level_make_sandboxbasedir=/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

  • Irontec MySQL Replication

    35

    Uso de SandBox

    Parar sandbox: stop

    Arrancar sandbox: start

    Utilizar sandbox: use

    Reiniciar sandbox: restart

    Limpiar el sandbox: clean

  • Irontec MySQL Replication

    36

    Crear entorno maestro-esclavo

    Facil, sencillo y para toda la familia:

    punisher@shyris:~$make_replication_sandboxhow_many_slaves=2/home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gzinstallingandstartingmasterinstallingslave1installingslave2startingslave1.sandboxserverstartedstartingslave2.sandboxserverstartedinitializingslave1initializingslave2replicationdirectoryinstalledin$HOME/sandboxes/rsandbox_5_0_86

  • 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

  • Irontec MySQL Replication

    38

    Crear entorno maestro-maestro

    Es muy dificil, atentos!

    punisher@shyris:~$make_replication_sandboxmaster_master/home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gzinstallingnode1installingnode2#server:1:#server:2:#server:1:#server:2:Circularreplicationactivatedgroupdirectoryinstalledin$HOME/sandboxes/rcsandbox_5_0_86

  • Irontec MySQL Replication

    39

    Crear replicacin circularpunisher@shyris:~$make_replication_sandboxcircular=4/home/punisher/MySQL/mysql5.0.86perconahighperfb19.tar.gz#server:1:#server:2:executing"clear"onnode1executing"clear"onnode2installingnode1installingnode2installingnode3installingnode4#server:1:#server:2:#server:3:#server:4:#server:1:#server:2:#server:3:#server:4:Circularreplicationactivatedgroupdirectoryinstalledin$HOME/sandboxes/rcsandbox_5_0_86

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

    servicio al mnimo.

  • Irontec MySQL Replication

    41

    MMM

  • Irontec MySQL Replication

    42

    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

  • Irontec MySQL Replication

    43

    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.

  • 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 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)

  • 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!

  • Irontec MySQL Replication

    46

    MMM

    Los ficheros de configuracin se guardan en /etc/mysql-mmm

    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

  • Irontec MySQL Replication

    47

    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

  • Irontec MySQL Replication

    48

    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

  • Irontec MySQL Replication

    49

    MMM

    mmm_agent Incluye la configuracin de:

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

  • Irontec MySQL Replication

    50

    MMM

    Como hemos visto, hay varios usuarios y contraseas 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 replicacin ;)

    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';

  • 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_controlshowdb1(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_onlinedb1OK:Stateof'db1'changedtoONLINE.Nowyoucanwaitsometimeandcheckitsnewroles!MMM:~#mmm_controlset_onlinedb2OK:Stateof'db2'changedtoONLINE.Nowyoucanwaitsometimeandcheckitsnewroles!MMM:~#mmm_controlset_onlinedb3OK:Stateof'db3'changedtoONLINE.Nowyoucanwaitsometimeandcheckitsnewroles!MMM:~#mmm_controlset_onlinedb4OK:Stateof'db4'changedtoONLINE.Nowyoucanwaitsometimeandcheckitsnewroles!

  • Irontec MySQL Replication

    52

    MMM

    Ejemplo! Parando un servidor en produccin:

    MMM:~#mmm_controlset_offlinedb1OK:Stateof'db1'changedtoADMIN_OFFLINE.Nowyoucanwaitsometimeandcheckallroles!

    MMM:~#mmm_controlshowdb1(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)

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

  • Irontec MySQL Replication

    54

    MySQL Proxy

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

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

  • Irontec MySQL Replication

    55

    Se acab

    [email protected]

    miguel2angel

    http://miguelangelnieto.net

    PortadaPgina 2Pgina 3Pgina 4Pgina 5Pgina 6Pgina 7Pgina 8Pgina 9Pgina 10Pgina 11Pgina 12Pgina 13Pgina 14Pgina 15Pgina 16Pgina 17Pgina 18Pgina 19Pgina 20Pgina 21Pgina 22Pgina 23Pgina 24Pgina 25Pgina 26Pgina 27Pgina 28Pgina 29Pgina 30Pgina 31Pgina 32Pgina 33Pgina 34Pgina 35Pgina 36Pgina 37Pgina 38Pgina 39Pgina 40Pgina 41Pgina 42Pgina 43Pgina 44Pgina 45Pgina 46Pgina 47Pgina 48Pgina 49Pgina 50Pgina 51Pgina 52Pgina 53Pgina 54Pgina 55