99 votes

Les approches de partage MySQL?

Quelle est la meilleure approche pour les tables MyShard Sharding? Les approches auxquelles je peux penser sont:

  1. Niveau d'application sharding?
  2. Sharding à la couche proxy MySQL?
  3. Serveur de recherche central pour le sharding?

Connaissez-vous des projets ou des outils intéressants dans ce domaine?

130voto

Isotopp Points 1908

La meilleure approche pour la fragmentation des tables MySQL de ne pas le faire, sauf s'il est totalement inévitable de le faire.

Lorsque vous écrivez une application, habituellement, vous voulez le faire d'une manière qui maximise la vitesse, développeur de vitesse. Vous optimisez le temps de latence (temps jusqu'à ce que la réponse est prête) ou le débit (nombre de réponses par unité de temps) uniquement lorsque c'est nécessaire.

Vous partition et ensuite affecter les partitions pour différents hôtes (= fragment) uniquement lorsque la somme de toutes ces partitions ne plus tenir sur une seule instance du serveur de base - la raison d'être soit écrit ou lit.

L'écriture de cas est soit a) la fréquence d'écriture est cette surcharge des serveurs de disques de façon permanente ou b) il y a trop écrit d'aller sur de sorte que la réplication de façon permanente gal dans ce réplication de hiérarchie.

Le lire en cas de fragmentation, c'est quand la taille des données est si grande que l'ensemble de travail de ne plus s'inscrit dans la mémoire et les lectures de données tapent sur le disque au lieu d'être servi à partir de la mémoire, la plupart du temps.

Seulement quand vous avez à tesson-vous de le faire.


Le moment où vous tesson, vous payez pour cela de plusieurs manières:

Une grande partie de votre SQL n'est plus déclaratif.

Normalement, en SQL, vous dites la base de données les données que vous voulez et de le laisser à l'optimiseur de transformer la spécification dans un programme d'accès aux données. C'est une bonne chose, parce qu'il est flexible, et parce que l'écriture de ces données, les programmes d'accès est ennuyeux de travail qui nuit à la vitesse.

Avec un environnement fragmenté, vous êtes probablement à joindre à une table sur Un nœud à l'encontre des données sur le nœud B, ou si vous avez une table plus gros qu'un nœud, sur les nœuds A et B et se joignent à des données sur des données sur le nœud B et C. Vous commencez à écrire logiciel de base de hachage rejoindre résolutions manuellement afin de résoudre ce (ou vous êtes réinventer le cluster MySQL), ce qui signifie que vous retrouvez avec beaucoup de SQL qui n'est plus déclarative, mais exprimant des fonctionnalités SQL dans une voie procédurale (par exemple, vous êtes à l'aide de SELECT dans les boucles).

Vous engager beaucoup de latence du réseau.

Normalement, une requête SQL peut être résolu localement et à l'optimiseur connaît les coûts associés avec le disque local accède et résout la requête d'une manière qui minimise les coûts.

Dans un environnement fragmenté, les requêtes sont résolues par l'exécution de clé-valeur accède à travers un réseau de plusieurs nœuds (espérons-le avec des lots clé d'accès et pas de clé individuelle des recherches par aller-retour) ou en poussant les parties de l' WHERE clause de partir vers les nœuds où ils peuvent être appliqués (qui est appelé "la condition refoulement"), ou les deux.

Mais même dans le meilleur des cas, cela implique beaucoup plus de réseau allers et retours qu'une situation locale, et c'est plus compliqué. Surtout depuis que l'optimiseur MySQL ne sait rien à propos de la latence du réseau (Ok, MySQL cluster est lentement mieux, mais pour la vanille MySQL à l'extérieur du cluster qui est toujours vraie).

Vous perdez beaucoup de puissance expressive de SQL.

Ok, c'est probablement moins important, mais les contraintes de clés étrangères et d'autres SQL mécanismes de l'intégrité des données sont incapable de se couvrant de multiples fragments.

MySQL n'a pas d'API qui permet de requêtes asynchrones qui est en ordre de marche.

