Com o aumento constante da complexidade de do volume de dados das aplicações nos últimos anos houve muita inovação e muitas novas opções de banco de dados foram surgindo, ou se tornando mais populares e acessíveis do que eram antes. Em meio a tantas opções de bancos de dados é difícil escolher o melhor banco de dados para cada de uso. O objetivo desse post é te ajudar desse desafio.
No White Paper Melhores Práticas para Arquitetura em Nuvem, a AWS sugere algumas perguntas importantes que depois te respondidas podem te ajudar a entende melhor os requisitos da sua aplicação e então servirão como um guia para você escolher o melhor banco de dados.
- Sua aplicação requer mais leitura, mais escrita ou é equilibrada?
- Quantas leituras e gravações por segundo você vai precisar?
- Como esses o volume de leitura e gravação pode mudar se o número de usuários aumentar?
- Qual volume de dados você precisará armazenar e por quanto tempo?
- Com que rapidez o volume de dados deverá crescer?
- Existe um limite superior no futuro próximo?
- Qual é o tamanho de cada objeto (média, mínimo e máximo)?
- Como esses objetos serão acessados?
- Quais são os requisitos em termos de durabilidade dos dados?
- Esse armazenamento de dados será sua “fonte de verdade”? Ou é um dado replicado de outra fonte de origem?
- Quais são os seus requisitos de latência?
- Quantos usuários simultâneos você precisa suportar?
- Qual é o seu modelo de dados e como você vai consultar os dados?
- Suas consultas são de natureza relacional (por exemplo, JOINs entre várias tabelas)?
- Você pode desnormalizar seu esquema para criar estruturas de dados mais planas e mais fáceis de dimensionar?
- Precisa de controles de integridade fortes ou está procurando mais flexibilidade (por exemplo, armazenamentos de dados sem esquema)?
- Você precisa de relatórios sofisticados ou recursos de pesquisa?
- Seus desenvolvedores estão mais familiarizados com bancos de dados relacionais do que o NoSQL?
Bancos de Dados Relacionais
Os bancos de dados relacionais (RDBS/SQL) normalizam os dados em tabelas, que consistem em linhas e colunas.
Fornecem uma poderosa linguagem de consulta, recursos de indexação flexíveis, controles de integridade fortes e a capacidade de combinar dados de várias tabelas de maneira rápida e eficiente.
Na AWS você pode instalar seus bancos de dados em servidores EC2, porém, o modelo mais indicado é utilizar o RDS que é um serviço gerenciado que facilita a configuração, operação e dimensionamento de um banco de dados relacional na nuvem. Com o RDS você não vai precisar se preocupar com backups, patches, sistemas operacionais e replicação, tudo isso pode ser automatizado pelo serviço.
Como Escalar Bancos de Dados Relacionais
Os bancos de dados relacionais podem ser dimensionados verticalmente, atualizando para uma instância maior ou adicionando mais e mais rápido armazenamento.
Alguns bancos relacionais como o Amazon Aurora permite que você também dimensione horizontalmente criando uma ou mais réplicas de leitura.
As réplicas de leitura são instâncias de banco de dados separadas que são replicadas de forma assíncrona. Como resultado, eles estão sujeitos a atrasos de replicação e podem estar faltando algumas das transações mais recentes.
Nesse caso para utilizar as réplicas de leitura o aplicativo precisa considerar quais consultas têm tolerância a usar dados que podem estar um pouco desatualizados.
As réplicas de leitura também não podem aceitar alterações de dados.
Ao usar um banco de dados relacional e dimensionar sua capacidade de gravação além das restrições de uma única instância será preciso usar uma abordagem diferente chamada particionamento de dados ou fragmentação.
Nesse modelo, os dados são divididos em vários esquemas de banco de dados executando em sua própria instância. Embora o RDS torne mais fácil executar essas instâncias, o particionamento aumenta a complexidade da aplicação.
A camada de acesso a dados da aplicação precisa entender como os dados são divididos, de modo que possam direcionar as consultas para a instância correta.
Além disso, as alterações de esquema devem ser executadas em vários banco de dados, portanto, vale a pena investir para automatizar esse processo.
Alta disponibilidade com Bancos Relacionais
Para qualquer banco de dados relacional de produção, é importante ter redundância para se ser alta disponibilidade. Para isso a no RDS é possível usar o MultiAZ, que cria uma instância em espera replicada em sincronia em uma Zona de disponibilidade diferente.
Se a instância principal falhar, o RDS executa um failover automático para a outra instância sem a necessidade de intervenção manual.
Já o Amazon Aurora oferece recursos de várias instâncias mestres para permitir que as leituras e gravações sejam dimensionadas em zonas de disponibilidade diferentes e também oferece suporte à replicação entre regiões diferentes.
Bancos de Dados para DW (Data Warehouse)
Um Data Warehouse é um tipo de banco de dados relacional otimizado para análise e geração de relatórios com grandes quantidades de dados.
Geralmente é usado para combinar dados transacionais de diferentes fontes de dados (ERP, CRM, WMS, Clickstreams, e-commerce, etc.) para disponibilizá-los para análise e tomada de decisões.
Tradicionalmente, configurar, executar e dimensionar é data warehouse um trabalho complicado e muito caro. O Redshift é um serviço gerenciado de data warehouse que permite que você tenha seu DW de forma mais rápida e com menor custo.
Escalando seu DW
O Amazon Redshift oferece alto desempenho para consultas de grandes volumes de dados por meio de uma combinação de processamento paralelo (MPP), armazenamento de dados colunar e compactação de dados.
É possível escalhar aumentando o número de nós em seu cluster de data warehouse.
Outra solução muito interessante é Amazon Redshift Spectrum que permite consultas SQL do Amazon Redshift em exabytes de dados armazenados no Amazon S3 que permite extender os dados armazenados em discos locais no data warehouse para dados não estruturados, sem a necessidade de carregar ou transformar dados.
O Redshift monitora continuamente a integridade do cluster e automaticamente reproduz dados de unidades com falha e substitui os nós conforme necessário para garantir disponibilidade e segurança.
Bancos de Dados NoSQL
Os bancos de dados NoSQL ou Não Relacionais usam modelos de dados mais flexíveis e geralmente permitem escalabilidade horizontal de maneira mais simples do que os relacionais.
Alguns modelos de dados comuns usados nos bancos NoSQL são grafos, chave-valor e documentos JSON.
Alguns bancos NoSQL como é o caso do DynamoDB permitem níveis de desempenho, escalabilidade, e disponibilidade muito altos, de forma simples.
Por outro, se for necessário, fazer análise dos dados e consultas ad-hoc será preciso posteriormente extrair os dados para um banco de dados relacional como o Redshift, por exemplo.
Para a grande maioria das aplicações que precisam escalar muito os bancos de dados não relacionais se tornam ferramentas fundamentais, porém, é natural que eles não resolvam o problema de ponta a ponta e que seja preciso aliar outros bancos de dados como bancos em memória para cache (Memcached, Redis), e bancos de dados relacionais para Analytics (Oracle, Redshift).
O Amazon DynamoDB é um serviço de banco de dados NoSQL rápido e flexível para aplicativos que precisam de latência consistente de um dígito e milissegundo em qualquer escala. É um banco de dados em nuvem totalmente gerenciado e suporta modelos de armazenamento de documentos e chave-valor. Confira esse post completo sobre DynamoDB para saber mais.
A escalabilidade horizontal em bancos NoSQL geralmente acontece de maneira transparente e não precisam da lógica de particionamento de dados implementada na camada de acesso a dados da sua aplicação (diferente do que acontece com bancos relacionais).
Bancos de Dados para Pesquisas
Muitas aplicações precisam de funcionalidades que permitem que os usuários façam buscar textuais, ou encontrem elementos por contexto, levando tem conta a intenção do usuário e não necessariamente uma combinação exata do que foi buscado com o que está sendo encontrado. Assim como quando você faz uma busca no Google, ou no Facebook, por exemplo.
Um serviço de pesquisa pode ser usado para indexar e pesquisar o formato de texto livre e estruturado e geralmente suporta funcionalidades que não estão disponíveis em outros bancos de dados, como classificação de resultados (rankings), buscas facetadas, sinônimos, interpretação de linguagem, dentre outras.
Para te ajudar a criar soluções de pesquisa, a AWS, oferece o Amazon CloudSearch e o Amazon Elasticsearch Service (Amazon ES).
Dentre os dois o CloudSearch é um serviço gerenciado que requer pouca configuração e é dimensionado automaticamente, é proprietário da AWS.
Já Amazon ES é um serviço gerenciado do Elasticsearch que é uma solução open source e permite que você tenha mais autonomia sobre a configuração.
O Elasticsearch vai além de uma simples solução de pesquisa e também pode ser para análises de log, monitoramento de aplicações em tempo real e análise de fluxo de cliques.
O Kibana e ELK que estão dentre as ferramentas de log e monitoramento mais conhecidas no mundo DevOps utiliza Elasticsearch, por exemplo.
Ambos, o CloudSearch e o Elasticsearch usam particionamento e replicação de dados para escalar horizontalmente. A vantagem do CloudSearch, é que você não precisa se preocupar com partições e réplicas porque o serviço lida com isso automaticamente.
Em se tratando de Alta Disponibilidade, ambos incluem recursos que armazenam dados de forma redundante em diferentes AZs.
Bancos de Dados de Grafos
Um banco de dados baseado em grafos (também chamado de banco de dados orientado a grafos) usa estruturas de nós interconectados entre si.
Os bancos de dados de gráficos são propositadamente criados para armazenar e navegar por relacionamentos e são normalmente usados em casos de uso como redes sociais, mecanismos de recomendação e detecção de fraude, nos quais você precisa criar relações entre dados e consultar esses relacionamentos rapidamente.
O Amazon Neptune é um serviço de banco de dados gráfico totalmente gerenciado.
Palestras sobre como escolher o melhor banco de dados
Conclusão
- Dê preferência aos bancos de dados gerenciados, em vez de fazer suas próprias instalações manualmente. Os bancos de dados gerenciados vão permitir que sua equipe tenha menos dores de cabeça para garantir escalabilidade, disponibilidade, segurança e desempenho.
- Se sua aplicação indexa e consulta dados sem necessidade de joins ou transações complexas ou se você precisa de uma taxa de gravação que supera as restrições de uma única instância – considere um banco de dados NoSQL.
- Se você tiver arquivos binários (áudio, vídeo e imagem), será mais eficiente armazenar os arquivos reais no Amazon S3 e armazenar apenas os metadados dos arquivos em seu banco de dados relacional ou chave-valor ou de documentos.
- Se o seu esquema não puder ser desnormalizado, e seu aplicativo exigir junções ou transações complexas, considere um banco de dados relacional.
- Para Business Intelligence (BI) e Analytics utilize um banco de dados específico como o Redshift que utilizar armazenamento colunar e compactação para permitir análise de grandes volumes de dados.
- Em se tratando de um caso de uso em que realizar consultas baseadas nos relacionamentos entre os objetos, considere usar um banco de dados orientado a grafos como o Amazon Neptune, por exemplo