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' ?
mysql
sharding
database-partitioning
Amit Sharma
fonte
fonte
Respostas:
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
fonte
Parece que isso responde às suas perguntas:
Fonte: Wiki-Shard .
Fonte: MongoDB .
fonte
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:
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
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:
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
fonte
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:
0,4 milhões de linhas (tabela 1), 0,6 milhões de linhas (tabela2)
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.
fonte
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.
fonte
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.
fonte
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.
fonte