Partitionnement de la base de données vs partitionnement

166

J'ai lu récemment sur les architectures évolutives. Dans ce contexte, deux mots qui continuent à apparaître en ce qui concerne les bases de données sont sharding et le partitionnement . J'ai recherché des descriptions mais j'ai fini par être confus.

Les experts de stackoverflow pourraient-ils m'aider à maîtriser les bases?

  • Quelle est la différence entre sharding et partitionnement ?
  • Est-il vrai que «toutes les bases de données partitionnées sont essentiellement partitionnées (sur différents nœuds), mais toutes les bases de données partitionnées ne sont pas nécessairement partitionnées» ?
Amit Sharma
la source
digitalocean.com/community/tutorials/ ... cela pourrait aider.
mchawre le

Réponses:

130

Le partitionnement est plus un terme générique pour diviser des données entre des tables ou des bases de données. Le partitionnement est un type spécifique de partitionnement, qui fait partie de ce qu'on appelle le partitionnement horizontal.

Ici, vous répliquez le schéma sur (généralement) plusieurs instances ou serveurs, en utilisant une sorte de logique ou d'identifiant pour savoir quelle instance ou quel serveur rechercher les données. Un identifiant de ce type est souvent appelé "Clé d'éclat".

Une logique courante sans clé consiste à utiliser l'alphabet pour diviser les données. AD est l'instance 1, EG est l'instance 2 etc. Les données client sont bien adaptées pour cela, mais seront quelque peu déformées en taille entre les instances si le partitionnement ne tient pas compte du fait que certaines lettres sont plus courantes que d'autres.

Une autre technique courante consiste à utiliser un système ou une logique de synchronisation de clé qui garantit des clés uniques dans les instances.

Un exemple bien connu que vous pouvez étudier est la façon dont Instagram a résolu leur partitionnement au début (voir le lien ci-dessous). Ils ont commencé par partitionner sur très peu de serveurs, utilisant Postgres pour diviser les données dès le départ. Je crois qu'il y avait plusieurs milliers de fragments logiques sur ces quelques fragments physiques. Lisez leur superbe article de 2012 ici: Instagram Engineering - Sharding & IDs

Voir aussi ici: http://www.quora.com/Whats-the-difference-between-sharding-and-partition

Canis
la source
16
Le sharding est un type de HP . Ce n'est pas HP.
NoChance
1
Ai-je raison de penser que le partitionnement horizontal signifie simplement diviser les lignes d'une table en plusieurs sous-tables (éventuellement dans le même schéma ou la même instance de base de données.) Alors que le partitionnement consiste à partitionner horizontalement, placer les sous-tables dans des schémas séparés dans une seule base de données , ou dans des instances de base de données distinctes sur des machines distinctes. Ou pas?
Jonathan Hartley
48

On dirait que ceci répond à vos deux questions:

