Está en la página 1de 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:

En algn momento de la cadena nos llegarn nuestros


propios logs. Para evitar formar un bucle:

logslaveupdates

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

Para sincronizar los datos de dos tablas:

mktablesync

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

Arrancar sandbox:

use

Reiniciar sandbox:

start

Utilizar sandbox:

stop

restart

Limpiar el sandbox:

clean

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

Acceder al esclavo 1

s1

Acceder al esclavo 2

m1

s2

Chequear esclavos

check_slaves

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:

En los nodos:

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

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

También podría gustarte