Dividindo linhas entre bancos
O sharding horizontal divide as linhas de uma tabela entre vários bancos, cada um guardando um subconjunto diferente. Todo shard tem o mesmo schema, e nenhum deles tem todos os dados.
A distinção que importa
Uma réplica guarda tudo. Um shard guarda uma fatia.
| Réplica | Shard | |
|---|---|---|
| Guarda | Todos os dados | Algumas das linhas |
| Resolve | Leituras demais | Dados demais, escritas demais |
| Perder um | Custa capacidade | Perde aquelas linhas |
| Schema | Idêntico, por replicação | Idêntico, pelas suas migrações |
Leia a terceira linha duas vezes. Uma réplica caindo é um problema de capacidade. Um shard caindo é um problema de disponibilidade para as pessoas cujas linhas moram nele. Essa diferença muda o que "o banco está no ar" quer dizer: deixa de ser uma pergunta de sim ou não.
flowchart TB
R["réplica"] --> R1["uma cópia completa"]
R1 --> R2["perdê-la: menos capacidade de leitura"]
S["shard"] --> S1["uma fatia das linhas"]
S1 --> S2["perdê-lo: aqueles usuários estão fora"]
S2 --> S3["'o banco está no ar?' deixa de ser sim ou não"]
Para que ele serve
Ele resolve dois problemas, e só dois.
Vazão de escrita. Uma réplica não ajuda com escritas, porque toda escrita continua indo para o único primário. Fora a replicação com vários primários, que traz os próprios problemas de conflito, o sharding é o jeito comum de ter mais de uma máquina aceitando escritas na mesma tabela.
Volume de dados. Quando uma tabela não cabe mais com folga numa máquina, e "com folga" quer dizer índices em memória, vacuum terminando e backups completando dentro de uma janela, dividir as linhas é a resposta.
Se o seu problema não é nenhum desses dois, sharding é a ferramenta errada, e uma ferramenta errada bem cara, pelos motivos que as próximas lições descrevem.
O vocabulário
Um shard é um dos bancos que guardam um subconjunto.
A chave de shard é a coluna cujo valor decide em qual shard uma linha mora. Escolhê-la é o projeto inteiro, e a lição 2 explica por quê.
Fan-out é consultar todos os shards e juntar os resultados na sua aplicação, que é o que qualquer pergunta que um único shard não responde exige.
O Rails conhece isso
Sharding é um conceito de primeira classe do Active Record, e não uma gem. O connects_to aceita um hash shards:, o connected_to recebe um argumento shard:, e existe um default_shard:
self.default_shard = :default
Toda aplicação já tem sharding, com um shard só. Vale absorver isso, porque quer dizer que acrescentar shards não é encaixar um subsistema novo. É usar um eixo que sempre esteve ali, sem uso.
Pontos-chave
- O sharding horizontal divide linhas entre bancos. Todo shard tem o mesmo schema e um subconjunto diferente.
- Uma réplica guarda tudo e resolve a carga de leitura. Um shard guarda uma fatia e resolve escritas e volume.
- Perder uma réplica custa capacidade. Perder um shard tira aquelas pessoas do ar.
- Fora a replicação com vários primários, o sharding é como você tem mais de uma máquina aceitando escritas numa tabela.
- O Rails trata shards como primeira classe:
connects_to shards:,connected_to(shard:)e umdefault_shardigual a:default.
Continue com a aula 2
A chave de shard decide tudo
Mostra por que a chave de shard vem dos padrões de acesso e por que user_id serve melhor que course_id aqui.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.