Banco de dados em memória não relacionais

A popularidade dos bancos de dados não relacionais, também conhecidos como NoSQL aumentou muito nos últimos anos devido à necessidade de  processar uma grande quantidade de dados mais rapidamente do que os sistemas de gerenciamento de banco de dados relacional, aproveitando a arquitetura altamente escalável, baixa latência e alta performance. Apesar de o uso de memória não ser o melhor critério para avaliar o desempenho de algoritmos, uma vez que a maioria desses bancos de dados sirvam dados diretamente da memória, o uso da memória também é ao longo do tempo necessário para concluir cada operação no documento para revelar qual deles usa a memória de forma mais eficiente . Atualmente, existem mais de duas centenas de bancos de dados NoSQL que fornecem recursos e características diferentes. Por isso, é necessário revelar qual deles oferece melhor desempenho para diferentes operações de dados. Neste artigo, falaremos dos principais bancos de dados da atualidade para medir os respectivos desempenhos em termos de tempo de execução e eficiência de uso da memória durante as operações.

Introdução

As principais razões por trás do armazenamento dos dados como o coração dos sistemas de software corporativo podem ser listados como: – a parte mais importante dos softwares que determina a rapidez com que um aplicativo responde a uma solicitação e; – segurança contra perdas de dados. Até o surgimento dos bancos de dados NoSQL, os sistemas de gerenciamento de banco de dados relacional RDMS eram o único e exclusivo remédio. No entanto, com o crescimento constante dos dados armazenados, as limitações dos sistemas de gerenciamento de bancos de dados relacionais, como escalabilidade e armazenamento, perda de eficiência devido ao grande volume de dados e armazenamento e gerenciamento de bancos de dados maiores tornam-se desafiadores. Considerando que hoje existam centenas de soluções NoSQL que fornecem recursos e características diferentes. Os bancos de dados NoSQL são mais escalonáveis ​​horizontalmente e flexíveis quando comparados com os RDMS. Quando se trata de processar grandes quantidades de dados rapidamente aproveitando a estrutura de dados sem esquemas e a arquitetura distribuída, os bancos de dados NoSQL são preferidos em vez de RDMS. Além disso, o desempenho do RDMS diminui com o aumento no tamanho dos dados, o que causa problemas de impasses e simultaneidade. Embora o RDMS dependa do modelo de consistência ACID (Atomicity, Consistency, Isolation, Durability) que garante que todas as transações sejam corretamente confirmadas e não corrompam o banco de dados, portanto consistentes, os bancos de dados NoSQL são baseados em BASE (Basically Available, Soft-state, Eventualmente Consistente) para obter escalabilidade, alta disponibilidade e alto desempenho. Bancos de dados NoSQL servem os dados a partir da memória volátil (RAM) em vez de memória não volátil (isto é, disco rígido) para aumentar a velocidade de consulta, pois o acesso a dados de entrada/saída é um grande gargalo ainda que com dispositivos de armazenamento SSD.

Bancos de Dados NoSQL

Os bancos de dados NoSQL podem ser categorizados em quatro classes de acordo com diferentes otimizações:

  • Armazenamento de chave-valor: os dados são armazenados como pares de chave-valor. Essa estrutura de dados também é conhecida como “tabela de hash”, na qual os dados são recuperados por chaves. Os exemplos mais conhecidos de armazenamentos de chave-valor são Redis e Memcached;
  • Armazenamento de documentos: os dados são armazenados em coleções que contêm pares de chave-valor que encapsulam pares de chave-valor em JSON ou JSON como documentos. Os exemplos mais conhecidos de armazenamentos de documentos são o MongoDB, CouchDB. Como os valores não são opacos para o sistema, os dados podem ser consultados tanto por valores quanto por chaves;
  • Família de colunas: Os dados são armazenados como um conjunto de linhas e colunas, onde as colunas são agrupadas de acordo com a relação de dados. Os exemplos mais conhecidos de armazenamentos de documentos são Cassandra e HBase;
  • Banco de dados de gráficos: esse tipo de banco de dados é melhor usado para representar dados na forma de gráfico. O exemplo mais conhecido de bancos de dados de gráficos é o Neo4j.

Alguns Dados Experimentais

Os bancos de dados em memória experimentados neste documento estão listados na tabela abaixo com seus modelos e versões de banco de dados. Existe pelo menos um banco de dados de cada categoria de banco de dados NoSQL, bancos de dados de gráficos não podem ser comparados com outros bancos de dados NoSQL usando os mesmos experimentos. Portanto, os resultados experimentais revelam o efeito do modelo de banco de dados no desempenho do banco de dados:

