Sharding na entrevista de System Design: você sabe explicar o que acontece quando entra mais um servidor?
Uma das partes mais interessantes de estudar sharding é perceber que distribuir os dados não resolve sozinho o problema de crescer. A regra que você usa para distribuir também precisa aguentar esse crescimento.
Pensa numa estratégia simples: escolher o servidor usando hash(id) % quantidade_de_servidores.
Com quatro servidores, você calcula % 4. Quando adiciona o quinto, passa a calcular % 5. Parece uma mudança pequena, mas boa parte das chaves passa a apontar para outro lugar. Agora você precisa mover dados enquanto o sistema continua recebendo leituras e escritas.
E essa nem é a única dificuldade:
- Distribuir por faixa facilita algumas consultas, mas pode concentrar as escritas numa única partição. Se a divisão acompanha uma data crescente, por exemplo, os registros novos acabam indo para o mesmo lugar.
- Usar hash ajuda a espalhar as chaves, mas não garante uma distribuição equilibrada de carga. Um único usuário muito acessado pode continuar sobrecarregando uma partição.
- Usar hash consistente reduz a redistribuição quando entram ou saem servidores, mas ainda exige cuidar da movimentação dos dados e do balanceamento.
Uma ideia que ajuda a organizar isso é separar as partições lógicas das máquinas físicas. Você distribui os dados em vários grupos e depois associa esses grupos aos servidores. Assim, consegue mover alguns grupos sem precisar redefinir o destino de todas as chaves.
Ainda sobra uma pergunta importante: o que precisa ficar junto? Distribuir por usuário pode facilitar a busca dos dados daquele usuário, mas tornar mais trabalhosa uma consulta que atravessa vários deles. A escolha da chave de particionamento acaba sendo também uma escolha sobre quais operações serão simples e quais ficarão caras.
Preparei um vídeo sobre esse caminho, de particionamento por faixa até hash consistente e partições lógicas, usando exemplos de supermercado, baralho e caixas de mudança. É o quarto episódio de uma série que estou produzindo sobre fundamentos de programação na era da IA.
Vídeo: “Seu sistema fez SUCESSO e foi isso que derrubou seu banco de dados.”
Assistir no YouTube
Pra quem já trabalhou com isso em produção: o que deu mais trabalho, escolher a chave de particionamento, mover os dados ou lidar com as consultas depois?