44
MySQL en booking.com Simon J Mudd | 12/09/2013

MySQL en booking

Embed Size (px)

DESCRIPTION

MySQL en booking.com. Simon J Mudd | 12/09/2013. ¿Quién es booking.com?. líder mundial en reservas de alojamiento online sede central en Ámsterdam casa matriz, priceline.com, cotiza en NASDAQ alto crecimiento desde su inicio en 1996 trabajamos 24x7x365 – sin downtime. ¿Quién soy yo ?. - PowerPoint PPT Presentation

Citation preview

Page 1: MySQL en booking

MySQL en booking.com

Simon J Mudd | 12/09/2013

Page 2: MySQL en booking

2

¿Quién es booking.com?

● líder mundial en reservas de alojamiento online● sede central en Ámsterdam● casa matriz, priceline.com, cotiza en NASDAQ● alto crecimiento desde su inicio en 1996● trabajamos 24x7x365 – sin downtime

Page 3: MySQL en booking

3

¿Quién soy yo?

● informático, vivo en España desde hace más que 20 años (5 años en Países Bajos)

● trabajos anteriores en banca con Sybase● trabajo en booking.com desde hace 6 años● primer administrador de bases de datos MySQL

Page 4: MySQL en booking

4

¿Esta presentación?

La presentación es para hablar de MySQL● infraestructura de booking.com● como se ha afrontado el gran crecimiento del negocio● unas ideas que podrían valer para otros● las nuevas versiones de MySQL

Page 5: MySQL en booking

5

Nuestra Infraestructura hace 6 años

● * servidores MySQL y 6 cadenas de replicación● sistema operativo CentOS● diferenciación de los servidores que daban respuesta a

las páginas públicas y las internas● configuración manual● departamento informático de * personas

Page 6: MySQL en booking

6

Nuestra Infraestructura ahora

● serverdb: sistema de configuración de los equipos propio a través de una página web

● instalación de sistema operativo con pxeboot, kickstart y puppet

● instalación y configuración de MySQL con puppet● básicamente automático● departamento informático de * personas, * DBAs● No dejamos de crecer y cambiar

Page 7: MySQL en booking

7

Nuestra Infraestructura ahora

● LVM – aumentar tamaño de particiones sin downtime● sistema de archivos XFS – robusto● MySQL

● solo una instancia de MySQL por servidor● La versión Community (http://dev.mysql.com)

● Porque el código fuente está disponible

● para resolver problemas puntuales hemos tenido que aplicar parches un par de veces, pero da trabajo de mantenimiento

Page 8: MySQL en booking

8

Nuestra Infraestructura ahora

● Monitorización con nagios● Graphite recoge información para mostrar en gráficos

● Los parámetros del servidor:● Utilización del cpu, memoria, uso de swap, tráfico de red, e/s

● Los parámetros de MySQL● SHOW GLOBAL STATUS● Información de InnoDB● …

● Guardamos los datos durante al menos un año

Page 9: MySQL en booking

9

Hardware

● servidores normales.● memoria ha ido ampliándose desde 8 GB hace 6 años

hasta 96 GB para las configuraciones normales ahora● 6-8 discos locales con RAID-10 con caché alimentado

por batería, absorbe picos de escritura● Espacio utilizable ha subido de 450 GB a 3 TB con discos normales

● SAN para los servidores maestro

Page 10: MySQL en booking

10

Evolución del número de servidores MySQL

Nov-0

5

Jan-

06

Mar

-06

May

-06

Jul-0

6

Sep-0

6

Nov-0

6

Jan-

07

Mar

-07

May

-07

Jul-0

7

Sep-0

7

Nov-0

7

Jan-

08

Mar

-08

May

-08

Jul-0

8

Sep-0

8

Nov-0

8

Jan-

09

Mar

-09

May

-09

Jul-0

90%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

Page 11: MySQL en booking

11

Evolución del número de instancias MySQL

01/1

2/20

05

01/0

2/20

06

01/0

4/20

06

01/0

6/20

06

01/0

8/20

06

01/1

0/20

06

01/1

2/20

06

01/0

2/20

07

01/0

4/20

07

01/0

6/20

07

01/0

8/20

07

01/1

0/20

07

01/1

2/20

07

01/0

2/20

08

01/0

4/20

08

01/0

6/20

08

01/0

8/20

08

01/1

0/20

08

01/1

2/20

08

01/0

2/20

09

01/0

4/20

09

01/0

6/20

09

01/0

8/20

090

10

20

30

40

50

60

70

Page 12: MySQL en booking

12

Capacidad del servidor es insuficiente

Supuesto: la carga principal es de lectura (SELECT)● Añadir esclavos● La configuración de esclavos MySQL es muy fácil● hemos tenido hasta 150 esclavos por debajo del mismo

servidor maestro● límite: ancho de banda de interfaz de red (maestro) y el

número de threads utilizados para replicar

Page 13: MySQL en booking

13

Capacidad del servidor es insuficiente

Maestros:● Habilitar binlogs● log_bin = ../log/bin_log # camino relativo al datadir● sync_binlog = 1● Innobase: ib_logfile – aumentar tamaño para retrasar

checkpointing (5.5: 4 GB, 5.6+: más)● Esta configuración genera más e/s que un esclavo

Page 14: MySQL en booking

14

Capacidad del servidor es insuficiente

Replicas:● read_only # cuidado con acceso con privilegio SUPER● sin binlogs # mejor rendimiento● relay_log = ../log/relaylog # camino relativo al datadir● 5.5: sync_relay_log (afecta rendimiento) [ una caída

puede provocar una perdida de sincronización entre master.info y la base de datos ]