Lorsque des données de même type se trouve sur plusieurs nœuds (par exemple, les données de l'utilisateur sur les nœuds A, B et C), horizontal requêtes doivent souvent être résolu par rapport à l'ensemble de ces nœuds ("Trouver tous les comptes d'utilisateurs qui n'ont pas été enregistré dans les 90 jours ou plus"). L'accès aux données en temps croît linéairement avec le nombre de nœuds, sauf si plusieurs nœuds peuvent être posées en parallèle et les résultats agrégés comme ils viennent dans ("Map-reduce").

La condition sine qua non est une communication asynchrone de l'API, qui n'existe pas pour MySQL dans une bonne forme. L'alternative est beaucoup de bifurquer et de connexions dans le processus fils, qui est en visite dans le monde de sucer sur une passe de saison.


Une fois que vous commencez la fragmentation, la structure de données et de la topologie du réseau deviennent visibles comme des points de performance pour votre application. Afin d'effectuer raisonnablement bien, votre application doit être conscient de ces choses, et qui signifie que vraiment que le niveau d'application de la fragmentation du sens.

La question est plus si vous voulez auto-tesson (détermination de la ligne qui va dans le nœud par hachage des clés primaires par exemple) ou si vous souhaitez diviser le plan fonctionnel dans une manière manuelle ("les tables relatives à La xyz article de l'utilisateur aller à ce maître, tandis que l'abc et def tables liées aller pour que le maître").

Fonctionnelle de fragmentation a l'avantage que, si c'est bien fait, il est invisible à la plupart des développeurs, la plupart du temps, parce que toutes les tables liées à leur utilisateur de l'histoire sera disponible localement. Qui leur permet de profiter encore de SQL déclarative aussi longtemps que possible, et qu'elle implique également moins de latence du réseau, parce que le nombre de croix-réseau de transferts est réduite au minimum.

Fonctionnelle de fragmentation a l'inconvénient de ne pas permettre qu'une seule table pour être plus grand qu'un exemple, et il exige manuel de l'attention d'un designer.

Fonctionnelle de fragmentation a l'avantage qu'il est relativement facile à faire à une base de code existante avec un certain nombre de changements qui n'est pas trop grande. http://Booking.com il l'a fait à plusieurs reprises au cours des dernières années et cela a bien fonctionné pour eux.


Après avoir dit tout cela, à la recherche à votre question, je crois que vous vous poser les mauvaises questions, ou je suis complètement à l'incompréhension de votre énoncé du problème.

13voto

chantheman Points 2097
  1. Le Niveau d'Application de la fragmentation: dbShards est le seul produit que je connaisse qui ne "conscient d'application de fragmentation". Il y a quelques bons articles sur le site web. Juste par définition, l'application consciente de fragmentation va être plus efficace. Si une application ne sait exactement où aller avec une transaction sans avoir à le rechercher ou d'obtenir redirigé par un proxy, qui dans son auto sera plus rapide. Et la vitesse est souvent l'une des principales préoccupations, si pas la seule préoccupation, quand quelqu'un est à la recherche dans la fragmentation.

  2. Certaines personnes "shard" avec un proxy, mais à mes yeux que de défaites le but de la fragmentation. Vous êtes simplement en utilisant un autre serveur pour raconter vos transactions où trouver les données ou de les stocker. Avec l'application consciente de fragmentation, votre application sait où aller sur son propre. Beaucoup plus efficace.

  3. C'est la même chose que #2 vraiment.

7voto

btcbb Points 71

Connaissez-vous des projets ou des outils intéressants dans ce domaine?

Plusieurs nouveaux projets dans cet espace:

  • citusdata.com
  • spockproxy.sourceforge.net
  • github.com/twitter/gizzard/

6voto

Andrey Frolov Points 1137

Le niveau d'Application des cours.

Meilleure approche que j'ai jamais rouge que j'ai trouvé dans ce livre

Haute Performance MySQL http://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064

Description courte: vous pouvez répartir vos données dans de nombreuses régions et de stocker ~50 partie sur chaque serveur. Il vous aidera à éviter le deuxième grand problème de la fragmentation, de rééquilibrage. Il suffit de déplacer certains d'entre eux vers le nouveau serveur et tout ira bien :)

Je vous recommande vivement de l'acheter et de le lire "mysql mise à l'échelle".

5voto

Justin Swanhart Points 1383

Fragment-Requête est une OLAP basé sur la fragmentation, la solution pour MySQL. Il permet de définir une combinaison de fragmenté tables et unsharded tables. Le unsharded tables (comme les tables de recherche) sont librement recrutables à fragmenté tables, et fragmenté les tables peuvent être joints l'un à l'autre tant que les tables sont jointes par le fragment de la clé (pas de croix éclat ou auto rejoint celle de la croix-fragment de frontières). Être une solution OLAP, Fragment de la Requête a généralement des temps de réponse réduits de 100ms ou moins, même pour les requêtes simples, donc il ne fonctionnera pas pour OLTP. Fragment de la Requête est conçu pour l'analyse de grands ensembles de données en parallèle.

OLTP la fragmentation des solutions existent pour MySQL. À code source fermé solutions comprennent ScaleDB, DBShards. Open source OLTP solution JetPants, Cubrid ou de Troupeau/Gésier (Twitter infrastructure).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X