Agrupamento de Bancos de Dados

O agrupamento de bancos de dados envolve múltiplos servidores de banco de dados trabalhando juntos para melhorar o desempenho

O que é clusterização de banco de dados?

O agrupamento de bancos de dados agrupa vários servidores de banco de dados (ou nós) em um sistema unificado para melhorar a disponibilidade, a tolerância a falhas e o desempenho. Essa abordagem ajuda a gerenciar dados distribuindo cargas de trabalho e mantendo a redundância, garantindo tempo de atividade contínuo e melhor balanceamento de carga entre os nós.

Neste recurso, explicaremos como funciona o agrupamento de banco de dados e o compararemos a um conceito relacionado: fragmentação.

Como funciona o agrupamento de bancos de dados?

O agrupamento de bancos de dados combina vários servidores, ou nós, para funcionar como um único sistema de banco de dados unificado. Cada nó no cluster é responsável por uma parte dos dados ou da carga de trabalho, mas juntos, eles garantem que todo o sistema funcione sem problemas. Essa abordagem distribuída permite melhor desempenho, tolerância a falhas e escalabilidade.

O princípio básico por trás do clustering é a redundância. Em vez de depender de um único servidor, os dados são distribuídos entre vários nós. Se um nó falhar, outros podem assumir suas responsabilidades, garantindo a operação contínua. Essa redundância minimiza o tempo de inatividade e a perda de dados, tornando o clustering especialmente útil para aplicações que exigem alta disponibilidade.

Em um cluster típico, os dados e as solicitações são distribuídos entre os nós de uma de duas maneiras:

  • Replicação: Os dados são duplicados em todos os nós. Cada nó contém os mesmos dados, portanto, se um falhar, os outros podem responder às mesmas consultas sem atraso. Replicação é ideal para operações de leitura intensiva, uma vez que múltiplos nós podem servir os mesmos dados simultaneamente, balanceando a carga.
  • Particionamento: Os dados são divididos em pedaços e cada nó armazena apenas uma parte do todo. Este método, também conhecido como dimensionamento horizontal, é eficiente para lidar com grandes conjuntos de dados, pois cada nó lida apenas com uma fração do total de dados. O particionamento é tipicamente usado para cargas de trabalho com intensa escrita, onde dados específicos são direcionados para nós designados.

Comunicação entre nós

Os nós em um cluster se comunicam constantemente entre si, compartilhando dados sobre integridade, status e carga de trabalho. Essa coordenação permite que eles equilibrem o tráfego e garantam um desempenho ideal. A colaboração é gerenciada por um sistema de gerenciamento de cluster que monitora e aloca tarefas, como distribuição de consultas, replicação de dados e tratamento de falhas.

Consistência de dados

Um desafio fundamental no agrupamento (clustering) é manter a consistência dos dados em todos os nós. Os clusters usam diferentes modelos de consistência, dependendo do design do sistema. Estes incluem:

  • Consistência forte: Garante que os nós sempre reflitam os dados mais recentes, mas pode introduzir latência devido à sincronização. O Couchbase, por exemplo, oferece durabilidade opções para aumentar a confiabilidade ao custo de maior latência (e vice-versa).
  • Consistência eventual: Permite algum atraso na propagação de atualizações, mas prioriza a disponibilidade e a velocidade. É comum em sistemas onde as operações de leitura e escrita ocorrem em velocidades diferentes ou em regiões diferentes. Um exemplo é a replicação entre data centers (XDCR) do Couchbase, que replica todo o conjunto de dados entre os clusters.

Clustering de banco de dados vs. Sharding

O clustering e o sharding não são mutuamente exclusivos. Na verdade, as duas técnicas frequentemente trabalham juntas para criar um sistema de banco de dados mais robusto, escalável e de alto desempenho. Enquanto o clustering foca em redundância, tolerância a falhas e balanceamento de carga, o sharding enfatiza a escalabilidade ao distribuir dados entre múltiplos servidores. Abaixo está uma tabela que destaca as principais diferenças entre essas abordagens.