tabela dbs

A partir de uma aplicação proprietária medimos o desempenho de bancos de dados em alguns experimentos. O tempo de execução por operação é registrado determinando a hora do sistema no início e no final do método usando a classe java.lang.System. Da mesma forma, a memória consumida por operação é registrada determinando a memória livre em bytes no início e no final do método usando a classe java.lang.Runtime, que permite que os aplicativos Java façam interface com o ambiente que eles executam. Durante os experimentos, todos os outros processos do sistema operacional (exceto os obrigatórios) são interrompidos, a fim de revelar o desempenho único dos bancos de dados. Todos os experimentos são avaliados na mesma máquina cujas especificações estão descritas abaixo:

server-teste

Resultados e Análise

O desempenho dos bancos de dados NoSQL é medido por quatro experimentos: 1-desempenho para escrever um par de chaves-valores; 2-desempenho para ler o valor correspondente a uma determinada chave; 3-desempenho para remover o par chave-valor correspondente para uma determinada chave; e 4-desempenho para obter todos os dados. Para cada experimento, o tamanho dos dados é aumentado exponencialmente para revelar como o tamanho dos dados afeta o desempenho de cada banco de dados.

Experiência 1 – desempenho para escrever um par de chaves-valores

Um serviço que gera pares aleatórios de chave-valor é implementado para medir o desempenho de gravação de bancos de dados na memória. O tempo calculado para gravar os pares de chave-valor gerados para cada banco de dados é listado na tabela abaixo (em ms). Como é mostrado no resultado, a lista de bancos de dados pode ser classificada pelo desempenho geral da operação de gravação: Memcached, Redis, Cassandra, MongoDB. Deve-se notar que há uma diferença significativa entre Memcached e MongoDB. À medida que o tamanho dos dados aumenta, as diferenças de desempenho entre os bancos de dados se tornam evidentes. O desempenho do MongoDB diminui significativamente quando o tamanho dos dados aumenta, uma vez que o MongoDB usa o mecanismo de bloqueio.

experiencia-1

Como os bancos de dados na memória servem os dados da memória, é necessário identificar a quantidade de memória que eles consomem durante as operações de gravação. A tabela abaixo (em MB) apresenta o uso de memória de cada banco de dados para operação de gravação. Como é mostrado no resultado, ao contrário do resultado do tempo decorrido, o Redis fornece o melhor desempenho quando se trata de uso eficiente da memória.

experiencia-1.2

Experiência 2 – desempenho para ler o valor correspondente a uma determinada chave

Nosso segundo experimento mede o tempo necessário e consome memória para ler o valor correspondente à chave dada. Como o resultado experimental está listado na tabela abaixo (em ms). A arquitetura do banco de dados que é sistema de gerenciamento de banco de dados relacional diminui o desempenho da operação de leitura. Como é mostrado no resultado, a lista de bancos de dados pode ser classificada pelo desempenho geral da operação de leitura: Cassandra, Redis, Memcached e MongoDB.

experiencia-2

Cassandra fornece o melhor desempenho de leitura quando se trata de uso eficiente de memória. Não há diferença significativa nos usos de memória entre outros bancos de dados.

Experiência 3 – desempenho para excluir um par de chaves-valores correspondente a uma determinada chave

Nosso terceiro experimento mede o tempo necessário para excluir os dados correspondentes a uma determinada chave. Como a tabela abaixo (em ms) resume o resultado, o Redis fornece claramente o melhor desempenho ao concluir operações em menos de 1ms, enquanto o MongoDB oferece o pior desempenho. O desempenho do Cassandra para operação de exclusão é calculado como muito semelhante ao Redis.

experiencia-3.2

Quando se trata de uso eficiente da memória, o Cassandra e o Redis oferecem melhor desempenho em comparação com outros bancos de dados na memória. Veja tabela abaixo (em MB):

experiencia-3

Experiência 4 – desempenho para buscar todos os dados

