Escalabilidad - Apache y MySQL

6,918 views
6,710 views

Published on

Transparencias usadas para la charla sobre escalabilidad en sistemas con apache y mysql (Semana ESIDE 2008).

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,918
On SlideShare
0
From Embeds
0
Number of Embeds
606
Actions
Shares
0
Downloads
193
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Escalabilidad - Apache y MySQL

  1. 1. Escalabilidad Apache y MySQL SEL'08 Lorena Fernández y Alvaro Uría loretahur=gmail.com / fermat=rigel.deusto.es e-GHOST - Universidad de Deusto
  2. 2. Escalabilidad: ¿Qué es? <ul><li>Rendimiento (performance) </li></ul><ul><ul><li>Tiempo de respuesta </li></ul></ul><ul><li>Capacidad </li></ul><ul><ul><li>Operaciones por ud. de tiempo </li></ul></ul>
  3. 3. Escalabilidad: Metas <ul><li>Incrementar </li></ul><ul><ul><li>Capacidad de cada componente </li></ul></ul><ul><ul><li>Eficiencia de cada componente </li></ul></ul><ul><li>Reducir carga de cada componente </li></ul><ul><ul><li>AKA: Desplazar el problema (cuello de botella) a otro componente </li></ul></ul>
  4. 4. ¿Qué es Eficiencia? <ul><li>Velocidad </li></ul><ul><ul><li>Tiempo de ejecución </li></ul></ul><ul><li>Espacio </li></ul><ul><ul><li>Cuánto se ha usado (memoria, disco...) </li></ul></ul>
  5. 5. ¿Qué problemas existen? <ul><li>Optimizar gráficos (tamaño...) </li></ul><ul><li>BBDD: Análisis de tablas (optimizando consultas SQL...) </li></ul><ul><li>Cuellos de botella (I/O, ...) </li></ul><ul><li>Aplicaciones mal diseñadas/configuradas </li></ul><ul><li>Sistemas con pocos recursos </li></ul>
  6. 6. ¿Cómo resolverlos?: posibles pasos <ul><li>Entender el entorno de la aplicación </li></ul><ul><li>Clasificar el tipo de carga </li></ul><ul><li>Determinar los componentes problemáticos </li></ul><ul><li>Seleccionar una técnica para escalado </li></ul><ul><li>Probar técnica y reevaluar </li></ul>
  7. 7. Entendiendo el entorno... <ul><li>Conocer el diseño del sistema </li></ul><ul><ul><li>3-tier: presentación, aplicación, datos </li></ul></ul><ul><ul><li>1-tier: LAMP en una sola máquina :D </li></ul></ul><ul><li>Conocer la carga de trabajo </li></ul><ul><ul><li>Monitorización </li></ul></ul><ul><ul><ul><li>Sistema Operativo (número de procesos y sus estado, uso de memoria, CPU...) </li></ul></ul></ul><ul><ul><ul><li>Apache (número de conexiones, visitas, visitas únicas, páginas vistas...) </li></ul></ul></ul><ul><ul><ul><li>MySQL (consultas por minuto...) </li></ul></ul></ul>
  8. 8. Clasificando el tipo de carga... (I) <ul><li>Patrón publish/subscribe </li></ul><ul><ul><li>Ej. Prensa online, motores de búsqueda </li></ul></ul><ul><ul><li>Provee información al usuario </li></ul></ul><ul><ul><li>Características </li></ul></ul><ul><ul><ul><li>contenido muy variable </li></ul></ul></ul><ul><ul><ul><li>riesgo en seguridad: bajo (no hay transacciones con terceros) </li></ul></ul></ul>
  9. 9. Clasificando el tipo de carga... (II) <ul><li>Compra online </li></ul><ul><ul><li>Ej. Tiendas como FNAC.es </li></ul></ul><ul><ul><li>Función: navegar y comprar </li></ul></ul><ul><ul><li>Características </li></ul></ul><ul><ul><ul><li>contenido bastante estático (catálogos), aunque variable en ocasiones (promociones) </li></ul></ul></ul><ul><ul><ul><li>Pocas páginas a ver, pero mucho tráfico </li></ul></ul></ul><ul><ul><ul><li>seguridad: medio (en el momento del cobro) </li></ul></ul></ul>
  10. 10. Clasificando el tipo de carga... (III) <ul><li>Autoservicio de clientes </li></ul><ul><ul><li>Ej. Banca online, Mensajería (FedEx, DHL...) </li></ul></ul><ul><ul><li>Comprobar datos personalizados </li></ul></ul><ul><ul><li>Características </li></ul></ul><ul><ul><ul><li>Conectando a 3ºs servicios </li></ul></ul></ul><ul><ul><ul><li>Bancos: riesgo alto en seguridad </li></ul></ul></ul><ul><ul><ul><li>Poco tráfico en búsquedas </li></ul></ul></ul><ul><ul><ul><li>Mucho tráfico en transacciones </li></ul></ul></ul>
  11. 11. Clasificando el tipo de carga... (IV) <ul><li>Comercio </li></ul><ul><ul><li>Ej. eBay, Amazon </li></ul></ul><ul><ul><li>Compra/Venta </li></ul></ul><ul><ul><li>Mezcla entre todos los anteriores </li></ul></ul><ul><ul><ul><li>Búsquedas </li></ul></ul></ul><ul><ul><ul><li>Transacciones </li></ul></ul></ul><ul><ul><ul><li>Datos volátiles </li></ul></ul></ul>
  12. 12. Algunas técnicas de escalado... <ul><li>Escalado vertical </li></ul><ul><ul><li>Hacer más potentes los nodos que ya tenemos </li></ul></ul><ul><li>Escalado horizontal </li></ul><ul><ul><li>Aumentar el número de nodos </li></ul></ul>
  13. 13. Escalado vertical <ul><li>Una máquina más rápida </li></ul><ul><ul><li>Mayor capacidad (opers/tiempo) </li></ul></ul><ul><li>Una máquina especial (appliance) </li></ul><ul><ul><li>Mayor capacidad </li></ul></ul><ul><ul><li>Mayor eficiencia </li></ul></ul>
  14. 14. Escalado horizontal <ul><li>Crear un cluster de máquinas </li></ul><ul><ul><li>Mayor capacidad </li></ul></ul><ul><li>Ocultar las máquinas tras un balanceador </li></ul><ul><ul><li>Reducción de la carga de trabajo </li></ul></ul><ul><ul><li>Mayor eficiencia </li></ul></ul><ul><li>Dividir distintas aplicaciones en varias máquinas (no es puramente un escalado horizontal) </li></ul><ul><ul><li>Reducción de la carga de trabajo </li></ul></ul><ul><ul><li>Mayor eficiencia </li></ul></ul>
  15. 15. Entre el hardware... <ul><li>Coexistencia de servicios en una misma máquina afecta al funcionamiento </li></ul><ul><li>Para contenido estático </li></ul><ul><ul><li>Memoria RAM, muy importante (cacheo) </li></ul></ul><ul><ul><ul><li>mod_cache (Gestores de almacenamiento: mod_disk_cache, mod_mem_cache) </li></ul></ul></ul><ul><li>Para contenido dinámico </li></ul><ul><ul><li>Uso intensivo de CPU </li></ul></ul><ul><li>Discos duros: rápidos, mejor RAID </li></ul>
  16. 17. El software... Apache (I) <ul><li>Cargar módulos necesarios, únicamente </li></ul><ul><ul><li>Coste en RAM </li></ul></ul><ul><li>Compilación de módulos </li></ul><ul><ul><li>Estática: incluídos en el binario (incluso módulos de 3ºs) </li></ul></ul><ul><ul><li>Dinámica: sólo se cargan cuando se van a usar (problema de rendimiento) </li></ul></ul>
  17. 18. El software... Apache (II) <ul><li>Uso de directivas de configuración que necesitemos (no todas, aunque sea por defecto) </li></ul><ul><ul><li>Comentar “Multi-Processing Modules” (MPMs) que no usemos </li></ul></ul><ul><li>MPMs </li></ul><ul><ul><li>Prefork: mejor en máquinas con 1 ó 2 CPUs </li></ul></ul><ul><ul><li>Worker: mejor en máquinas con muchas CPUs </li></ul></ul>
  18. 19. El software... Apache (III) <ul><li>Ejecución de CGIs asociada a un directorio </li></ul><ul><ul><li>Para no tener que comprobar cada fichero pedido </li></ul></ul><ul><li>Uso de intérpretes embebidos mejora el rendimiento (por ahí dicen que se reduce el tiempo de ejecución en un 70%) </li></ul><ul><ul><li>mod_perl vs. CGI </li></ul></ul>
  19. 20. El software... Apache (IV) <ul><li>Evitar la comprobación de .htaccess </li></ul><ul><ul><li>AllowOverride None </li></ul></ul><ul><li>Reducir las llamadas a la función stat </li></ul><ul><ul><li>Options FollowSymLinks </li></ul></ul><ul><li>Reducir el consumo de red </li></ul><ul><ul><li>HostnameLookup off </li></ul></ul>
  20. 21. El software... Apache (V) <ul><li>Módulos de ayuda a la configuración </li></ul><ul><ul><li>mod_status (“/server-status”) </li></ul></ul><ul><ul><li>mod_info (“/server-info”) </li></ul></ul><ul><ul><li>mod_log_forensic (y “ForensicLog foo.log”) </li></ul></ul><ul><li>Herramientas (apache2-utils) </li></ul><ul><ul><li>“ab” (Apache Benchmarking) </li></ul></ul><ul><ul><ul><li>ab -kc 10 -t 30 http://example.com/ </li></ul></ul></ul><ul><ul><ul><li>ab -kc 5 -n 1000 http://example.com/ </li></ul></ul></ul><ul><ul><li>“check_forensic” (análisis de “foo.log”) </li></ul></ul>
  21. 22. Prefork: Config. básica <ul><li>Timeout 300 </li></ul><ul><li>KeepAlive On </li></ul><ul><li>MaxKeepAliveRequests 100 </li></ul><ul><li>KeepAliveTimeout 15 </li></ul><ul><li><IfModule mpm_prefork_module> </li></ul><ul><li>StartServers 5 </li></ul><ul><li>MinSpareServers 5 </li></ul><ul><li>MaxSpareServers 10 </li></ul><ul><li>MaxClients 150 </li></ul><ul><li>MaxRequestsPerChild 0 </li></ul><ul><li></IfModule> </li></ul>
  22. 23. Worker: Config. básica <ul><li>Timeout 300 </li></ul><ul><li>KeepAlive On </li></ul><ul><li>MaxKeepAliveRequests 100 </li></ul><ul><li>KeepAliveTimeout 15 </li></ul><ul><li><IfModule mpm_worker_module> </li></ul><ul><li>StartServers 2 </li></ul><ul><li>MaxClients 150 </li></ul><ul><li>MinSpareThreads 25 </li></ul><ul><li>MaxSpareThreads 75 </li></ul><ul><li>ThreadsPerChild 25 </li></ul><ul><li>MaxRequestsPerChild 0 </li></ul><ul><li></IfModule> </li></ul>
  23. 24. En resumen <ul><li>Leer (documentación, artículos, ...) </li></ul><ul><li>??? (Probar y Monitorizar) </li></ul><ul><li>Profit </li></ul>
  24. 26. ¿Sobre qué actuamos? <ul><li>Hardware (CPU, memoria, disco, ...) </li></ul><ul><ul><li>top, htop, mrtg </li></ul></ul><ul><li>Parámetros del servidor (my.cnf) </li></ul><ul><li>Sentencias SQL </li></ul>
  25. 27. Hardware <ul><li>Disco </li></ul><ul><ul><li>Acceso recurrente de apache, mysql, logs, ficheros, ... </li></ul></ul><ul><ul><li>Lo óptimo --> tener separado esto en diferentes discos (SATA o mejor SAS) </li></ul></ul><ul><ul><li>noatime en sistema de archivos: </li></ul></ul><ul><ul><ul><li>mount -o remount,noatime / </li></ul></ul></ul><ul><li>Memoria </li></ul><ul><li>CPU </li></ul>
  26. 28. htop
  27. 29. Actuación I <ul><li>Medir el sistema </li></ul><ul><ul><li>¿En qué días y horas hay más carga? </li></ul></ul><ul><ul><ul><li>mrtg </li></ul></ul></ul><ul><ul><ul><li>mytop </li></ul></ul></ul><ul><ul><li>¿Qué sentencias tardan más en ejecutarse? </li></ul></ul><ul><ul><ul><li>opción --log-slow-queries </li></ul></ul></ul><ul><ul><ul><li>mysqldumpslow </li></ul></ul></ul><ul><li>Cambiar una cosa cada vez y medir el rendimiento </li></ul><ul><li>¡¡Deshabilitar la caché para hacer pruebas!! </li></ul>
  28. 30. mytop <ul><li>Un top para MySQL </li></ul><ul><li>show processlist // kill </li></ul><ul><li>+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+ </li></ul><ul><li>| Id | User | Host | db | Command | Time | State | Info </li></ul><ul><li>+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+ </li></ul><ul><li>| 6 |usuario|localhost| base_datos2 | Query | 5018 | Sending data | select * from tabla </li></ul>
  29. 31. Slow Querys I <ul><li>Sentencias SQL que llevaron más de long_query_time segundos para ejecutarse completamente </li></ul><ul><li>En my.cnf: </li></ul><ul><ul><ul><li>long_query_time = 10 </li></ul></ul></ul><ul><ul><ul><li>log-slow-queries = /var/log/mysql/mysql-slow.log </li></ul></ul></ul><ul><ul><ul><li>#también se loguean consultas que no usan índices </li></ul></ul></ul><ul><ul><ul><li>log-queries-not-using-indexes </li></ul></ul></ul>
  30. 32. Slow Querys II <ul><li>Time : segundos que ha durado la ejecución. No se tienen en cuenta los bloqueos de tabla iniciales </li></ul><ul><li>Lock : tiempos de bloqueos </li></ul><ul><li>Rows : filas examinadas (nos ayuda a ver consultas sin índices) </li></ul><ul><li>Host </li></ul><ul><li>Consulta </li></ul>User@Host: user_nireblog @ localhost [] Query_time: 12 Lock_time: 0 Rows_sent: 7 Rows_examined: 248098 select * from tabla;
  31. 33. Slow Querys III <ul><li>¿Y si el log es muy grande? </li></ul><ul><ul><li>Aumentamos log_query_time </li></ul></ul><ul><ul><li>mysqldumpslow </li></ul></ul><ul><li>Top 10 de sentencias: </li></ul><ul><li>mysqldumpslow -s c -t 10 /var/log/mysql/slow.log </li></ul>
  32. 34. SQL I <ul><li>EXPLAIN sentencia --> Plan de ejecución de una sentencia </li></ul><ul><ul><li>type: all -> escaneo completo </li></ul></ul><ul><ul><li>type: index --> uso de índices // key </li></ul></ul><ul><li>Índices </li></ul><ul><ul><li>Sobre campos de búsqueda y no sobre las selecciones </li></ul></ul><ul><ul><li>Sobre valores diferentes mejor que sobre duplicados </li></ul></ul><ul><ul><li>No abusar </li></ul></ul>
  33. 35. SQL II <ul><li>Evitar los tipos de columna variable (CHAR frente a VARCHAR) </li></ul><ul><li>Insertar filas múltiples </li></ul><ul><li>Optimize table --> desfragmenta la tabla, la repara y la ordena </li></ul>
  34. 36. my.cnf <ul><li>skip-name-resolve </li></ul><ul><li>set-variable=max_connections=500 </li></ul><ul><li>> SHOW STATUS LIKE ‘max_used_connections’; </li></ul><ul><li>set-variable=wait_timeout=70 </li></ul>
  35. 37. Memoria <ul><li>key_buffer (índices) </li></ul><ul><ul><li>Key_buffer memoria uso disco </li></ul></ul><ul><ul><li>Servidores dedicados a BD ¼ de la RAM </li></ul></ul><ul><ul><li>Uso de índices: key_reads vs. key_read_requests </li></ul></ul>
  36. 38. Caché I <ul><li>table_cache </li></ul><ul><ul><li>Nº de tablas abiertas </li></ul></ul><ul><ul><li>max_connections x nº máximo de tablas en una join </li></ul></ul><ul><li>query_cache_size: tamaño de la caché </li></ul><ul><li>query_cache_limit --> MySQL no cacheará consultas que sean más grandes que este valor </li></ul><ul><li>SQL_NO_CACHE (código) </li></ul>
  37. 39. Caché II <ul><li>mysql> show status like 'Qcache%'; </li></ul><ul><li>+-------------------------+----------+ </li></ul><ul><li>| Variable_name | Value | </li></ul><ul><li>+-------------------------+----------+ </li></ul><ul><li>| Qcache_queries_in_cache | 40 | peticiones en la caché </li></ul><ul><li>| Qcache_inserts | 40 | </li></ul><ul><li>| Qcache_hits | 25 | </li></ul><ul><li>| Qcache_lowmem_prunes | 0 | </li></ul><ul><li>| Qcache_not_cached | 1 | </li></ul><ul><li>| Qcache_free_memory | 10383801 | caché usada = query_cache_size - Qcache_free_memory </li></ul><ul><li>| Qcache_free_blocks | 1 | </li></ul><ul><li>| Qcache_total_blocks | 65 | </li></ul><ul><li>+-------------------------+----------+ </li></ul><ul><li>8 rows in set (0.00 sec) </li></ul>
  38. 40. MySQL Perfomance Tuning Primer Script <ul><li>Descargar de aquí </li></ul><ul><li>Coge información de “SHOW STATUS LIKE” y “SHOW VARIABLES LIKE” </li></ul><ul><li>Genera recomendaciones </li></ul><ul><li>Recomendable lanzarlo teniendo mysql + 48 h </li></ul><ul><li>Recomendaciones: Slow Query Log, Max Connections, Worker Threads, Key Buffer, Query Cache, Sort Buffer, ... </li></ul>
  39. 41. Benchmarks <ul><li>El paquete de pruebas de rendimiento de MySQL: http://dev.mysql.com/doc/refman/5.0/es/mysql-benchmarks.html </li></ul><ul><li>Open Source Database Benchmark: http://osdb.sourceforge.net/ </li></ul><ul><li>Super Smack: http://jeremy.zawodny.com/mysql/super-smack </li></ul>
  40. 42. Referencias <ul><li>Apache </li></ul><ul><ul><li>http://httpd.apache.org/docs/2.0/ </li></ul></ul><ul><ul><li>http://highscalability.com/tags/apache </li></ul></ul><ul><ul><li>http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html </li></ul></ul><ul><ul><li>http://www.serverwatch.com/ </li></ul></ul><ul><li>MySQL </li></ul><ul><ul><li>http://dev.mysql.com/doc/refman/5.0/es/mysql-optimization.html </li></ul></ul><ul><ul><li>http://www.ibm.com/developerworks/web/library/l-tune-lamp-3.html?ca=drs- </li></ul></ul>
  41. 43. Este contenido está licenciado bajo Creative Commons by-sa 3.0

×