Partitionnement MySQL / Sharding / Splitting – comment aller?

Nous avons une firebase database InnoDB d’environ 70 Go et nous prévoyons qu’elle atteindra plusieurs centaines de Go d’ici 2 à 3 ans. Environ 60% des données appartiennent à un seul tableau. Actuellement, la firebase database fonctionne assez bien car nous avons un serveur avec 64 Go de RAM, donc presque toute la firebase database tient dans la mémoire, mais l’avenir nous préoccupe lorsque la quantité de données sera considérablement plus grande. En ce moment, nous envisageons un moyen de diviser les tables (en particulier celle qui représente la plus grande partie des données) et je me demande maintenant quelle serait la meilleure façon de le faire.

Les options dont je suis au courant sont

  • Utiliser le partitionnement MySQL fourni avec la version 5.1
  • Utiliser une sorte de bibliothèque tierce qui encapsule le partitionnement des données (comme les fragments en veille prolongée)
  • Nous l’implémentons nous-mêmes dans notre application

Notre application est construite sur J2EE et EJB 2.1 (nous espérons passer un jour à l’EJB 3).

Que suggérerais-tu?

EDIT (2011-02-11):
Juste une mise à jour: Actuellement, la taille de la firebase database est de 380 Go, la taille des données de notre “grande” table est de 220 Go et la taille de son index est de 36 Go. Donc, alors que la table entière ne rentre plus dans la mémoire, l’index le fait.
Le système fonctionne toujours correctement (toujours sur le même matériel) et nous envisageons toujours de partitionner les données.

EDIT (2014-06-04): Une mise à jour supplémentaire: la taille de la firebase database entière est de 1,5 To, la taille de notre “grosse” table est de 1,1 To. Nous avons mis à niveau notre serveur vers une machine à 4 processeurs (Intel Xeon E7450) avec 128 Go de RAM. Le système fonctionne toujours correctement. Ce que nous prévoyons de faire ensuite, c’est de mettre notre grande table sur un serveur de firebase database séparé (nous avons déjà effectué les modifications nécessaires dans notre logiciel) tout en mettant à niveau simultanément le nouveau matériel avec 256 Go de RAM.

Cette configuration est censée durer deux ans. Ensuite, nous devrons soit commencer à mettre en œuvre une solution de partitionnement, soit simplement acheter des serveurs avec 1 To de RAM, ce qui devrait nous permettre de continuer pendant un certain temps.

EDIT (2016-01-18):

Nous avons depuis mis notre grande table dans sa propre firebase database sur un serveur séparé. Actuellement, la taille de cette firebase database est d’environ 1,9 To, la taille de l’autre firebase database (avec toutes les tables sauf la “grande”) est de 1,1 To.

Configuration matérielle actuelle:

  • HP ProLiant DL 580
  • 4 processeurs Intel (R) Xeon (R) E7-4830
  • 256 Go de RAM

Les performances sont bonnes avec cette configuration.

Si vous pensez que vous allez être lié à la mémoire IO, je ne pense pas que le partitionnement sera utile. Comme d’habitude, l’parsing comparative vous aidera d’abord à déterminer la meilleure direction. Si vous ne disposez pas de serveurs de secours avec 64 Go de mémoire, vous pouvez toujours demander à votre fournisseur une «unité de démonstration».

Je me pencherais sur le sharding si vous ne vous attendez pas à un rapport d’agrégation de 1 requête. Je suppose que vous partageriez toute la firebase database et pas seulement votre grande table: il est préférable de conserver des entités entières. Eh bien, si votre modèle se divise bien, de toute façon.

Vous allez certainement commencer à rencontrer des problèmes sur cette table de 42 Go une fois qu’il ne rentre plus dans la mémoire. En fait, dès qu’il ne rentre plus dans la mémoire, les performances se dégraderont extrêmement rapidement. Une façon de tester est de placer cette table sur une autre machine avec moins de mémoire vive et de voir à quel point elle fonctionne mal.

Tout d’abord, il n’est pas important de diviser autant de tables à moins de déplacer certaines tables dans un volume physique distinct.

