2009-06-14 6 views
148

Je pense que je comprends que le sharding consiste à remettre vos données découpées (les partitions) dans un format facile à utiliser avec un agrégat logique dans le contexte. Est-ce correct?Qu'est-ce que le sharding et pourquoi est-ce important?

Mise à jour: Je suppose que je me bats ici. À mon avis, le niveau d'application ne devrait pas avoir d'entreprise déterminant où les données doivent être stockées. Au mieux, il devrait être un client de shard de quelque sorte. Les deux réponses ont répondu à la question, mais pas à l'aspect important. Quelles implications a-t-elle en dehors des gains de performance évidents? Ces gains sont-ils suffisants pour compenser la violation du MVC? Le sharding est-il surtout important dans les applications à très grande échelle ou s'applique-t-il aux plus petites?

+1

Aurait-on de ces webinaires être utile http://vimeo.com/26742356 http://www.slideshare.net/rightscale/rightscale-webinar-scaling? -votre-base-de-données-dans-le-nuage http://vimeo.com/32541189 –

Répondre

140

Sharding est juste un autre nom pour "partitionnement horizontal" d'une base de données. Vous pourriez vouloir chercher ce terme pour le rendre plus clair.

De Wikipedia:

partitionnement horizontal

est un principe de conception de sorte que les lignes d'une table de base de données sont maintenues séparément, plutôt que de diviser par des colonnes (comme pour la normalisation). Chaque partition fait partie d'un fragment, qui peut à son tour se trouver sur un serveur de base de données distinct ou un emplacement physique. L'avantage est que le nombre de lignes dans chaque table est réduit (cela réduit la taille de l'index, améliorant ainsi les performances de recherche). Si la fragmentation est basée sur un aspect réel des données (par exemple, les clients européens par rapport aux clients américains), il est alors possible de déduire facilement et automatiquement l'appartenance de partition appropriée et d'interroger uniquement la partition concernée.

Quelques informations sur sharding:

Tout d'abord, chaque serveur de base de données est identique, ayant la même structure de table. Deuxièmement, les enregistrements de données sont divisés logiquement dans une base de données partitionnée. Contrairement à la base de données partitionnée, chaque enregistrement de données complet existe dans un seul fragment (à moins qu'il n'y ait une mise en miroir pour la sauvegarde/redondance) avec toutes les opérations CRUD effectuées uniquement dans cette base de données. Vous pouvez ne pas aimer la terminologie utilisée, mais cela représente une manière différente d'organiser une base de données logique en parties plus petites.

Mise à jour: Vous ne casserez pas MVC. Le travail de déterminer la partition correcte où stocker les données serait effectué de manière transparente par votre couche d'accès aux données. Là, vous devez déterminer la partition correcte en fonction des critères que vous avez utilisés pour partitionner votre base de données. (Comme vous devez partitionner manuellement la base de données dans différents fragments en fonction de certains aspects concrets de votre application.) Vous devez ensuite faire attention en chargeant et en stockant les données de/dans la base de données pour utiliser le fragment correct.

