Uma cartilha para entender o sharding de banco de dados

Publicados: 2022-11-05

Criar um site é o primeiro passo para configurar sua presença na Internet. Para prosperar a longo prazo, você também deve garantir que seu site possa ser dimensionado para acomodar o crescimento. E um dos primeiros passos é implementar um banco de dados que possa escalar com você. Caso contrário, você corre o risco de ter um desempenho de consulta lento e interrupções do banco de dados.

Esta postagem discutirá como você pode usar a fragmentação de banco de dados para obter alta escalabilidade e disponibilidade para seus dados. Também abordaremos as desvantagens do sharding e as diferentes arquiteturas de sharding que você pode usar.

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

Sharding é uma técnica de otimização que distribui tabelas entre outros servidores de banco de dados. É como particionar no sentido de que ambos envolvem dividir os dados em subconjuntos menores. A diferença é que o sharding distribui esses subconjuntos para diferentes servidores enquanto o particionamento os armazena em um banco de dados. Esses servidores usam o mesmo mecanismo de banco de dados e tipo de hardware para atingir um nível de desempenho semelhante para todos os estilhaços.

O sharding visa realizar uma arquitetura share-nothing, eliminando gargalos de processamento e pontos únicos de falha.

Uma ilustração para explicar a fragmentação de banco de dados.
Um exemplo de fragmentação. (Fonte da imagem: Analytics Vidhya)

Você pode implementar a fragmentação de duas maneiras: horizontal e verticalmente. A fragmentação horizontal divide a tabela com base em linhas, enquanto a fragmentação vertical divide as tabelas com base em colunas.

Nesse sentido, o sharding é como o particionamento, que divide tabelas grandes em menores.

A fragmentação horizontal é eficaz para bancos de dados em que a maioria das consultas retorna um subconjunto de linhas, como um banco de dados de clientes que retorna dados (como nome, endereço, email e assim por diante) de uma só vez.

A fragmentação vertical é eficaz para bancos de dados cujas consultas retornam colunas únicas. Por exemplo, se o banco de dados do cliente retornar o nome ou e-mail do cliente separadamente, você poderá separar o nome e o e-mail em diferentes clusters.

Benefícios do compartilhamento de banco de dados

Abaixo estão algumas das vantagens da fragmentação de banco de dados.

Dimensionamento horizontal aprimorado

Você pode dimensionar seu banco de dados verticalmente ou horizontalmente. A escala vertical refere-se à adição de mais unidades de processamento central (CPU) e memória de acesso aleatório (RAM) ao servidor para melhorar o desempenho. O dimensionamento vertical é uma solução útil para bancos de dados pequenos e médios. No entanto, à medida que seus dados crescem, o dimensionamento vertical se torna inviável. Há tanta energia que você pode adicionar a um único servidor.

A escala horizontal é mais flexível. Ele permite que você dimensione seu banco de dados conforme necessário, adicionando mais servidores ao seu sistema. Cada um desses servidores fornece recursos para diferentes fragmentos de banco de dados. Isso distribui a carga de trabalho e melhora a capacidade do sistema de lidar com mais solicitações.

Tempos de resposta de consulta mais rápidos

Os fragmentos têm apenas algumas linhas e colunas. Por causa disso, leva menos tempo para processar consultas de banco de dados. Por outro lado, uma consulta de um banco de dados não fragmentado pode exigir uma pesquisa em centenas — ou mesmo milhares — de linhas.

Maior confiabilidade em situações de interrupção

As interrupções do banco de dados acontecem por vários motivos, incluindo exclusão acidental de dados, erros de conexão e ataques de segurança cibernética. A fragmentação minimiza os efeitos das interrupções. Como cada estilhaço é autônomo, apenas o estilhaço afetado enfrenta tempo de inatividade. Por exemplo, se você tiver quatro estilhaços e ocorrer uma interrupção em um deles, apenas 25% das operações serão afetadas.

Desvantagens da fragmentação

Embora a fragmentação melhore a confiabilidade e a disponibilidade de um banco de dados, sua implementação é complexa. Usar a arquitetura de fragmentação errada pode diminuir o desempenho e levar à perda de dados.

Certifique-se de escolher uma técnica de fragmentação que permita uma distribuição de dados equilibrada em todos os fragmentos. Sem esse equilíbrio, você corre o risco de criar hotspots de banco de dados, que acontecem quando um shard armazena a maioria dos dados enquanto outros shards permanecem praticamente vazios. Isso reduz a taxa de transferência de gravação para o único estilhaço.

Para resolver isso, você pode particionar ainda mais o fragmento desbalanceado, mas esse processo é desafiador e pode derrubar seu banco de dados enquanto você migra os dados.

Outra desvantagem do sharding é que as junções SQL envolvendo várias tabelas em diferentes shards podem se tornar muito lentas e prejudicar o desempenho. No entanto, com a arquitetura correta, você pode evitar esse problema.

Arquiteturas de fragmentação

