Infinispan – Grid de Dados

infinispan-banner

Aplicações Enterprise estão se deparando com grandes volumes de dados, e a dificuldade ainda aumenta quando falamos em escalabilidade. Grids de dados são geralmente usados para garantir baixa latência, alta disponibilidade, cache elástico de dados, muitas vezes como soluções NoSQL.

Infinispan é uma plataforma de grid de dados open source altamente escalável, que fornece características como eviction e expiration, persistência, JTA e transações compatíveis com XA, monitoramento via JMX, tudo empacotado em um container de dados concorrente customizado para CPUs multi-core.

Benefícios

  • Conjunto grande de dados: sua principal função é ler e distribuir dados grandes volumes de dados entre nós de uma rede, formando um cluster;
  • Heterogêneo: no ponto de vista software e hardware;
  • Escalabilidade: otimizado para escalar em ambientes que produzem grandes volumes de dados;

Escopos

Enquanto o seu antecessor JBoss Cache era focado em implementar uma simplória biblioteca de cache clusterizado, Infinispan fornece uma platforma de grid de dados com ferramenta de gerenciamento e capacidade de escalamento de milhares de nós.

Java Specification Request (JSR-107)

Cache: Local onde escrevemos dados que foram difíceis de serem calculados/resgatados ou caros para serem resgastados da memória. Assim, desenvolvedores costumam guardar seus itens em estrutura simplórias como Hashtables e ArrayLists, que utilizam a memória.

Para ambientes distribuídos, foi criada a interface javax.cache.Cache que pode ser manipulada pelo CacheManager, que representa uma coleção de caches.

Modos de Operação

1) Replicação

Todos os nós do cluster guardam cópias de todos os itens. Isto provê alta disponibilidade e escalabilidade eficiente ao ler dados, os quais estão replicados entre todos os membros do cluster. Por este motivo não escala tão bem em escritas. Entretando este problema pode ser mitigado configurando o uso de UDP multicast, o qual é capaz de enviar via broadcasting um único update para todos membros do cluster.

  • Replicação assíncrona: é mais rápida que a replicação síncrona (que requer ACK de todos os nós do cluster), porém não há garantia que a mudança ocorrida foi propagada por todos os membros do cluster. Vantagem: fila de replicação, a qual empacota as atualizações em um lote e as replica periodicamente baseado num intervalo de tempo ou quando o tamanho da fila exceder um tamanho definido. Portanto oferece um desempenho mais elevado executando em segundo plano.
  • Replicação síncrona: garante que todo os membros do cluster foram atualizados com sucesso, pois requer ACK de todos eles.

2) Distribuição

Um número fixo de cópias são mantidos para garantir redundância e tolerância a falhas, fornecendo um maior grau de escalabilidade. Este modo se beneficia de escalabilidade linear para escritas e performance estável para leituras. Este modo é o padrão para ambiente clusterizado.

É possível melhorar ainda mais a performance de leitura de dados no modo distributed utilizando o mecanismo L1 cache. Utiliza um consistente algoritmo hash para determinar onde no cluster os itens devem estar e quantas cópias de cada pedaço de dado deve ser mantido no cluster.

3) Invalidação

Não compartilha nenhum dado. É utilizado para remover dados obsoletos de caches remotos. Neste modo o cluster irá se comportar como se tivesse diversos caches locais com capacidade de ouvir a rede invalidando os dados a cada modificação remota que ocorrer.

Benefícios:

  • Tráfego de rede é minimizado, pois mensagens de invalidação são bem menores comparadas às mensagens de atualização que ocorrem no modo de replicação.
  • Os outros caches do cluster procuram por dados modificados utilizando uma maneira preguiçosa, somente quando necessário. Invalidação em cluster é recomendada quando Infinispan é usado como cache de segundo nível para Hibernate.

4) Cache Local

Embora Infinispan tenha um potencial maior em um ambiente distribuído, ele é extremamente útil quando utilizado como um cache local. Nesta aborgadem os dados são armazenados somente no nó local.

Comunicação Síncrona e Assíncrona

Há também a possibilidade adicionar/remover itens do cache assíncronamente utilizando a API non-blocking nos seguintes modos: Replicação, Distribuição e Invalidação.