Peut-être this example avec le code Java rend un peu plus clair (il s'agit du projet Hibernate Shards), comment cela fonctionnerait dans un scénario réel.

Pour faire face au « why sharding »: Il est principalement que pour les applications à très grande échelle, avec beaucoup des données. Tout d'abord, il permet de réduire les temps de réponse pour les requêtes de base de données. Deuxièmement, vous pouvez utiliser des machines moins chères, "bas de gamme", pour héberger vos données, au lieu d'un seul gros serveur, ce qui ne suffira peut-être plus.

+1

Pardonnez-moi, mais la base de données ne devrait-elle pas déterminer où stocker les données? Cela affecte-t-il le code au niveau de l'application? – ojblass

+4

J'ai longtemps essayé de comprendre à quel point c'est différent du partitionnement horizontal, et le lien dans votre réponse prouve qu'il n'y a pas de différence. Comme quelqu'un le dit dans les commentaires à la publication de Theo Schlossnagle, "... Si vous êtes issu d'une culture de base de données traditionnelle, vous faites du partitionnement horizontal, si vous êtes issu d'une culture Web, c'est 'Sharding' ..." – andreister

+0

@andreister En lecture, le sharding est conceptuellement différent en ce sens qu'il est défini par une mise à l'échelle horizontale sur plusieurs nœuds logiques ou physiques (dans le cas de plusieurs bases de données (mySQL), probablement hébergées sur un matériel logique différent). Le partitionnement horizontal est un terme moins spécifique, dont "Sharding" est un sous-ensemble. Toujours en utilisant mySQL comme exemple, une partition mySQL est gérée par une seule instance db, transparente à 100% pour l'application. Une approche par fragmentation impliquerait un proxy ou une application qui choisirait intelligemment quelle instance. – NateDSaint

26

Si vous avez des requêtes sur un SGBD dont la localité est assez restreinte (par exemple, un utilisateur ne sélectionne qu'un "où username = $ mon_utilisateur") il est logique de placer tous les noms d'utilisateurs commençant par AN sur un serveur et tout de MZ de l'autre. Vous obtenez ainsi une mise à l'échelle linéaire pour certaines requêtes.

Longue histoire courte: Sharding est fondamentalement le processus de distribution de tables sur différents serveurs afin d'équilibrer la charge sur les deux également.

Bien sûr, c'est tellement plus compliqué en réalité. :)

+0

Donc la fragmentation affecte la conception des données que vous stockez ... désolé si je ne comprends pas tout à fait – ojblass

+1

J'ai ajouté une autre phrase à rends plus clair – bayer

+0

N'est-ce pas un partitionnement horizontal? – harunurhan

2

est-sharding surtout important dans très applications à grande échelle ou il ne applique à plus petits à l'échelle?

La mise en forme est un problème si et seulement si vos besoins dépassent ce qui peut être servi par un seul serveur de base de données. C'est un outil de gonflement si vous avez des données partageables et que vous avez des exigences de performance et d'évolutivité incroyablement élevées. Je devine que dans toutes mes 12 années, j'ai été un professionnel du logiciel, j'ai rencontré une situation qui aurait pu bénéficier de sharding. C'est une technique avancée avec une applicabilité très limitée. En outre, le futur sera probablement quelque chose d'amusant et excitant comme un «nuage» d'objets massif qui efface toutes les limitations de performance potentielles, n'est-ce pas? :)

1

À mon avis, le niveau d'application devrait avoir rien à déterminer où les données doivent être stockées

C'est une bonne règle, mais comme la plupart des choses pas toujours correctes. Quand vous faites votre architecture, vous commencez avec des responsabilités et des collaborations. Une fois que vous avez déterminé votre architecture fonctionnelle, vous devez équilibrer les forces non fonctionnelles. Si l'une de ces forces non fonctionnelles est une évolutivité massive, vous devez adapter votre architecture pour répondre à cette contrainte, même si cela signifie que l'abstraction de votre stockage de données se répercute maintenant dans votre niveau applicatif.

+1

Le niveau application peut toujours créer une séparation entre la logique d'accès aux données et les règles métier. Cela signifie simplement que vous avez des couches conceptuelles supplémentaires dans la couche "niveau d'application". – Eric

4

Sharding a été inventé à l'origine par les ingénieurs google et vous pouvez le voir très utilisé lors de la rédaction d'applications sur Google App Engine. Étant donné que la quantité de ressources que vos requêtes peuvent utiliser est limitée et que les requêtes elles-mêmes ont des limitations strictes, le partitionnement est non seulement encouragé mais presque imposé par l'architecture.

Un autre fragment peut être utilisé pour réduire la contention sur les entités de données. Il est particulièrement important lors de la création de systèmes évolutifs de surveiller les données souvent écrites car elles constituent toujours le goulot d'étranglement. Une bonne solution consiste à séparer cette entité spécifique et à écrire en plusieurs exemplaires, puis à lire le total. Un exemple de cette « contre-WRT GAE fragmentées: http://code.google.com/appengine/articles/sharding_counters.html

+2

<< Sharding a été inventé par google ingénieurs >> - pas vrai. Google a été fondée en 1998. scholar.google.com trouve des articles datant des années 1980 comme «Éliminer les informations obsolètes dans un système de base de données répliqué» ... Le Système pour les données répliquées hautement disponibles (SHARD) développé au CCA ... Je me souviens avoir entendu des gens parler de sharding à l'époque. –

Questions connexes