Compartilhamento de banco de dados vs particionamento


166

Eu tenho lido sobre arquiteturas escaláveis ​​recentemente. Nesse contexto, duas palavras que continuam aparecendo com relação aos bancos de dados são sharding e particionamento . Procurei descrições, mas ainda assim fiquei confusa.

Os especialistas da stackoverflow podem me ajudar a entender o básico?

  • Qual é a diferença entre sharding e particionamento ?
  • É verdade que 'todos os bancos de dados divididos são essencialmente particionados (em nós diferentes), mas todos os bancos de dados particionados não são necessariamente divididos' ?

Respostas:


130

Particionamento é mais um termo genérico para dividir dados entre tabelas ou bancos de dados. O sharding é um tipo específico de particionamento, parte do que é chamado de particionamento horizontal.

Aqui você replica o esquema entre (normalmente) várias instâncias ou servidores, usando algum tipo de lógica ou identificador para saber qual instância ou servidor procurar os dados. Um identificador desse tipo costuma ser chamado de "Shard Key".

Uma lógica comum, sem chave, é usar o alfabeto para dividir os dados. O AD é a instância 1, o EG é a instância 2 etc. Os dados do cliente são adequados para isso, mas serão um pouco deturpados em tamanho entre instâncias se o particionamento não levar em conta que algumas letras são mais comuns que outras.

Outra técnica comum é usar um sistema ou lógica de sincronização de chaves que garanta chaves exclusivas nas instâncias.

Um exemplo bem conhecido que você pode estudar é como o Instagram resolveu sua partição nos primeiros dias (veja o link abaixo). Eles começaram particionados em muito poucos servidores, usando o Postgres para dividir os dados desde o início. Acredito que foram vários milhares de fragmentos lógicos nesses poucos fragmentos físicos. Leia o artigo incrível de 2012 aqui: Instagram Engineering - Sharding & IDs

Veja aqui também: http://www.quora.com/Whats-the-difference-between-sharding-and-partition


16
Sharding é um tipo de HP . Não é da HP.
NoChance

1
Estou certo em pensar que particionamento horizontal significa apenas dividir linhas de uma tabela em várias sub-tabelas (possivelmente dentro do mesmo esquema ou instância de banco de dados). Enquanto sharding é particionar horizontalmente, coloque as sub-tabelas em esquemas separados em um único banco de dados ou em instâncias de banco de dados separadas em máquinas separadas. Ou não?
Jonathan Hartley

48

Parece que isso responde às suas perguntas:

O particionamento horizontal divide uma ou mais tabelas por linha, geralmente em uma única instância de um esquema e um servidor de banco de dados. Isso pode oferecer uma vantagem ao reduzir o tamanho do índice (e, portanto, o esforço de pesquisa), desde que exista uma maneira óbvia, robusta e implícita de identificar em qual tabela uma linha específica será encontrada, sem precisar primeiro pesquisar o índice, por exemplo, o clássico exemplo das tabelas 'CustomersEast' e 'CustomersWest', em que o código postal já indica onde serão encontrados.

O sharding vai além disso: ele divide as tabelas problemáticas da mesma maneira, mas faz isso entre potencialmente várias instâncias do esquema. A vantagem óbvia seria que a carga de pesquisa para a tabela particionada grande agora pode ser dividida em vários servidores (lógicos ou físicos), não apenas em vários índices no mesmo servidor lógico.

Fonte: Wiki-Shard .

O sharding é o processo de armazenamento de registros de dados em várias máquinas e é a abordagem do MongoDB para atender às demandas do crescimento de dados. À medida que o tamanho dos dados aumenta, uma única máquina pode não ser suficiente para armazenar os dados nem fornecer uma taxa de transferência aceitável de leitura e gravação. O sharding resolve o problema com a escala horizontal. Com o sharding, você adiciona mais máquinas para suportar o crescimento de dados e as demandas de operações de leitura e gravação.

Fonte: MongoDB .


41

Também mergulhei nisso e, embora eu seja de longe a referência sobre o assunto, há alguns fatos importantes que reuni e pontos que gostaria de compartilhar:

Uma partição é uma divisão de um banco de dados lógico ou de seus elementos constituintes em partes independentes distintas. O particionamento de banco de dados normalmente é feito por motivos de gerenciamento, desempenho ou disponibilidade, como para balanceamento de carga.

https://en.wikipedia.org/wiki/Partition_(database)

Sharding é um tipo de particionamento, como Horizontal Partitioning (HP)

Há também o particionamento vertical (VP), no qual você divide uma tabela em partes distintas menores. A normalização também envolve essa divisão de colunas entre tabelas, mas o particionamento vertical vai além disso e particiona as colunas mesmo quando já normalizadas.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Eu realmente gosto da resposta de Tony Baco no Quora, onde ele faz você pensar em termos de esquema (em vez de colunas e linhas). Ele afirma que ...

O " particionamento horizontal ", ou sharding, está replicando [copiando] o esquema e depois dividindo os dados com base em uma chave de shard.

