Dividindo linhas entre bancos

Prévia grátis 3 min de leitura

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 um default_shard igual a :default.
Aula 1 de 7 · grátis

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.

Digite para buscar...