Blog de Amazon Web Services (AWS)
Amazon ElastiCache para optimización de arquitecturas hibridas y bases de datos
Por Angel Leon, World Wide Public Sector Solutions Architect.
La nube de AWS cuenta una amplia presencia global, misma que es utilizada por nuestros clientes alrededor del mundo para crear aplicaciones con presencia en mercados internacionales. Además de la presencia global al utilizar la nube de AWS obtienen agilidad, ahorro de costos, elasticidad y una amplia gama de servicios que simplifican la implementación de sus plataformas y servicios.
Es por estas razones que cada vez mas clientes consideran habilitar sus cargas de trabajo en la nube de AWS, sin embargo, en ocasiones la integración con aplicaciones legadas o el uso de licenciamientos restrictivos dificultan esta actividad. Para estos casos, una actividad común es implementar una arquitectura hibrida que permita integrar las oficinas del cliente con la nube de AWS de forma que se vea como una extensión de su red.
Con AWS Direct Connect se puede habilitar una conexión desde sus oficinas hacía la nube de AWS o bien, se puede configurar una VPN IPSec dentro de su Virtual Private Cloud (VPC).
Situación
Durante la revisión de la arquitectura de un cliente que reportaba tener una elevada latencia entre su arquitectura en AWS y su base de datos local, se identifico que el servicio responsable de la elevada latencia era su base de datos y no precisamente por la distancia, mas bien por la gran demanda de recursos que tenía puesto que el motor de busqueda constantemente la saturaba debido al elevado número de consultas.
Esto se podría solucionar moviendo la base de datos a Amazon Relational Database Service (RDS) y habilitando instancias de solo lectura, sin embargo, el esquema de licenciamiento de su base de datos le impide moverla hacía AWS. Otra reto al moverla es la integración entre aplicación y base de datos ya que el sistema estaba en producción y no era viable reescribir la toda la aplicación a un motor de base de datos diferente, donde no tuviera restricciones de licenciamiento.
Solución
Explorando mecanismos para optimizar su operación se determino que un cache en memoria usando Amazon ElastiCache sería un excelente mecanismo para reducir la carga de su base de datos, esto también ayudaría a mejorar los tiempos de respuesta puesto que el cache se encontraría dentro de la VPC y no tendría que ir constantemente desde AWS hacía su centro de datos local. Esto brindaría una mejora en la experiencia para el usuario final.
A continuación se puede ver la arquitectura propuesta:
Amazon ElastiCache
Amazon ElastiCache es un servicio web que facilita la implementación, el funcionamiento y el escalado de una caché o almacén de datos en memoria en la nube. El servicio mejora el desempeño de las aplicaciones web, lo que le permite recuperar información de almacenes de datos en memoria rápidos y administrados en lugar de depender totalmente de bases de datos basadas en disco más lentas. Amazon ElastiCache admite dos motores en memoria de código abierto:
· Redis – servicio rápido de caché y almacén de datos en memoria de código abierto Amazon ElastiCache para Redis es un servicio en memoria compatible con Redis que proporciona la facilidad de uso y potencia de Redis con la disponibilidad, la fiabilidad y el desempeño necesarios para las aplicaciones más exigentes. Hay disponibles tanto clústeres de un nodo como de 15 particiones, lo que permite escalar hasta los 3,55 TiB de datos en memoria. ElastiCache para Redis es un servicio totalmente gestionado, escalable y seguro, por lo que resulta ideal para casos de uso de gran desempeño, como aplicaciones web y móviles, juegos, tecnología publicitaria e IoT.
· Memcached – Un sistema de almacenamiento en caché de objetos de memoria con un uso bastante generalizado. ElastiCache es un protocolo compatible con Memcached, por lo que las herramientas populares que utilice actualmente con los entornos de Memcached existentes funcionarán a la perfección con el servicio.
Amazon ElastiCache detecta y reemplaza automáticamente los nodos erróneos, de tal modo que reduce la sobrecarga asociada a las infraestructuras de autoadministración y proporciona un sistema resistente que reduce el riesgo de bases de datos sobrecargadas, que ralentizan los tiempos de carga del sitio web y la aplicación. A través de su integración con Amazon CloudWatch, Amazon ElastiCache proporciona una mejor visibilidad de las métricas de desempeño clave asociadas con sus nodos de Memcached o Redis.
Con Amazon ElastiCache, puede añadir una capa en memoria a su infraestructura en cuestión de minutos utilizando la consola de administración de AWS.
Implementación de Amazon ElastiCache
Para activar el cluster Amazon ElastiCache, solo se tienen que seguir los siguientes pasos:
Loguearse en la consola de aws y activar el boton “Get Started Now” tal y como se ve en la imagen.
Al momento de activar nuestro cluster de Amazon ElastiCache tenemos dos motores a elegir, Memcached y Redis.
Memcached es un sistema de cache de objetos en memoria de alto rendimiento, diseñado para acelerar aplicaciones web dinámicas. Algunos ejemplos de integración son Drupal, WordPress, Joomla, etc.
Redis es un almacen de datos estructurados en memoria, cache y broker de mensajes. Amazon ElastiCache for Redis ofrece Multi-AZ con Auto-Failover y una robustes mejorada. También puede ser utilizado en aplicaciones como Drupal, WordPress, Joomla, etc.
Para esta arquitectura utilizaremos el motor Redis. Aunque en este post no exploraremos el modo Cluster, es importante mencionar que se utiliza para habilitar el crecimiento horizontal mediante nodos adicionales.
En este paso seleccionamos el tipo de nodo que esta asociado directamente con la cantidad de memoria ram para almacenamiento que se tendrá, la versión de Redis en caso de que tuvieramos un cliente viejo así como el número de nodos de nuestro cluster.
Configuración de datos avanzados, nos permite especificar la VPC, el multi-az failover provee alta disponibilidad mediante failover automático hacía una replica de lectura en caso de fallo del nodo primario.
Se dejará el valor «Prefered availability zone(s)» como «No preference», de esta forma Amazon ElastiCache repartira los nodos del cluster Redis entre varias zonas de disponibilidad.
Desde este apartado se puede seleccionar el SecurityGroup desde el cual nos conectaremos a nuestro Cluster Redis, un tema importante para mantener nuestro cluster controlado y seguro.
El siguiente paso es escoger los valores para la ventana de respaldo de las replicas de nuestro Cluster, aquí podemos seleccionar el periodo de retención de los respaldos así como la hora en que se realizarán.
Para terminar la creación del cluster, podemos modificar la ventana de mantenimiento en que se realizarán las actividades de mantenimiento, estas son la aplicación de parches en el software o la aplicación de cambios pendientes como hacer un resize del cluster o cambiar el periodo de retención de los respaldos.
También, podemos habilitar que se envien notificaciones cuando se realiza la ventana de mantenimiento, para esto seleccionamos el “Amazon Simple Notification Service (SNS) topic” a utilizar o bien, crearemos uno nuevo con nuestra dirección de correo electrónico.
Y creamos el cluster, a continuación se puede ver la imagen del proceso de creación del cluster.
Después de algunos minutos el cluster estará listo para que lo utilicemos. En la siguiente imagen se puede ver que el cluster listo para usarse, también se puede ver el endpoint o la dirección a la que tenemos que conectarnos para utilizar el cluster junto con los demás detalles.
Integración con la aplicación
El siguiente paso es integrarlo con la aplicación, a continuación se muestra un ejemplo de código en PHP que permite cachear el resultado de la base de datos en nuestro cluster redis:
<?php
// creación del objeto Redis
$redis_endpoint = 'redis-cluster.XXXXX.use1.cache.amazonaws.com';
$redis_port = 6379;
$redis = new Redis();
$redis->connect($redis_endpoint, $redis_port);
// consulta sobre la base de datos relacional
$query = sprintf("SELECT name, email, preferences FROM table WHERE id = 'ID'");
$query_key = sha256($query);
// comprobamos el cache antes de consultar la base de datos
$cache_result = $redis->get($query_key);
if ($cache_result !== null) {
// como el resultado esta en el cache, lo regresamos SIN consultar en la base de datos
return $cache_result;
} else {
// como la información no estaba en cache, hacemos la consulta a la base de datos
// y guardamos el resultado en el cache, se asume que el valor devuelto por $db->query()
// es una cadena de texto.
$result = $db->query($query);
$redis->set($query_key, $result);
return $result;
}
?>
Es importante mencionar que para esta integración se necesita habilitar un cliente redis en nuestra instalación de PHP, en la pagina de Redis se tiene un apartado de clientes para varios lenguajes incluido php.
Costos
Amazon ElastiCahe permite pagar por la capacidad de memoria por hora mientras que el o los nodos estén activos, sin compromisos de largo plazo.
Se pueden ver los detalles del esquema de cobro en la siguiente pagina:
https://thinkwithwp.com/elasticache/pricing/
También contamos con un esquema de nodos reservados que permite obtener descuentos significativos sobre el precio por hora de uso de los nodos que reserve. Por favor consulte nuestra pagina de precios para mayor información.
Clientes utilizando Amazon ElastiCache
Duolingo
https://thinkwithwp.com/solutions/case-studies/duolingo-case-study-dynamodb/
Expedia
Hudl
https://thinkwithwp.com/blogs/database/caching-hudls-news-feed-with-amazon-elasticache-for-redis/
Conclusión
En este post se exploró el uso de Amazon ElastiCache para reducir la carga en una base de datos local, sin embargo, los siguientes usos son bastante comunes:
· Reducción de latencia en arquitecturas hibridas donde la base de datos se encuentra en el centro de datos local
· Reducción de la carga en las bases de datos
· Optimización de paginas web dinámicas y reducción de procesamiento en servidores e instancias
· Caches de datos, por ejemplo, preferencias de usuarios
· Almacenamiento de sesiones, por ejemplo, sitios web