● 5.6: {master,relay_log}_info_repository = TABLE

Page 15: MySQL en booking

15

Capacidad del servidor es insuficiente

Replicas:● Es importante crear un procedimiento automático para

clonar/copiar nuevos esclavos● Usar replicas para backups para evitar downtime en el

maestro

Page 16: MySQL en booking

16

Capacidad del servidor insuficiente

Supuesto: la carga principal es de escritura, o la base de datos crece demasiado

● Separar los datos en dos cadenas de replicación independientes

● Las aplicaciones tendrán que conectar con las dos cadenas de replicación

Page 17: MySQL en booking

17

Capacidad del servidor insuficiente

Supuesto: la carga principal es de escritura, y no se puede dividir la base de datos lógicamente

● Aplicar SHARDING● Ningún servidor guarda todos los datos● Las aplicaciones tienen que saber dónde encontrar la

información y donde escribir sus cambios● La solución más compleja pero necesaria en algunos casos● Se puede replicar los datos vía MySQL o a nivel de aplicación

Page 18: MySQL en booking

18

Necesidad de Redundancia

Usar múltiples centros de datos● toda la configuración de maestro/esclavos duplicada en

otro centro de datos● el maestro de los otros centros de datos es un esclavo

del maestro principal● uso de un SAN para guardar los datos en los maestros● Tener esclavos de repuesto y usarlos en caso de

necesidad

Page 19: MySQL en booking

19

Necesidad de Redundancia

M1

S1 S2 Sn

DC1

M2

S1 S2 Sn

DC2

Page 20: MySQL en booking

20

Configuración

● Guarda toda la configuración que puedas● Esto permite saber si algo ha cambiado o ver la

evolución de cambios en el tiempo● Nuestra memoria no es fiable

Page 21: MySQL en booking

21

Configuración

● Contenido de /etc/my.cnf● SHOW GLOBAL VARIABLES● Permisos de acceso (GRANTS)● estructura de tablas, events, triggers, VIEWs etc● tamaño de bases de datos, tablas y archivos utilizados por MySQL● configuración de kernel/sysctl –a● entradas en el crontab● guardar centralmente y normalizar los datos para reducir espacio● puede ser bueno para cubrir reglamento legales, auditores

Page 22: MySQL en booking

22

Gestión de Permisos (GRANTS)

● Replicar los permisos de acceso desde el maestro a sus replicos a través de la replicación de la base de datos mysql

● Un cambio en el maestro llega a todos sus esclavos● Es sencillo● Es rápido

Page 23: MySQL en booking

23

Evitar Retrasos en la Replicación

● Solo permite cambios pequeños● Limita el número de filas cambiadas a la vez (máx 10,000)

● Las aplicaciones deberían monitorizar los retrasos que pueden provocar y auto-ajustarse

● pt-online-schema-change en vez de ALTER TABLE

Page 24: MySQL en booking

24

Uso de SSDs

● Funcionan bien y son rápidos● Los usamos en muchos sistemas clave● Todavía caras para tamaños grandes● No olvidar usar RAID● Es el futuro

Page 25: MySQL en booking

25

Como actualizar MySQL

● Empezar con la actualización de un esclavo y comprueba que funciona bien

● copiar la versión actualizada para sustituir servidores con la versión anterior

