Drupal 7 para sitios de alto rendimiento y alta disponibilidad
1. Drupal 7 para sitios de
alto rendimiento y
disponibilidad
IIG. Iván G. Campaña N.
2. ¿Qué implica alto rendimiento?
• Un sitio que recibe desde miles a millones de visitas por segundo.
• Va asociado a sitios con un flujo alto de información (medios de
comunicación, páginas de entidades de gobierno, sitios de famosos, etc...).
• Los visitantes esperan poder acceder al contenido en cualquier momento y
sin interrupciones.
• El tiempo fuera de línea puede implicar pérdidas monetarias o daño de
imagen para la empresa.
D7 para alto rendimiento
3. ¿Drupal está listo?
Sitios desarrollados en Drupal con alto número de visitas:
• The White House / La Casa Blanca (whitehouse.gov)
• The Economist (economist.com)
• Fox News (nation.foxnews.com)
• El Universo (eluniverso.com)
• Ecuavisa (ecuavisa.com)
Requieren no sólo de infraestructura, sino también de una estrategia de
optimización diseñada de acuerdo a las necesidades del proyecto.
D7 para alto rendimiento
4. CMS vs Código puro
Código puro
●
●
●
●
●
Proceso de desarrollo más largo
Menor consumo de recursos
Desarrollo de funcionalidades a la medida
Características ajustadas específicamente a la necesidad
Mayor dificultad para realizar cambios drásticos.
CMS
● Agregan una capa grande de “sobrecarga” (overhead).
● Contienen múltiples módulos los cuales requieren de aseguramiento de calidad.
● La mayoría están basados en lenguajes de scripting (Ruby, PHP, Python, etc...)
Implica que no hay compilación de código, incrementando consumo de CPU.
● Simplifican el desarrollo, pero mantenimiento es crítico (bugs, parches de seguridad).
● Mayor flexibilidad y facilidad de cambio (generalidad).
l
D7 para alto rendimiento
5. ¿Cómo funciona con Drupal?
● Por defecto no está optimizado para alto rendimiento
● Almacena toda la configuración en la BD.
Las bases de datos son “lentas”
● Atrapa todas las solicitudes al utilizar URLs amigables (inclusive los archivos
estáticos).
● Es una herramienta genérica, por lo cual agrega validaciones y
verificaciones que ralentizan la ejecución y aumentan el consumo de
recursos.
● Inclusive con las configuraciones por defecto de mejora de rendimiento no
puede soportar un número alto de accesos concurrentes.
●
D7 para alto rendimiento
6. ¿Qué se necesita para optimizarlo?
● Conocimientos :)
● Recursos :(
D7 para alto rendimiento
7. ¿Alternativas?
● Configuración en un ambiente propio:
●
Instalación de servidores, componentes y configuraciones.
● Servicios de terceros:
●
●
Pantheon (http://getpantheon.com/)
Acquia Cloud (http://www.acquia.com/products-services/acquia-cloud)
● Optimizaciones al sitio web (obligatorio).
D7 para alto rendimiento
8. ¿La solución?
●No existe una fórmula mágica.
●Se necesita planificación y adaptar el sitio para poder responder a la
demanda.
●Nos podemos basar en cálculos y recomendaciones, pero pesa mucho la
experiencia.
●Hay que pensar en software y hardware.
●Integración de servicios de distribución y balanceo de carga
●Mejorar acceso a recursos lentos (Sistema de archivos, BD, Red, E/S en
general)
●Redundancia.
●Utilizar servicios en la nube (cloud SAS).
D7 para alto rendimiento
10. Establecer métricas y objetivos
●
●
●
●
Más infraestructura sin
optimización = Desperdicio de
dinero.
Establecer un mínimo y un
máximo de visitantes esperados.
¿Qué puedo lograr con mis
recursos?
Identificar qué características del
sitio requieren atención especial:
–
Ej: Contenido altamente dinámico,
llamadas AJAX, número de
usuarios logueados
concurrentemente.
D7 para alto rendimiento
11. Pruebas de rendimiento
●
●
●
Se deben realizar en ambiente de QA o Staging.
Apache Benchmark
●
Pruebas básicas
●
Simulación de usuarios concurrentes
●
Se puede enviar cookies y parámetros para simular sesiones de usuario.
●
Se maneja a nivel de scripting o en consola
●
Manual:
●
http://httpd.apache.org/docs/2.2/programs/ab.html
New Relic
●
Permite identificar cuellos de botella en el rendimiento del sitio o la
infraestructura.
●
Integración directa con drupal (servicio pro)
●
Monitoreo constante durante las pruebas de rendimiento
D7 para alto rendimiento
12. Pruebas de rendimiento
●
Jmeter / Blazemeter
●
Pruebas con los tipos de usuarios que se van a manejar
●
Páginas estáticas
●
Páginas con bloques de contenido dinámico.
●
Páginas que varían dependiendo de parámetros:
●
Por Rol
●
Por Usuario
●
Por variables
●
Módulo de integración:
●
https://drupal.org/project/blazemeter
●
Scripts de ejemplo:
●
https://github.com/Ymbra/drupal7-jmeter
●
https://github.com/erikwebb/drupal-jmeter-tricks
http://www.metaltoad.com/blog/jmeter-test-plan-drupal
D7 para alto rendimiento
13. ¿Luego de las pruebas?
● ¿Qué he logrado?
●
●
●
Ya conozco los problemas.
Tengo establecidos los objetivos a alcanzar.
Conozco mis límites en cuanto a recursos.
¿Cómo avanzo?
D7 para alto rendimiento
14. Optimizaciones por niveles
Nivel básico:
● Caché en el navegador
● Configurar recursos estáticos (js/css/imágenes).
● Habilitar caché para usuarios anónimos
● Utilizar un cache de OPCode para el código
● Reducir el número de módulos incluidos
D7 para alto rendimiento
15. Optimizaciones por niveles
Nivel intermedio:
● Reemplazar caché de BD de Drupal
● Reemplazar servidor web
● Optimizar motor de BD
● Integrar caché de usuarios logueados
● Optimizar rendimiento de módulos
D7 para alto rendimiento
16. Optimizaciones por niveles
Nivel avanzado:
● Integrar sistema de caché con reglas
● Integrar búsquedas a través de Apache Solr
● Utilizar herramientas de balanceo de carga, proxy inverso, CDN
● Emplear herramientas de terceros para reducir carga (opcionales):
●
Cloudflare
●
Apache Mahout
D7 para alto rendimiento
17. Nivel básico de optimización
• Caché en los navegadores
o Configurar e-tags en el servidor web
o Establecer fecha de expiración de archivos
o Usar dominios sin cookies para contenido estático
o Usar una red CDN
(Se puede crear un CDN falso con un servidor secundario)
o Activar agregación CSS/JS en Drupal
• Habilitar caché para usuarios anónimos
o Se almacenan las páginas, bloques y vistas generadas en la BD.
o Establece un tiempo mínimo de permanencia en caché.
o Puede integrarse con el módulo expires para hacer la limpieza del
contenido.
D7 para alto rendimiento
18. Nivel básico de optimización
• Listar los módulos integrados y desactivar o desinstalar los que no se
utilicen.
• Seleccionar módulos que puedan ser reutilizables.
• Mantener las funcionalidades personalizadas modulares, pero compactas.
“No matar moscas con balas de cañón”
D7 para alto rendimiento
19. Nivel básico de optimización
Utilizar caché OPCode
o Crea código intermedio (precompilado).
o Se puede mantener en memoria evitando que pase a leer archivos en
disco (mejora E/S). Evita hacer “hits” al disco por cada archivo.
o Se actualiza cuando detecta que hay cambios en los archivos de código.
o Basta con integrar un módulo de PHP y establecer los parámetros
básicos.
o Funciona con cualquier aplicación PHP.
o Una instalación de Drupal incluyendo los módulos contribuidos puede
tener más de 2,000 archivos de código.
• Módulos más populares:
o APC
o XCache
o Zend Optimizer
D7 para alto rendimiento
21. Herramientas de evaluación
• Estas herramientas incluyen recomendaciones básicas para mejorar
la interacción y tiempo de respuesta del sitio:
• Yahoo YSlow
●
http://developer.yahoo.com/yslow/
• Google Page Speed
https://developers.google.com/speed/pagespeed/
D7 para alto rendimiento
22. Nivel intermedio de optimización
● Reemplazar caché de BD de Drupal
●
Resuelve problemas básicos de rendimiento.
●
Escribir en la BD siempre es costoso.
●
Se vuelve un problema con múltiples usuarios concurrentes.
● La herramienta utilizada por defecto es Memcached.
●
Requiere soporte de módulo de PHP
●
Se pueden definir múltiples instancias para los diferentes componentes
del sitio.
●
Se mantiene el resultado en memoria RAM.
●
Permite reemplazar caché estándar, así como caché de sesiones y de
bloqueo (lock)
● Sistema alternativo basado en archivos: Boost.
●
Sigue siendo más “económico” que escribir en la BD, aunque no sea tan
rápido como almacenar en memoria.
D7 para alto rendimiento
23. Herramientas de caché
Métodos simples (con recursos limitados):
DatabaseCache
Boost / https://drupal.org/project/boost
Con aumento de infraestructura:
Memcached / https://drupal.org/project/memcache
Redis / https://drupal.org/project/redis
Varnish / https://drupal.org/project/varnish
Integrando caché de usuarios:
AuthCache / https://drupal.org/project/authcache
EntityCache / https://drupal.org/project/entitycache
D7 para alto rendimiento
24. Nivel intermedio de optimización
● Reemplazar servidor Web.
● Servidore compatibles con Drupal:
●
Apache.- Opción por defecto, estable aunque con mayor consumo de
recursos.
●
●
Nginx.- Mejor rendimiento con archivos estáticos y opción de habilitar
microcaché.
●
Microcaché permite almacenar temporalmente la página renderizada.
Lighttpd.- Funciona en modo fast-cgi consumo de recursos bajo (hay que
configurar el número de listeners de acuerdo a las características del
equipo físico).
D7 para alto rendimiento
25. Nivel intermedio de optimización
● Optimizar motor de BD
●
Problemas de bloqueos / Acceso concurrente
●
Bloqueo a nivel de fila
●
Bloqueo de tablas
●
Índices lentos
●
Búsquedas secuenciales
●
Fragmentación
●
Limitación de rendimiento en vistas complejas o con migración de
información de sistemas legados.
● Casos específicos:
●
MySQL .- problemas en consultas que necesitan índices inversos (soporte
experimental)
●
PostgreSQL.- Soporte limitado dependiendo de los proveedores de
hosting.
D7 para alto rendimiento
26. Motores de base de datos
Estándar:
o Mysql
o PostgreSQL
Versiones modificadas:
o MariaDB
o Percona SQL
Otras opciones:
o MongoDB (NoSQL)
D7 para alto rendimiento
27. Nivel intermedio de optimización
● Optimizar rendimiento de módulos
●
Se aplica para módulos propios o contribuidos
●
Estadísticas de New Relic sirven de apoyo
● En módulos propios ver qué elementos pueden aprovechar el uso de caché.
● Revisar tipo de consultas que se realizan y cómo pueden mejorarse.
● Reducir en lo posible el acceso a BD.
● En el caso específico de MySQL se puede exponer datos a través de vistas
(SQL) para forzar el uso de índices y reducir el tiempo de ejecución de las
consultas.
●
Ej: Consulta normal a través de vistas de los 5 últimos nodos ordenados
por fecha de manera descendente de un total de 40,000 nodos: ~3 segs
●
Utilizando los datos expuestos de los nodos a través de una vista SQL
para la misma consulta: ~0.05 segs
●
Sólo se expone los datos de los nodos, el resto se mantiene.
D7 para alto rendimiento
28. Nivel avanzado de optimización
● Integrar sistema de caché con reglas
●
Controlar en qué momento se hace modificaciones sobre los “bins”.
●
Actualizar el caché basado en acciones, no en tiempo.
●
https://drupal.org/project/cache_actions
● Caché de vistas persistente en el tiempo:
●
Views Content Cache
●
https://drupal.org/project/views_content_cache
● Establecer caché para paneles en base a un hash
●
Panels Hash Cache
●
https://drupal.org/project/panels_hash_cache
D7 para alto rendimiento
29. Búsquedas con Apache Solr
• Uno de las áreas más explotadas de un sitio web
Búsqueda de contenidos.
La búsqueda en base de datos es costosa.
Consume un alto porcentaje de CPU y memoria.
Bloquea la respuesta del webserver hasta obtener respuesta de la BD.
El caché de usuarios anónimos es pobre o ineficiente.
●
•
•
•
•
• Apache Solr es un motor de búsqueda configurable.
●
●
●
●
●
Se integra fácilmente con Drupal
Podemos personalizar los resultados.
Eliminamos la carga de búsqueda a la BD.
Se puede hacer uso de facets para filtrar los resultados de búsquedas
Permite exponer contenidos “relacionados”
● https://drupal.org/project/apachesolr
D7 para alto rendimiento
30. Nivel avanzado de optimización
● Varnish 3.0 es la opción más utilizada (no es la única).
● Permite reducir el número de hits que llegan al servidor web.
● Maneja archivos de scripting para evaluar cómo se debe manejar las
solicitudes.
● Permite hacer balanceo de carga entre múltiples servidores.
● Podemos configurar un “fallback” en caso de que el pool de servidores
web no responda.
● Puede alterar las cabeceras de respuesta para eliminar o agregar
elementos.
● Se puede integrar con reglas y el módulo expire:
● https://drupal.org/project/expire
• Permite integrarse con ESI para generar contenido dinámico.
D7 para alto rendimiento
31. ¿Qué es ESI?
● Edge Side Includes (http://en.wikipedia.org/wiki/Edge_Side_Includes)
● Generación de contenido dinámico en base a páginas estáticas.
● Se integra con Varnish, Akamai, Squid y NginX
Módulo de Drupal
●
https://drupal.org/project/esi
● Permite integrar contenido dinámico para usuarios logueados
disminuyendo el consumo de recursos.
●
D7 para alto rendimiento
32. Nivel avanzado de optimización
● Integración de CDN
●
Se elimina completamente los hits al servidor para archivos estáticos.
● Redes CDN comerciales:
●
Akamai
●
Amazon
●
Cloudflare
●
Rackspace
● CDN Falso
●
Enlace de comunicación separado para ese servidor
●
Reduce el costo inicial de la infraestructura.
●
Distribuye parte del contenido
●
Soporta los métodos Pull y Request
● Se utiliza la aplicación FileConveyor para distribución de contenido y el
módulo CDN para actualizar rutas:
●
https://drupal.org/project/cdn
D7 para alto rendimiento
34. Cloudflare (Opcional)
• CDN.- Content Delivery Network
Distribuye copias del contenido estático dentro de su red (javascript,
imágenes, css).
● Tiene servidores distribuidos dentro de diferentes zonas geográficas.
● Opción de optimizar el contenido
● Minimizar js, css.
Firewall de aplicación (Servicio Pro)
Proxy inverso
Protección contra ataques.
Se puede integrar por medio de un módulo de Drupal:
● https://drupal.org/project/cloudflare
● Utilizando reglas se puede forzar la limpieza del caché de archivos de
cloudflare.
●
•
•
•
•
D7 para alto rendimiento
35. Mahout (Opcional)
• Permite hacer el cálculo de recomendaciones en base a matrices.
• El procesamiento se hace fuera del servidor web.
• Actualiza tablas en Drupal para poder obtener información como:
●
●
●
¿Qué vieron otros usuarios?
Nodos similares
●
Por usuario
●
Por rol
●
Por historial de navegación
●
Por banderas “flags”
Venta cruzada
D7 para alto rendimiento