RecursoAgrupamentoFragmentação
Distribuição de dadosReplicado ou particionado entre nósParticionado horizontalmente entre shards
Tolerância a falhasAlta, com mecanismos de failover automáticoLimitado, requer recuperação manual ou complexa
EscalabilidadeLimitado ao número de nós no clusterIlimitado, escala horizontalmente adicionando shards
Foco em desempenhoOtimizado para cargas de trabalho de leitura intensiva e balanceadasMelhor para conjuntos de dados grandes e com muitas gravações
Isolamento de dadosBaixo, os nós compartilham dados ou dividem cargas de trabalhoOi, cada shard opera independentemente
Redundância de dadosOs dados são replicados ou particionadosOs dados são divididos em partições separadas
Balanceamento de cargaSim, o tráfego é distribuído entre os nósNão por padrão, mas pode ser gerenciado por fragmento
ComplexidadeConfiguração mais simples com gerenciamento automatizadoMais complexo, requer gerenciamento de fragmentos personalizado (ou mecanismo de fragmentação automático)

Agrupamento sem sharding: Em alguns cenários, o agrupamento de bancos de dados é usado isoladamente. Por exemplo, uma empresa com uma aplicação de leitura intensa, como um grande site de comércio eletrônico, pode configurar um cluster de nós replicados. Cada nó possui uma cópia de todo o banco de dados, e as consultas são distribuídas entre os nós para balancear a carga. Se um nó falhar, outro pode assumir rapidamente sem interrupção. Essa configuração é comum em bancos de dados relacionais como MySQL ou PostgreSQL, onde a alta disponibilidade é priorizada e o conjunto de dados ainda é pequeno o suficiente para ser gerenciado sem fragmentação (sharding).

Sharding sem clustering: Por outro lado, o sharding pode ser usado sem clustering em aplicações com intensa escrita ou sistemas com conjuntos de dados massivos que não cabem em uma única máquina. Uma plataforma de mídia social com milhões de usuários pode fragmentar seu banco de dados por ID de usuário, de modo que cada fragmento contenha um subconjunto de dados de usuários. Cada fragmento opera de forma independente neste caso, e não há redundância, a menos que mecanismos específicos sejam implementados para lidar com falhas. O MongoDB™, por exemplo, permite o sharding em vários servidores sem exigir clustering, tornando-o escalável, mas com tolerância a falhas integrada limitada.

Agrupamento com sharding: Em sistemas de grande escala, nos quais tanto a alta disponibilidade quanto a escalabilidade são fundamentais, o particionamento e o clustering costumam ser utilizados em conjunto. Essa abordagem híbrida é empregada em sistemas como o Couchbase, onde o particionamento (vBuckets) é combinado com o clustering para criar um sistema altamente escalável e tolerante a falhas, reunindo o melhor dos dois mundos.

Arquitetura de cluster de banco de dados

A arquitetura de um cluster de banco de dados define como os dados são armazenados, acessados e gerenciados em vários nós. Existem três tipos principais de arquiteturas de cluster de banco de dados: sem compartilhamento, disco compartilhado e tudo compartilhado. Essas arquiteturas oferecem diferentes compensações de desempenho, escalabilidade e tolerância a falhas, tornando-as adequadas para diferentes casos de uso.

Arquitetura sem recursos compartilhados

Em uma arquitetura “shared-nothing”, cada nó do cluster opera de forma independente. Cada nó possui sua própria CPU, memória e armazenamento, e não compartilha nenhum recurso com outros nós. Os dados são particionados entre os nós, de modo que cada um gerencia seu próprio subconjunto dos dados gerais.

  • Sem compartilhamento de recursos: Os nós não compartilham memória nem disco, o que reduz os gargalos.
  • Alta escalabilidade: É possível adicionar novos nós ao sistema com facilidade, já que não há um recurso central que possa causar conflitos.
  • Isolamento de falhas: Se um nó falhar, apenas os dados gerenciados por esse nó serão afetados. Outros nós continuarão a operar normalmente (e outros nós provavelmente terão cópias réplicas para se recuperar).

Esta arquitetura é ideal para cargas de trabalho que precisam escalar horizontalmente, como aplicações web com grandes conjuntos de dados. Sistemas como o Couchbase usam arquiteturas sem compartilhamento (shared-nothing), onde os dados são distribuídos entre os nós para melhor desempenho e confiabilidade.

Arquitetura de disco compartilhado