● Actualizar esclavos:● Es fácil de usar otro servidor temporalmente, o● Dejar de usar la replica mientras se actualiza

Page 26: MySQL en booking

26

Como actualizar MySQL (2)● Actualizar maestros: es más complejo

● construir un nuevo maestro, configurado como esclavo y después mover los esclavos por debajo del nuevo maestro

● usar y mover VIP entre antiguo y nuevo● downtime se reduce a un unos segundos

● no olvidar que la versión del maestro no puede ser mayor que la versión de sus replicas

Page 27: MySQL en booking

27

Como actualizar MySQL (3)

M1a

S1 S2 Sn

Versión nueva Versión antigua

Situación Inicial

Page 28: MySQL en booking

28

Como actualizar MySQL (3)

M1a

S1 S2 Sn

Versión nueva Versión antigua

Actualizar esclavos

Page 29: MySQL en booking

29

Como actualizar MySQL (3)

M1a

S1 S2 Sn

Versión nueva Versión antigua

M1bCrear un maestro nuevo,configurado como esclavo

Page 30: MySQL en booking

30

Como actualizar MySQL (3)

M1a

S1 S2 Sn

Versión nueva Versión antigua

M1bAjustar la configuraciónde los esclavos parareplicar del maestro nuevo

Page 31: MySQL en booking

31

Como actualizar MySQL (3)

S1 S2 Sn

Versión nueva Versión antigua

M1bLos clientes hablan con el nuevo maestro

Page 32: MySQL en booking

32

Evolución de Versiones MySQL

12/200503/200606/200609/200612/200603/200706/200709/200712/200703/200806/200809/200812/200803/200906/20090%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

5.05.15.55.6

Page 33: MySQL en booking

33

MySQL 5.6● Escritura a disco funciona mejor con más carga● performance_schema te dice mejor dónde están los cuellos de

botella● InnoDB muchas mejoras● Para ciertos trabajos puede ser algo más lento que 5.5. Si

encuentras una situación así reportarlo como un bug.

Page 34: MySQL en booking

34

¿Qué está haciendo MySQL?

Usar graphite o cacti para mostrar las tendencias gráficas● Guardar la información al menos un año y con una resolución

de 10 segundos

Recoger información cada minuto● SHOW PROCESSLIST, INNODB STATUS, SLAVE STATUS● Sistema Operativo: ps auwx, free● Guardar información de la última semana● Muy útil pero no muestra picos de actividad muy cortos

Page 35: MySQL en booking

35

¿Qué está haciendo MySQL?

Page 36: MySQL en booking

36

¿Qué está haciendo MySQL?

Page 37: MySQL en booking

37

Procesar los binlogs en los maestros● Te ayuda a ver dónde está la carga principal (tabla con más

cambios en bytes cambiados o número de cambios)● Te ayuda a ver los picos que surgen durante el día● Te ayuda a ver las causas de retraso en la replicación

¿Qué está haciendo MySQL?

Page 38: MySQL en booking

38

pt-table-sync para sincronizar tablas entre instancias

¿Qué está haciendo MySQL?

Page 39: MySQL en booking

39

¿Qué está haciendo MySQL?

Page 40: MySQL en booking

40

performance_schema● 5.5: Información básica● 5.6: Muy bien, aunque la documentación es demasiado

técnica no funcional● 5.7: va a incluir más información útil: por ejemplo el uso

de memoria

¿Qué está haciendo MySQL?

Page 41: MySQL en booking

41

InnoDB● Úsalo si no lo estás utilizando ya● Más seguro bajo caídas de MySQL o el sistema operativo● No olvidar:

● innodb_flush_log_at_trx_commit = 1● innodb_flush_method = O_DIRECT● evita contención: dividir buffer_pool en 2 GB / max. 64 pools

● Cuidado: espacio utilizado en disco es mayor que el utlizado con el motor MyISAM

Page 42: MySQL en booking

42

Otras Cosas● Controlar acceso: SUPER / read_only● Quitar base de datos test y usuarios anónimos● La versión de MySQL predeterminada puede ser antigua

Page 43: MySQL en booking

43

Herramientas● Percona toolkit es muy útil

● pt-show-grants● pt-diskstats en vez de iostat/vmstat● pt-online-schema-change (algunos cambios tardaron casi una

semana en completarse)● pt-table-sync para sincronizar tablas entre instancias

Page 44: MySQL en booking

44

Gracias

Contacto:● [email protected]