Nossa quarta experiência mede o desempenho do banco de dados ao buscar dados inteiros. Esse experimento difere do experimento 2, pois a consulta de leitura termina assim que os dados correspondentes à chave determinada são encontrados. Apesar de a chave ter sido escolhida aleatoriamente durante o experimento 2, achamos que buscar todos os dados torna essas medidas mais claras: 1-a rapidez com que o banco de dados está buscando todos os dados disponíveis; e 2-quanta memória o banco de dados consome a fim de armazenar e buscar todos os dados. Como o resultado está listado nas duas tabelas abaixo (em ms e MB respectivamente), o MongoDB fornece claramente o melhor desempenho, consumindo muito menos memória em comparação com Redis. À medida que o tamanho dos dados aumenta, a diferença de desempenho entre o MongoDB e outros torna-se evidente. O Memcached é excluído desta experiência, pois não suporta a busca de todos os dados:

experiencia-4

experiencia-4.2

De acordo com o teorema CAP (Consistência, Disponibilidade, Tolerância à Partição), que é a base dos modelos de consistência ACID e BASE, apenas duas das três garantias podem ser obtidas. Enquanto o RDMS foca principalmente na consistência, a ideia principal por trás dos bancos de dados NoSQL é dar alguma consistência a fim de fornecer mais disponibilidade, escalabilidade e alto desempenho. Outra vantagem do uso do RDMS é que, como eles usam uma linguagem comum (SQL – Structured Query Language), a migração de um sistema de gerenciamento de banco de dados relacional para outro é sempre mais possível quando comparada a bancos de dados NoSQL que possuem seu próprio conjunto de APIs para interagir os dados que eles contêm.

Conclusão

Os bancos de dados NoSQL são baseados no modelo de consistência BASE, em vez do modelo de consistência ACID, que vem com a ideia de dar alguma consistência para fornecer mais disponibilidade, escalabilidade e alto desempenho. A popularidade dos bancos de dados NoSQL – que armazenam os dados na memória – aumentou devido à necessidade de processar uma grande quantidade de dados mais rapidamente do que os sistemas de gerenciamento de banco de dados relacional, aproveitando a arquitetura altamente escalável, flexível livre de estrutura de dados e baixa latência e alto desempenho. Atualmente, existem centenas de bancos de dados NoSQL que fornecem recursos e características diferentes. Neste artigo, avaliamos pelo menos um banco de dados em memória de cada tipo: Redis e Memcached como armazenamento de valores-chave, MongoDB como armazenamento de documentos, Cassandra como família de colunas. Ao contrário dos trabalhos relacionados, juntamente com o tempo gasto para completar várias operações de dados, os usos de memória dos bancos de dados na memória também são experimentados para revelar os usos de memória de cada banco de dados. Os resultados obtidos das experiências podem ser listados como:

  • Embora o Memcached forneça claramente o melhor desempenho de gravação em termos de tempo decorrido, o Redis usa a memória com mais eficiência do que outras. O desempenho do MongoDB diminui significativamente quando o tamanho dos dados aumenta devido ao mecanismo de bloqueio do MongoDB;
  • O Redis fornece um desempenho melhor que o Memcached e o MongoDB para a operação de leitura;
  • Quando se trata de excluir um par de valores-chave correspondente a uma determinada chave, o Redis fornece claramente o melhor desempenho, enquanto o MongoDB fornece o pior desempenho. O Redis e o Cassandra consomem mais memória do que outros bancos de dados para operação de exclusão;
  • O MongoDB fornece significativamente o melhor desempenho para buscar todos os dados enquanto o Cassandra fornece o pior desempenho. Redis e MongoDB (quando os índices são criados para as consultas) servem os dados da memória enquanto o disco rígido é usado para armazenamento. Quando se trata de consumo de memória para buscar todos os dados, o MongoDB usa a memória de forma mais eficiente que outros;

Bancos de dados SQL e NoSQL fornecem características diferentes e um não pode substituir outro. Se o sistema não for flexível em termos de consistência, o sistema de gerenciamento de banco de dados relacional é a escolha certa. Se o sistema puder dar alguma consistência, os bancos de dados NoSQL podem ser uma boa escolha para fornecer mais disponibilidade, escalabilidade e alto desempenho.

Como trabalho futuro, o efeito dos tipos de documentos no desempenho de cada banco de dados pode ser experimentado. Além disso, razões de latências que são experimentadas durante os experimentos podem ser explicadas em detalhes, inspecionando suas arquiteturas. Efeito de ambientes distribuídos e paralelos no desempenho de banco de dados é outro tópico a ser examinado.

Para um futuro post falaremos sobre Apache HBase, Riak, CouchDB, Hypertable e Neo4j que são soluções que vem ganhando destaque no mercado.