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» ?
mysql
sharding
database-partitioning
Amit Sharma
la source
la source
Réponses:
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
la source
On dirait que ceci répond à vos deux questions:
Source: Wiki-Shard .
Source: MongoDB .
la source
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:
É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
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:
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
la source
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:
0,4 million de lignes (tableau1), 0,6 million de lignes (tableau2)
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.
la source
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.
la source
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.
la source
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.
la source