Formas de Deployment

1) Remote Client-Server

Em algumas situações não é possível que as instâncias do Infinispan residam na mesma JVM da sua aplicação, por exemplo, quando existem clientes .NET ou C++ acessando Infinispan como server remoto.

Remote Cliente-Server fornece um servidor gerenciado, clusterizado e distribuído, que poderá ser acessado remotamente através de Hot Rod, memcached ou API Rest. Neste modo a aplicação não está na mesma JVM do Infinispan.

Protocolos (remote cliente-server)

Hot Rod: protocolo TCP binário para comunicação com o cluster Infinispan remoto. Extremamente rápido, permite load balancing, failover e operações de localização de dados.

Permite que o server converse com os clientes. Se a sua aplicação cliente está conversando com um conjunto de servidores, e a topologia muda (por exemplo, um novo nó adicionado/removido), os servidores podem sinalizar a mudança aos clientes.

Memcached: protocolo que permite a conexão a um daemon memchached non-clustered. Ideal para diminuir o tempo de leitura data sources externos. Utilizado por Twitter e Facebook.

Clientes conseguem se comunicar com o server, porém o server não consegue se comunicar com os clientes, sendo tratado como um servidor burro (Single server daemon).

Rest: Este tipo de interface é entregada através de um arquivo WAR que pode ser deployado em um Servlet container. É uma opção para clientes non-Java ou clientes que utilizam HTTP como mecanismo de transporte para utilização do grid de dados.

2)  Library (embedded mode/p2p)

Fornece acesso local ao um nó de um cluster distribuído. A aplicação terá acesso ao grid de dados dentro da máquina virtual onde se encontra o container. JBoss AS 7 ou Tomcat 7 podem ser utilizados. Neste modo de deployment alguns jars são embutidos na aplicação, onde as instâncias do Infinispan são inicializadas programaticamente.

Gerenciamento Infinispan

Gerenciamento dos nós do Infinispan pode ser feito com a ajuda dos seguintes recursos:

  • JConsole
  • RHQ através de um agente instalado na máquina onde se encontra os membros Infinispan

Transporte

Estende JGroups que garante a comunicação entre os membros do cluster e a descoberta de novos/inválidos membros. A descoberta dos membros do cluster pode acontecer via:

  • UDP: quando o número de membros passa de 100 e está se utilizando o Infinispan como replication e invalidation. Esta opção vem configurada por padrão. 
  • TCP: quando o número de membros é menor que 100 e está se utilizando distribuição de dados. Nesta opção de configuração a descoberta dos membros ainda é feita via UDP, porém o transporte acontece via TCP.
  • EC2: como o multicast não é permitido na Amazon EC2, esta opção utiliza TCP como transporte e S3_PING para descoberta.

Obs: Vale lembrar que a escolha de uma das opções depende de muitas variáveis como características de rede, tamanho e tipo de dados.

Eviction e Expiration

Quando utilizamos estruturas para guardar dados em memória, como por exemplo objetos Java do tipo Map, os dados continuarão em memória para sempre a menos que uma remoção manual aconteça. Com Infinispan existem dois mecanismos para controle de uso de memória: eviction e expiration. Algumas configurações como maxEntries, maximum idle time e lifespan podem ser utilizadas para gerenciar a permanência de itens da memória.

Exemplo:

<namedCache name="evictionCache">
 <eviction
 maxEntries="2000"
 strategy="LRU"/>

Com configuração acima, somente 2000 itens serão mantidos em memória, caso sejam adicionados outros será utilizada a estratégica LRU (Last Recently User) que descarta os primeiros itens menos utilizados recentemente.

Obs: A mesma configuração demonstrada via XML pode ser feita programaticamente. É possível a utilização das duas concomitantemente. Neste caso, a API sobrescreve a configuração XML estática.

Transações

Infinispan é um recurso XA totalmente compatível com JTA, que utiliza um gerenciador de transações para operações distribuídas. Se a transação tiver sucesso o commit acontece, senão o rollback garante que os dados do sistema permaneçam inalterados.

Nos seguintes posts ensinarei como utilizar o Infinispan com alguns casos de uso.



Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s