Ceci est une erreur. Le partitionnement (soit via la fonctionnalité MySQL 5.1, soit la même chose avec les tables MERGE) peut offrir des avantages significatifs en termes de performances même si les tables sont sur le même lecteur.

Par exemple, supposons que vous exécutiez des requêtes SELECT sur votre grande table en utilisant une plage de dates. Si la table est entière, la requête sera obligée d’parsingr la table entière (et à cette taille, même l’utilisation d’index peut être lente). L’avantage du partitionnement est que vos requêtes ne s’exécutent que sur les partitions où c’est absolument nécessaire. Si chaque partition a une taille de 1 Go et que votre requête doit uniquement accéder à 5 partitions pour s’acquitter de sa tâche, la table combinée de 5 Go est beaucoup plus facile à gérer pour MySQL qu’une version monster 42 Go.

Une chose que vous devez vous poser est de savoir comment vous interrogez les données. S’il est possible que vos requêtes aient uniquement besoin d’accéder à certains blocs de données (par exemple, une plage de dates ou une plage d’ID), un partitionnement quelconque s’avérera bénéfique.

J’ai entendu dire que MySQL 5.1 contenait encore des buggings, en particulier en ce qui concerne le choix de MySQL. Les tables MERGE peuvent fournir les mêmes fonctionnalités, même si elles nécessitent un peu plus de temps.

J’espère que ça aide … bonne chance!

Ceci est un excellent exemple de ce que le partitionnement MySql peut faire dans un exemple réel de stream de données volumineux:

http://web.archive.org/web/20101125025320/http://www.sortingtux.com/blog/2010/11/19/partitioning-mysql-database-with-high-load-solutions/11/1

En espérant que ce sera utile pour votre cas.

Il y a quelque temps, lors d’un événement Microsoft ArcReady, j’ai vu une présentation sur les modèles de mise à l’échelle qui pourrait vous être utile. Vous pouvez afficher les diapositives en ligne.

Je voudrais aller pour MariaDB InnoDB + Partitions (soit par clé ou par date, en fonction de vos requêtes).

Je l’ai fait et maintenant je n’ai plus de problèmes de firebase database.

MySQL peut être remplacé par MariaDB en quelques secondes … tous les fichiers de la firebase database restnt les mêmes.

Tout d’abord, il n’est pas important de diviser autant de tables à moins de déplacer certaines tables dans un volume physique distinct.

Deuxièmement, ce n’est pas nécessairement la table avec la plus grande taille physique que vous souhaitez déplacer. Vous pouvez avoir une table beaucoup plus petite qui obtient plus d’activité, tandis que votre grande table rest assez constante ou n’ajoute que des données.

Quoi que vous fassiez, ne l’implémentez pas vous-même. Laissez le système de firebase database le gérer.

Que fait la grande table?

Si vous voulez le séparer, vous avez quelques options:
– Diviser en utilisant le système de firebase database (ne sait pas grand chose à ce sujet)
– Diviser par ligne.
– le diviser par colonne.

Le fractionnement par ligne ne serait possible que si vos données peuvent être facilement séparées en morceaux. Par exemple, quelque chose comme Basecamp a plusieurs comptes complètement séparés. Vous pouvez conserver 50% des comptes dans une table et 50% dans une table différente sur une autre machine.

La division par colonne est appropriée pour les situations où la taille de la ligne contient des champs de texte volumineux ou des objects BLOB. Si vous avez une table avec (par exemple) une image utilisateur et un énorme bloc de texte, vous pouvez regrouper l’image dans une table complètement différente. (sur une machine différente)

Vous rompez la normalisation ici, mais je ne pense pas que cela causerait trop de problèmes.

Comme d’habitude, l’parsing comparative vous aidera d’abord à déterminer la meilleure direction.

C’est ce que la plupart des gens me disent, alors je pense que je vais enfin devoir prendre cette pilule …

Vous voudrez probablement diviser cette grande table éventuellement. Vous voudrez probablement le mettre sur un disque dur séparé, avant de penser à un second serveur. Le faire avec MySQL est l’option la plus pratique. Si c’est possible, alors allez-y.

MAIS

Tout dépend vraiment de la manière dont votre firebase database est utilisée, vraiment. Statistiques.