replicacion mysql.pdf
TRANSCRIPT
-
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
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