Em uma arquitetura de disco compartilhado, todos os nós compartilham o acesso ao mesmo sistema de armazenamento, mas cada nó possui sua própria CPU e memória. Isso significa que vários nós podem acessar os mesmos dados no disco, facilitando a consistência dos dados e o gerenciamento centralizado dos mesmos.

  • Armazenamento compartilhado: Todos os nós acessam o mesmo disco ou sistema de armazenamento.
  • Dados centralizados: Como todos os nós veem os mesmos dados, há menos necessidade de particionamento ou replicação de dados. No entanto, isso também significa que uma falha no disco compartilhado pode levar à queda de todo o sistema.
  • Escalabilidade moderada: Essa arquitetura é escalável, mas o desempenho pode ser limitado pela largura de banda do sistema de armazenamento compartilhado.

Arquiteturas de disco compartilhado são comumente usadas em sistemas como o Oracle, onde múltiplos nós precisam de acesso concorrente aos mesmos dados.

Arquitetura com tudo compartilhado

Em uma arquitetura de tudo compartilhado, todos os nós compartilham recursos tanto de armazenamento quanto de memória. Esse modelo garante que todos os dados e memórias sejam acessíveis por todos os nós a qualquer momento. Embora essa arquitetura possa ajudar no balanceamento de carga e na disponibilidade de dados, ela também pode introduzir gargalos de desempenho significativos à medida que os nós competem pelo acesso aos recursos compartilhados.

  • Compartilhamento total de recursos: Todos os nós compartilham tanto os recursos de armazenamento quanto os de memória, o que facilita o gerenciamento dos recursos e garante a consistência dos dados.
  • Balanceamento de carga: Com acesso aos mesmos recursos, as cargas de trabalho podem ser distribuídas uniformemente entre os nós.
  • Escalabilidade limitada: Essa arquitetura não se adapta bem à escalabilidade, pois a adição de mais nós aumenta a disputa pelos recursos compartilhados.

Atualmente, as arquiteturas do tipo “tudo compartilhado” são menos comuns devido às limitações inerentes ao escalonamento e ao risco de gargalos, mas o IBM DB2 é o exemplo mais conhecido.

Benefícios do agrupamento de bancos de dados

O clustering de bancos de dados oferece várias vantagens importantes, tornando-o uma solução essencial para aplicações de alta demanda. Entre elas estão:

Alta disponibilidade

O clustering garante alta disponibilidade replicando dados em vários nós. Se um nó falhar, outros assumem automaticamente, minimizando o tempo de inatividade e mantendo o acesso contínuo ao sistema.

Escalabilidade

O clustering oferece escalabilidade horizontal, permitindo que você adicione mais nós conforme seus dados ou tráfego crescem. Isso garante um desempenho consistente e a capacidade de lidar com cargas de trabalho crescentes sem gargalos.

Tolerância a falhas e failover

Com tolerância a falhas, o agrupamento lida automaticamente com falhas de nós por meio de mecanismos de failover integrados, garantindo que as solicitações sejam redirecionadas para nós íntegros e minimizando interrupções no serviço.

Outros benefícios incluem balanceamento de carga, desempenho aprimorado, redundância de dados e flexibilidade de manutenção.

Diretrizes para clusterização de banco de dados

Ao configurar um cluster de banco de dados, certos princípios ajudam a garantir desempenho e confiabilidade ideais. Felizmente, muitos deles são gerenciados automaticamente por sistemas desenvolvidos para clustering, como o Couchbase, o que simplifica grande parte da complexidade.

  • Defina suas metas: Normalmente, seus objetivos serão alta disponibilidade, escalabilidade e desempenho.
  • Escolha a arquitetura correta: Considere sua carga de trabalho (pesada em leitura vs. pesada em escrita vs. "shared nothing" [sem compartilhamento]) ao configurar seu cluster.
  • Tolerância a falhas e failover: A utilização de replicação e redundância minimiza o tempo de inatividade, tornando as configurações de failover uma preocupação menor.
  • Balanceamento de carga: Considere como você distribuirá o tráfego entre os nós para garantir cargas de trabalho equilibradas e desempenho ideal.
  • Escalabilidade e capacidade: Planeje-se com antecedência para o crescimento e lembre-se de que a arquitetura sem compartilhamento (shared-nothing) é a mais fácil de expandir.
  • Consistência de dados: Garantir a consistência forte ou eventual, de acordo com as necessidades do seu aplicativo, oferece várias opções.
  • Monitoramento e manutenção: Usar ferramentas dentro do sistema ajuda a acompanhar o desempenho e identificar problemas.

O Couchbase, com uma arquitetura “shared-nothing”, é uma opção popular, especialmente para sistemas grandes e em expansão (por exemplo, LinkedIn e Trendyol), pois lida automaticamente com replicação, sharding e failover.

