Mi granito de java: Infinispan

jueves, 16 de junio de 2011

Infinispan

Infinispan es una plataforma open source de manejo de Cache. Es similar a otras herramientas conocidas en el mercado como EHCache, JBoss Cache o Coherence.
Cabe aclarar que siendo una herramienta de Jboss, no es una improvisación, sino que el proyecto creció nutriendose de la experienca de JBoss Cache. De todas maneras, son herramientas diferentes, sin relación alguna. La gran diferencia entre ambas es que Jboss Cache es una librería y infinispan es una plataforma mucho mas completa, con herramientas GUI y posibilidad de distribuirla en miles de servidores/nodos.
Se puede bajar de: http://www.jboss.org/infinispan.

Sus características son:
  • Memoria masiva y alta disponibilidad: si bien es posible utilizar infinispan de manera local, su fuerte es el trabajo distribuìdo. No sólo se limita a que cada servidor es una copia de otro (como Jboss Cache), también es posible realizar realizar una distribución de la información en los diferentes servidores.
  • Escalabilidad: dado que es una plataforma distribuida es muy simple lograr que sea escalable. Se puede acoplar tantas instancias como se deseen y no existe impedimento hasta donde se quiera crecer con la capacidad del Cache.
  • Datos distribuidos: su algoritmo de hashing permite que sus datos distribuidos se recuperen de manera veloz y sin generar tráfico en la red.
  • Persistencia: posee varias formas para guardar los datos en el disco duro, que van desde JDBC hasta archivos planos.
  • Lenguajes varios: no sólo es posible trabajar con Java, también es posible utilizar varios lenguajes más como PHP, Python, Ruby, C, etc.
  • Administración: es simple de administrar y posee herramientas GUI para realizar estadísticas.

Configuración del Cache.

Es posible realizar una configuración declarativa, basada en XML o bien a nivel programación. Por otro lado, se puede configurar como default o Global, siendo esta última un cache compartido entre varias instancias.
Si se tiene una configuración previa con otra herramienta de cache, existen scripts que automatizan la migración hacia infinispan desde:
  • EHCache 1.x
  • JBoss Cache 3.x
  • Coherence 3.x

Tiene muchas facilidades para lockear objetos, sincronizar el cache, limpiarlo o hasta indexarlo de diversas formas. Es altamente configurable.


Ejemplo.



Cache Loaders

Un Cache Loader es la conexión que se mantiene contra una herramienta de persistencia de datos. Dicho loader es el encargado de guardar los datos para su posterior persistencia y obtener los datos cuando estos no se encuentren en el cache.
Infinispan posee muchas formas de configuración de cache loaders, de hecho, se puede configurar más de uno al mismo tiempo para que trabajen en cadena. Asimismo, se puede configurar algunos items como Cache Passivation, Eviction, Pool de Conexiones, etc.
Se ofrecen diversos tipos de cache loaders como File System, JDBC (soporta JTA), Hibernate, Cloud cache loader, Remote cache loader y Cassandra cache loader.

Módulos de servidor para Infinispan.


Apartir de la version 4.1 se agrego la posibilidad de usar Infinispan en el modo cliente-servidor, lo cual permite levantar unicamente servidores de Infinispan de manera muy rapida. Esto es por la creacion de distintos modulos de servidor y distintos clientes para estos, permitiendo usar un esquema de acceso como el siguiente (el gráfico lo saque de la página oficial):




Tipos de servidor


Los tipos de servidores se diferencian en el protocolo de comunicación y como manejan las conexiones entrantes.

REST:
  • Distribuído como un archivo WAR, que puede ser deployado en cualquier servlet container permitiendo el acceso a Infinispan vía RESTful interface.
  • Para poder conectarse se puede usar cualquier cliente HTTP.
  • Este módulo es recomendado para entornos donde el puerto HTTP es el único método de acceso permitido entre clientes y servidores.
  • Los clientes de quieran equilibrar la carga o tolerancia a fallas (failover) entre los diferentes REST servers pueden usar culquier HTTP load balancer standard como mod_cluster.

