O que e Sharding
Sharding e uma tecnica que particiona horizontalmente os dados e os armazena em multiplos bancos de dados (shards). Permite lidar com grandes volumes de dados e trafego que um unico banco de dados nao consegue processar.
Diferenca para Replicacao: A replicacao mantem copias dos mesmos dados em multiplos servidores, enquanto o sharding distribui dados diferentes em servidores diferentes.
Como o Sharding Funciona
flowchart TB
subgraph Before["Antes do Sharding"]
Single["Banco de Dados Unico<br/>Todos os dados de usuarios<br/>(100 milhoes de registros)"]
end
flowchart LR
subgraph After["Apos o Sharding"]
S0["Shard 0<br/>Usuarios A-F<br/>25 milhoes"]
S1["Shard 1<br/>Usuarios G-L<br/>25 milhoes"]
S2["Shard 2<br/>Usuarios M-R<br/>25 milhoes"]
S3["Shard 3<br/>Usuarios S-Z<br/>25 milhoes"]
end
Metodos de Sharding
Sharding Baseado em Intervalo
Determina o shard pelo intervalo da chave.
| Intervalo de user_id | Shard |
|---|---|
| 1-1.000.000 | Shard 0 |
| 1.000.001-2.000.000 | Shard 1 |
| 2.000.001-3.000.000 | Shard 2 |
Vantagens: Consultas por intervalo sao eficientes Desvantagens: Tendencia a desequilibrio nos dados
Sharding Baseado em Hash
Determina o shard pelo valor hash da chave.
shard_id = hash(user_id) % num_shards
| user_id | Resultado do Calculo | Shard |
|---|---|---|
| user_123 | hash(“user_123”) % 4 = 2 | Shard 2 |
| user_456 | hash(“user_456”) % 4 = 0 | Shard 0 |
Vantagens: Dados distribuidos uniformemente Desvantagens: Consultas por intervalo sao ineficientes
Sharding Baseado em Diretorio
Determina o shard atraves de uma tabela de lookup.
| user_id | shard |
|---|---|
| user_123 | Shard 2 |
| user_456 | Shard 0 |
| user_789 | Shard 1 |
Vantagens: Mapeamento flexivel Desvantagens: Overhead do lookup
Escolha da Shard Key
A shard key e o elemento mais importante que determina o sucesso ou fracasso do sharding.
Condicoes de uma Boa Shard Key
- Alta cardinalidade (possui valores diversos)
- Adequada ao padrao de acesso
- Escritas distribuidas uniformemente
- A maioria das consultas inclui a chave
Exemplos de Shard Keys
| Caso de Uso | Boa Shard Key | Ma Shard Key |
|---|---|---|
| SaaS Multi-tenant | tenant_id | created_at |
| E-commerce | user_id | product_category |
| Rede Social | user_id | post_date |
| Analise de Logs | Composto de tempo + identificador | Apenas tempo |
Problema de Hotspots
| Padrao | Shard Key | Resultado |
|---|---|---|
| Exemplo ruim | created_at | Escritas concentradas no shard dos dados mais recentes |
| Exemplo bom | Chave composta de user_id + created_at | Escritas distribuidas |
Consultas Cross-Shard
Consultas que abrangem multiplos shards se tornam complexas.
Scatter-Gather
flowchart TB
Client["Cliente"] --> Router["Roteador"]
Router -->|"Scatter<br/>(Consulta para todos os shards)"| S0["S0"]
Router --> S1["S1"]
Router --> S2["S2"]
Router --> S3["S3"]
S0 -->|"Gather<br/>(Agrega resultados)"| Router
S1 --> Router
S2 --> Router
S3 --> Router
Router --> Client
Restricoes de JOIN
-- Dentro do mesmo shard: JOIN normal
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.id = 123; -- Inclui a shard key
-- Cross-shard: juncao no lado da aplicacao
-- 1. Obter dados da tabela users
-- 2. Obter dados da tabela orders
-- 3. Fazer JOIN no lado da aplicacao
Rebalanceamento
E o trabalho de redistribuir dados entre shards.
Quando se Torna Necessario
- Adicao/remocao de shards
- Correcao de desequilibrio de dados
- Otimizacao de performance
Consistent Hashing
Tecnica que minimiza a movimentacao de dados mesmo quando o numero de shards muda.
| Tecnica | Mudanca no Numero de Shards | Volume de Dados Movidos |
|---|---|---|
| Hash Tradicional | 4→5 | Aproximadamente 80% |
| Consistent Hashing | 4→5 | Aproximadamente 20% |
Desafios do Sharding
| Desafio | Solucao |
|---|---|
| Complexidade de transacoes | Two-phase commit, padrao Saga |
| Restricoes de JOIN | Desnormalizacao de dados, juncao na aplicacao |
| Dificuldade de mudancas de schema | Ferramentas de DDL online |
| Complexidade operacional | Uso de servicos gerenciados |
| Backup e restauracao | Estrategia por shard |
Sharding Gerenciado
| Servico | Caracteristicas |
|---|---|
| Amazon Aurora | Suporte a sharding automatico |
| CockroachDB | SQL distribuido, rebalanceamento automatico |
| Vitess | Compativel com MySQL, desenvolvido pelo YouTube |
| MongoDB | Sharding integrado |
| TiDB | Compativel com MySQL, NewSQL |
Criterios para Decisao de Sharding
Quando o sharding e necessario:
- Excede o limite de capacidade de um unico DB
- Throughput de escrita no limite
- Custo de escalabilidade vertical muito alto
Alternativas a considerar primeiro:
- Adicao de read replicas
- Introducao de cache
- Otimizacao de consultas
- Revisao de indices
- Migracao para instancia maior
Resumo
Sharding e uma tecnica poderosa para alcançar escalabilidade horizontal do banco de dados, mas tambem traz complexidade. A escolha da shard key e a chave para o sucesso, e deve-se decidir pela implementacao apos analisar suficientemente os padroes de acesso. Quando possivel, considere usar servicos gerenciados para reduzir a carga operacional.
← Voltar para a lista