Você pode implementar a fragmentação usando três arquiteturas:

  • Fragmentação baseada em chave
  • Fragmentação com base em intervalo
  • Fragmentação baseada em diretório

A arquitetura escolhida depende do seu caso de uso.

Fragmentação baseada em chave

Em uma arquitetura de fragmentação baseada em chave ou hash, um aplicativo de banco de dados usa uma chave de fragmentação para localizar um fragmento. Uma função de hash faz o hash do valor da chave de fragmentação e a saída mapeia os dados para um fragmento específico. Uma função de hashing simples pode ser o módulo da chave e o número de fragmentos.

A função de hash pode ter mais de uma chave de fragmentação. Por isso, a fragmentação baseada em chave é adequada para registros de dados que podem ter chaves compartilhadas. A distribuição algorítmica dos dados minimiza a possibilidade de criar hotspots de banco de dados onde um shard contém mais dados que o outro.

No entanto, como a distribuição depende apenas da função de hash, é impossível agrupar dados logicamente. Portanto, as operações de banco de dados que exigem dados de vários estilhaços podem ser ineficientes, pois exigem a leitura de dados de cada estilhaço.

Fragmentação com base em intervalo

A fragmentação baseada em intervalo envolve a fragmentação de um banco de dados dependendo de um intervalo de valores especificado.

Ele usa uma chave de fragmentação para determinar a qual fragmento atribuir um valor. O aplicativo de banco de dados verifica o fragmento que corresponde à chave de fragmentação em uma tabela de pesquisa e armazena os dados. Por isso, o sharding baseado em alcance é fácil de projetar e implementar.

Por exemplo, você pode usar o valor do ID do usuário em um banco de dados do usuário como a chave de fragmentação. Você pode armazenar usuários com IDs de 0 a 2.000 em um estilhaço, aqueles entre 2.000 e 4.000 em outro estilhaço e assim por diante.

A fragmentação baseada em intervalo pode causar pontos de acesso de banco de dados. Considere um banco de dados de usuário no qual a maioria de seus IDs de usuário esteja entre 2.001 e 4.000. O processo os atribui a um único shard, criando um desequilíbrio ao longo do tempo. A fragmentação baseada em intervalo, portanto, funciona melhor para dados distribuídos uniformemente.

Fragmentação baseada em diretório

A fragmentação baseada em diretório agrupa dados logicamente relacionados no mesmo fragmento. Ele usa uma tabela de pesquisa contendo uma lista de mapeamentos para cada entidade no banco de dados. Cada mapeamento corresponde a um fragmento de banco de dados.

A fragmentação baseada em diretório é mais flexível do que a fragmentação baseada em intervalo ou chave porque você pode adicionar dados a fragmentos dinamicamente. Não há função de fragmentação para seguir ou valores de intervalo para permanecer. Essa flexibilidade aumenta a eficiência do banco de dados: você pode armazenar dados relacionados em um fragmento, o que significa que a execução de consultas comuns leva menos tempo.

Por exemplo, se você usou fragmentação baseada em diretório e agrupou usuários de acordo com sua localização, recuperando usuários de um local específico, você consulta apenas um único fragmento.

Compartilhamento de banco de dados com Kinsta

A maioria dos mecanismos de banco de dados modernos oferece suporte a fragmentação de banco de dados. Um desses mecanismos de banco de dados é o MariaDB, um fork do MySQL com suporte comercial. É um sistema de banco de dados de código aberto de alto desempenho adotado por empresas como IBM, GitHub e Wikimedia. Também faz parte da pilha de servidores de alto desempenho da Kinsta.

O MariaDB oferece recursos de fragmentação integrados por meio do mecanismo de armazenamento spider. O mecanismo de armazenamento spider é um mecanismo de formação de cluster que suporta transações de particionamento e arquitetura estendida (XA). Ele permite que você trate tabelas remotas de diferentes instâncias como se estivessem na mesma instância. Depois de criar uma tabela no mecanismo de armazenamento spider, a tabela é vinculada a outra tabela no servidor remoto do MariaDB. Uma vez estabelecida a conexão, o mecanismo de armazenamento compartilha o link com todas as tabelas que fazem parte da mesma transação.

Resumo

A fragmentação de banco de dados é uma técnica de dimensionamento que particiona as tabelas em subconjuntos menores e as distribui para diferentes servidores chamados de fragmentos. Você pode implementar a fragmentação por vários meios, como fragmentação baseada em chave, fragmentação baseada em intervalo e fragmentação baseada em diretório.

Embora a fragmentação melhore a escalabilidade, a confiabilidade e a disponibilidade de um banco de dados, sua implementação é muito complexa. Além disso, depois de criar um estilhaço, não é fácil reverter o banco de dados para seu estado não fragmentado. Por isso, use a fragmentação para otimização somente quando tiver certeza de que outras opções de escalabilidade não funcionarão.

Seja sua empresa uma organização sem fins lucrativos ou uma empresa de nível empresarial, as soluções especializadas da Kinsta podem eliminar suas preocupações com a hospedagem de sites, permitindo que você se concentre no que mais importa.