Memcached:
  • Es una implementacion de Memcached text protocol respaldado por Infinispan.
  • Para conectarse se puede usar cualquiera de los Memcached client.
  • A diferencia de los Memcached servers, los Memcached servers basados en Infinispan se los puede poner en cluster y por lo tanto distribuir o replicar informacion usando algoritmos hash. Entonces este modulo es interesante para usuarios que quieran proveer failover de la informacion en Memcaches servers.
  • Algunos clientes soportan load balance y failover pasandoles una lista estatica de direcciones de servidores (perl's Cache::Memcached por ejemplo) pero para agregarle o sacarle algun servidor se tiene que hacer manualmente. 

Hot Rod
  • Hot Rod server es una implementacion de Hot Rod Protocol respaldado por Infinispan que permite a los clientes hacer dynamic load balancing, failover y smart routing.
  • Las opciones de Java Hot Rod client son un poco limitadas debido a su implementacion.
  • Es ideal para clientes que se ejecutan en java, ya que el cliente provee dynamic load balancing y failover. Esto significa que los Hot Rod clients puede detectar dinámicamente cambios en la topología de los Hot Rod servers mientras esten como cluster, entonces cuando nuevos nodos que se unen o se quitan, los clientes actualizan la vista de la topología de los Hot Rod servers. Y cuando los Hot Rod servers son configurados en modo distribución, los clientes pueden detectar donde reside una key en particular y pueden enrutar los pedidos de forma inteligente.
  • Load balancing y failover es dinámicamente proporcionado por el cliente usando la información que le provee el server.

WebSocket

  • Infinispan WebSocket Server permite usar Infinispan sobre un Websocket
  • Este modulo esta específicamente desarrollado para clientes Javascript.
  • Este modulo es particularmente adecuado para desarrolladores que quieran acceder alas instancias de Infinispan desde código Javascript.
  • Los websockets trabajan en el mismo puerto HTTP, se puede usar cualqueir HTTP load balancer.


Modos de clusterización.

Infinispan puede ser configurado como local o cluster. Si es en modo cluster, el cache puede ser configurado para replicar los cambios en todos los nodos, para invalidar cambios en los nodos y finalmente ser usado en modo distribuído (los cambios de estado son replicados en un pequeño grupo de nodos suficientes como para ser tolerante a fallos pero no en muchos nodos para prevenir la escalabilidad). Estas configuraciones suelen ser muy sencillas.

Los distintos modos de clusterización son:

1) Modo Local
  • Permite tener los datos en memoria como JBoss Cache y EHCache. Algunas de las caracteristicas que ofrece:
  • Mantener los datos en memoria para después persistirlos, ejemplo: cache level-2 para Hibernate.
  • Eliminar objetos para evitar quedarse sin memoria.
  • Vencimiento de objetos en cache.
  • Fue pensado para lograr un alto rendimiento en entornos multi-CPU/multi-core.
2) Modo replicación
  • Es un simple modo de clusterización donde cada instancia de cache descubre otras instacias de cache (en distintas JVM) dentro de la red local y formar un cluster. Las entradas que se agregan al cache en cualquiera de las instancias son replicadas a todas las instancias del cluster y pueden ser obtenidas localmente desde cualquier instancia. Este modo permite una manera rápida de compartir estados a través del cluster, pero este modo solo es performante en cluster pequeños (por debajo de los 10 servers), debido a la cantidad de replicaciones que debe hacer.
  • Este modo puede ser sincrónico o asincrónico. El sincrónico bloquea la llamada (ejemplo: put()) hasta que se replica en todos los nodos. En cambio el asincrónico es mas rapido debido a que no hace falta que se replique inmediatamente en todos los nodos, por los tanto no produce bloqueos de ningun tipo. El asincrónico va a replicar en determinados intervalos de tiempo, cuando se llene la cola de elementos o una combinacion de estos.
3) Modo invalidación
  • Este modo no comparte información. Lo que hace es borrar información que puede ser vieja desde caches remotos. Usar este modo solo tiene sentido si se tiene respaldo de la información como una base de datos.
  • Es usado para tener un acceso rapido a datos sin tener que acceder a la base cada vez que se soliciten estos. Se suele usar con cache loaders, puede ser sincrónico o asincrónico.

4) Modo distribuído
  • Este es un modo poderoso que permite a Infinispan escalar linealmente a medida que se agregan mas servers al cluster. La distribucion hace el uso de un algoritmo hash consistente que determina donde deben ser almacenadas las entradas dentro del cluster.
  • El numero de copias que mantiene en el cluster es un equilibrio entre la performance y la durabilidad de la información.

5) Hot Rod Client

Hot Rod es un protocolo binario para la comunicación con el cluster. Este es sencillo de usar, pero posee ventajas y desventajas comparado con el resto de los clientes para los otros modulos.

Ventajas:
  • Sencillo uso a traves de su API.
  • Configuración simple.
  • Es inteligente.
  • Para que funcione solo se debe conocer la ip y puerto de nodo.
  • Maneja el pool de conexiones.
  • Posee estrategias para el balance entre nodos.
  • Detecta la topologia de la red y si esta fue modificada (cuando se agregan o quietan nodos).
  • Detecta automaticamente todos los nodos del cluster solo configurandole con una ip de estos. Conoce la distribución de las keys en los nodos lo cual baja la carga de trabajo de estos.

Desventajas:
  • Solo soporta comunicación TCP.
  • No soporta queries en el cache.
  • No soporta las estadísticas.
Este post lo he adaptado de un informe que he realizado junto con Guillermo Kessler.