" Particionamento vertical " envolve dividir o esquema (e os dados acompanham o percurso).

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partitioning-them

O Guia de Particionamento de Banco de Dados da Oracle tem alguns números interessantes. Copiei alguns trechos do artigo.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

Quando particionar uma tabela

Aqui estão algumas sugestões para quando particionar uma tabela:

  • Tabelas com mais de 2 GB devem sempre ser consideradas candidatas ao particionamento.
  • Tabelas contendo dados históricos, nos quais novos dados são adicionados à partição mais recente. Um exemplo típico é uma tabela histórica em que apenas os dados do mês atual são atualizáveis ​​e os outros 11 meses são somente leitura.
  • Quando o conteúdo de uma tabela precisa ser distribuído entre diferentes tipos de dispositivos de armazenamento.

Poda de Partição

A remoção de partição é o meio mais simples e também o mais substancial para melhorar o desempenho usando o particionamento. A remoção de partição geralmente pode melhorar o desempenho da consulta em várias ordens de magnitude. Por exemplo, suponha que um aplicativo contenha uma tabela Pedidos contendo um registro histórico de pedidos e que essa tabela tenha sido particionada por semana. Uma consulta solicitando pedidos por uma única semana acessaria apenas uma única partição da tabela Pedidos. Se a tabela Pedidos tivesse 2 anos de dados históricos, essa consulta acessaria uma partição em vez de 104 partições. Essa consulta pode ser executada 100 vezes mais rápido, simplesmente devido à remoção da partição.

Estratégias de particionamento

  • Alcance
  • Cerquilha
  • Lista

Você pode ler o texto e visualizar as imagens que explicam tudo muito bem.

E, por último, é importante entender que os bancos de dados são extremamente intensivos em recursos:

  • CPU
  • Disco
  • I / O
  • Memória

Muitos DBAs particionarão na mesma máquina, onde as partições compartilharão todos os recursos, mas fornecerão uma melhoria no disco e nas E / S dividindo os dados e / ou o índice.

Enquanto outras estratégias empregam uma arquitetura de "nada compartilhado", onde os shards residem em unidades de computação separadas e distintas (nós), tendo 100% da CPU, disco, E / S e memória para si. Fornecendo seu próprio conjunto de vantagens e complexidades.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


"" Particionamento horizontal ", ou fragmentação, está replicando [copiando] o esquema e depois dividindo os dados com base em uma chave de fragmentação." - isso é tautológico.
precisa saber é o seguinte

Portanto, há um espelho, e ele é fragmentado, daí a etimologia.
mckenzm 11/06

5

Considere uma tabela no banco de dados com 1 milhão de linhas e 100 colunas. No Particionamento, você pode dividir a tabela em 2 ou mais tabelas com propriedades como:

  1. 0,4 milhões de linhas (tabela 1), 0,6 milhões de linhas (tabela2)

  2. 1 milhão de linhas e 60 colunas (tabela 1) e 1 milhão de linhas e 40 colunas (tabela 2)

    Pode haver vários casos como esse

Isso é particionamento geral

Mas Sharding refere-se ao 1º caso apenas onde estamos dividindo os dados com base em linhas. Se estamos dividindo a tabela em várias tabelas, precisamos manter várias cópias semelhantes de esquemas, pois agora temos várias tabelas.


1

Sharding em um caso especial de particionamento horizontal , quando as partições se estendem por várias instâncias do banco de dados. Se um banco de dados é fragmentado, significa que é particionado por definição.


1

Ao falar sobre particionamento, não use replicação de termo ou replicação. A replicação é um conceito diferente e está fora do escopo desta página. Quando falamos em particionamento, melhor palavra é dividida e, quando falamos em fragmentação, melhor palavra é distribuída. Na partição (normalmente e no entendimento comum nem sempre), as linhas da tabela grande de conjunto de dados são divididas em dois ou mais grupos separados (sem compartilhar nenhuma linha). Você pode chamar cada grupo de partição. Esses grupos ou todas as partições permanecem sob o controle de uma instância do RDMB e isso é lógico. A base de cada grupo pode ser um hash ou intervalo ou etc. Se você tiver dados de dez anos em uma tabela, poderá armazenar cada um dos dados do ano em uma partição separada, e isso pode ser alcançado definindo os limites da partição com base em um coluna não nula CREATE_DATE. Depois de consultar o banco de dados, se você especificar uma data de criação entre 01-01-1999 e 31-12-2000, apenas duas partições serão atingidas e serão seqüenciais. Eu fiz similar no DB por mais de bilhões de registros e o tempo do sql chegou a 50 milis a partir de 30 segundos usando índices etc. O compartilhamento é que você hospeda cada partição em um nó / máquina diferente. Agora, a busca dentro das partições / shards pode acontecer em paralelo.


0

Partição horizontal quando movida para outra instância de banco de dados * se torna um fragmento de banco de dados .

A instância do banco de dados pode estar na mesma máquina ou em outra máquina.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.