Le partitionnement horizontal divise une ou plusieurs tables par ligne, généralement au sein d'une seule instance d'un schéma et d'un serveur de base de données. Il peut offrir un avantage en réduisant la taille de l'index (et donc l'effort de recherche) à condition qu'il y ait un moyen évident, robuste et implicite d'identifier dans quelle table une ligne particulière sera trouvée, sans avoir besoin de rechercher au préalable l'index, par exemple le classique exemple des tables 'CustomersEast' et 'CustomersWest', où leur code postal indique déjà où ils se trouvent.

Le sharding va au-delà de cela: il partitionne la ou les tables problématiques de la même manière, mais il le fait sur plusieurs instances potentiellement du schéma. L'avantage évident serait que la charge de recherche pour la grande table partitionnée peut désormais être répartie sur plusieurs serveurs (logiques ou physiques), et pas seulement sur plusieurs index sur le même serveur logique.

Source: Wiki-Shard .

Le partage est le processus de stockage des enregistrements de données sur plusieurs machines et constitue l'approche de MongoDB pour répondre aux exigences de la croissance des données. À mesure que la taille des données augmente, une seule machine peut ne pas être suffisante pour stocker les données ni fournir un débit de lecture et d'écriture acceptable. Le sharding résout le problème de la mise à l'échelle horizontale. Avec le partitionnement, vous ajoutez plus de machines pour prendre en charge la croissance des données et les exigences des opérations de lecture et d'écriture.

Source: MongoDB .

Aucune chance
la source
41

J'y ai également plongé et bien que je sois de loin la référence en la matière, il y a quelques faits clés que j'ai rassemblés et des points que j'aimerais partager:

Une partition est une division d'une base de données logique ou de ses éléments constitutifs en parties indépendantes distinctes. Le partitionnement de la base de données est normalement effectué pour des raisons de gestion, de performances ou de disponibilité, comme pour l'équilibrage de charge.

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

Le partage est un type de partitionnement, tel que le partitionnement horizontal (HP)

Il existe également le partitionnement vertical (VP) dans lequel vous divisez une table en parties distinctes plus petites. La normalisation implique également cette division des colonnes entre les tables, mais le partitionnement vertical va au-delà et partitionne les colonnes même lorsqu'elles sont déjà normalisées.

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

J'aime beaucoup la réponse de Tony Baco sur Quora où il vous fait penser en termes de schéma (plutôt que de colonnes et de lignes). Il affirme que...

Le « partitionnement horizontal », ou partitionnement, consiste à répliquer [copier] le schéma, puis à diviser les données en fonction d'une clé de partition .

Le « partitionnement vertical » consiste à diviser le schéma (et les données accompagnent le trajet).

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

Le guide de partitionnement de la base de données d'Oracle a quelques chiffres intéressants. J'ai copié quelques extraits de l'article.

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

Quand partitionner une table

Voici quelques suggestions pour partitionner une table:

  • Les tables supérieures à 2 Go doivent toujours être considérées comme des candidats au partitionnement.
  • Tables contenant des données historiques, dans lesquelles de nouvelles données sont ajoutées dans la partition la plus récente. Un exemple typique est un tableau historique où seules les données du mois en cours peuvent être mises à jour et les 11 autres mois sont en lecture seule.
  • Lorsque le contenu d'une table doit être réparti sur différents types de périphériques de stockage.

Élagage de partition

L'élagage de partition est le moyen le plus simple et le plus important d'améliorer les performances à l'aide du partitionnement. L'élagage des partitions peut souvent améliorer les performances des requêtes de plusieurs ordres de grandeur. Par exemple, supposons qu'une application contienne une table Commandes contenant un enregistrement historique des commandes et que cette table ait été partitionnée par semaine. Une requête demandant des commandes pour une seule semaine n'accéderait qu'à une seule partition de la table Commandes. Si la table Orders contenait 2 ans de données historiques, cette requête accèderait à une partition au lieu de 104 partitions. Cette requête pourrait potentiellement s'exécuter 100 fois plus rapidement simplement en raison de l'élagage de partition.

Stratégies de partitionnement

  • Intervalle
  • Hacher
  • liste

Vous pouvez lire leur texte et visualiser leurs images qui expliquent assez bien tout.

Et enfin, il est important de comprendre que les bases de données sont extrêmement gourmandes en ressources:

  • CPU
  • Disque
  • E / S
  • Mémoire

De nombreux DBA partitionneront sur la même machine, où les partitions partageront toutes les ressources mais fourniront une amélioration du disque et des E / S en fractionnant les données et / ou l'index.

Tandis que d'autres stratégies emploieront une architecture «sans partage» où les fragments résideront sur des unités de calcul séparées et distinctes (nœuds), ayant 100% du processeur, du disque, des E / S et de la mémoire pour eux-mêmes. Fournir son propre ensemble d'avantages et de complexités.

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

Jeach
la source
"Le partitionnement horizontal", ou partitionnement, consiste à répliquer [copier] le schéma, puis à diviser les données en fonction d'une clé de partition. " - c'est tautologique.
8bitjunkie
Il y a donc un miroir, et il est fragmenté, d'où l'étymologie.
mckenzm
5

Considérez une table dans la base de données avec 1 million de lignes et 100 colonnes Dans le partitionnement, vous pouvez diviser la table en 2 ou plusieurs tables ayant des propriétés telles que:

  1. 0,4 million de lignes (tableau1), 0,6 million de lignes (tableau2)

  2. 1 million de lignes et 60 colonnes (tableau1) et 1 million de lignes et 40 colonnes (tableau2)

    Il pourrait y avoir plusieurs cas comme ça

Il s'agit d'un partitionnement général

Mais Sharding se réfère au 1er cas uniquement où nous divisons les données sur la base de lignes. Si nous divisons la table en plusieurs tables, nous devons conserver plusieurs copies similaires de schémas, car nous avons maintenant plusieurs tables.

Vikas Bhandari
la source
1

Partage dans un cas particulier de partitionnement horizontal , lorsque les partitions s'étendent sur plusieurs instances de base de données. Si une base de données est partitionnée, cela signifie qu'elle est partitionnée par définition.

Pavel
la source
1

Lorsque vous parlez de partitionnement, n'utilisez pas le terme réplication ou réplication. La réplication est un concept différent et hors de la portée de cette page. Lorsque nous parlons de partitionnement, un meilleur mot est diviser et lorsque nous parlons de partitionnement, un meilleur mot est distribué. Dans la partition (normalement et pas toujours), les lignes de la table de grands ensembles de données sont divisées en deux ou plusieurs groupes disjoints (ne partageant aucune ligne). Vous pouvez appeler chaque groupe une partition. Ces groupes ou toutes les partitions restent sous le contrôle d'une seule instance RDMB et tout cela est logique. La base de chaque groupe peut être un hachage ou une plage, etc. colonne non nulle CREATE_DATE. Une fois que vous interrogez la base de données, si vous spécifiez une date de création entre le 01-01-1999 et le 31-12-2000, seules deux partitions seront frappées et ce sera séquentiel. J'ai fait la même chose sur DB pour plus de milliards d'enregistrements et le temps SQL est passé à 50 millis de 30 secondes en utilisant des indices, etc. Le partage consiste à héberger chaque partition sur un nœud / une machine différent. Maintenant, la recherche à l'intérieur des partitions / fragments peut se faire en parallèle.

Imran
la source
0

La partition horizontale lorsqu'elle est déplacée vers une autre instance de base de données * devient une partition de base de données .

L'instance de base de données peut être sur la même machine ou sur une autre machine.

Abbas
la source