Como criar um cluster de banco de dados

A criação de um cluster de banco de dados envolve várias etapas, incluindo a seleção da tecnologia adequada, a configuração dos nós e a garantia de uma comunicação adequada entre eles. Aqui está um resumo das principais etapas envolvidas:

Selecione o software de banco de dados: Primeiro, escolha um sistema de banco de dados que ofereça suporte a clustering. Bancos de dados populares, como o Couchbase, oferecem recursos de clustering integrados. A escolha do software depende da sua carga de trabalho, modelo de dados, e necessidades de escalabilidade.

Nós de provisionamento: Em um cluster de banco de dados, os nós são os servidores individuais que trabalham juntos. Esses nós devem ser provisionados com os recursos de hardware apropriados, como CPU, memória e armazenamento. Eles podem ser máquinas físicas ou servidores virtuais, dependendo da sua infraestrutura.

Configurar a rede: Para garantir uma comunicação fluida entre os nós, é necessário configurar a rede. Esse processo inclui a configuração de endereços IP e sub-redes, além de garantir que os nós possam se comunicar por meio de canais seguros. Conexões de baixa latência e alta largura de banda são fundamentais para o desempenho.

Configurar a replicação de dados: Um dos principais componentes do clustering é a replicação, na qual os dados são copiados para vários nós a fim de garantir a disponibilidade em caso de falha. Configure o mecanismo de replicação, garantindo que os dados sejam sincronizados de forma consistente entre os nós. Isso também aumenta a tolerância a falhas.

Balanceamento de carga: Frequentemente, um balanceador de carga é implementado para distribuir o tráfego de maneira uniforme pelo cluster, a menos que o próprio cluster de bancos de dados já possua essa funcionalidade integrada. O balanceador de carga direciona as consultas recebidas para diferentes nós com base na carga e na disponibilidade, evitando que um único nó fique sobrecarregado.

Configurar as ferramentas de gerenciamento do cluster: O software de gerenciamento de cluster ajuda a monitorar a integridade do cluster, fornecendo informações sobre o desempenho dos nós e alertando sobre falhas. Ferramentas como Kubernetes são frequentemente utilizados para gerenciar e abstrair esses detalhes.

Teste de tolerância a falhas: Após a configuração inicial, é importante testar a capacidade do cluster de lidar com falhas de nós. Os testes garantem que os nós restantes ainda possam gerenciar a carga de trabalho sem causar tempo de inatividade ou perda de dados se um o nó fica offline.

Monitorar e manter: Assim que o cluster estiver operacional, de forma contínua monitoramento é fundamental. Fique atento às métricas de desempenho, ao atraso na replicação de dados e ao estado de cada nó. Atualizações e patches regulares devem ser aplicados para manter o cluster seguro e eficiente.

A criação de um cluster de banco de dados envolve várias etapas técnicas, desde a configuração da rede até a implementação da replicação e do balanceamento de carga. Um planejamento e gerenciamento adequados garantem que o cluster seja robusto, escalável e capaz de atender aos requisitos de alta disponibilidade.

Principais conclusões e recursos adicionais

O clustering isolado é ideal para alta disponibilidade, tolerância a falhas e balanceamento de cargas de trabalho com uso intenso de leitura. O sharding isolado é ideal para lidar com conjuntos de dados massivos e dimensionar cargas de trabalho com uso intenso de escrita, mas carece da redundância que o clustering oferece. Quando combinados, o clustering com sharding permite tanto escalabilidade massiva quanto alta tolerância a falhas, tornando-se a arquitetura padrão para aplicações de larga escala que lidam com cargas de dados enormes, mantendo a disponibilidade e o desempenho.

Ao compreender os pontos fortes do clustering e do sharding e como eles podem se complementar, você poderá projetar melhor um sistema de banco de dados que atenda às suas necessidades específicas, seja em termos de alta disponibilidade, escalabilidade ou ambos.

Quer montar um cluster de banco de dados por conta própria? A arquitetura “shared-nothing” do Couchbase facilita isso. Aqui estão algumas opções, dependendo do nível de controle que você deseja exercer sobre o seu cluster:

Para saber mais sobre conceitos relacionados a clustering do Couchbase, você pode visitar nosso blog e centro de conceitos.

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Experimente Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Couchbase para ISVs

Crie aplicativos avançados com menos complexidade e custo.