web-dev-qa-db-fra.com

Limitations d'évolutivité de PostgreSQL et MySQL

J'ai entendu dire que les performances des bases de données relationnelles non partagées telles que MySQL ou PostgreSQL "cassent" au-delà de 10 To.

Je soupçonne que des limites en tant que telles existent, car on ne trouverait pas Netezza, Greenplum ou Vertica, etc., mais je voudrais demander si quelqu'un ici a une référence à un document de recherche ou à des études de cas formelles où ces limites sont quantifiées.

43
Edmon

Il n'y a pas de réponse simple à votre question, mais voici quelques éléments à considérer.

Premièrement, l'échelle n'est pas la seule chose à craindre. Ce que vous faites avec vos données, c'est. Si vous avez 500 tables 30 TB de données, et que vous faites de simples OLTP avec très peu de rapports, je ne pense pas que vous aurez trop de problèmes . Il existe des bases de données de 32 To sur PostgreSQL. Cependant, en même temps, les performances se dégraderont quelque peu, car il doit frapper le disque sur tout. De même, si vous avez 50 To si des données mais que vous disposez généralement d'un ensemble d'environ 100 Go, vous pouvez construire un serveur avec assez RAM pour garder cette partie de la base de données en mémoire et vous êtes en or.

D'un autre côté, si vous essayez de retirer le mode (valeur la plus courante) de 1 To de données, peu importe le système que vous utilisez, cela va être douloureux avec ou sans partitionnement. (Edit: Sharding peut, en fait, aggraver ce problème . )

Les problèmes majeurs que vous rencontrerez avec d'énormes bases de données sur MySQL et PostgreSQL impliquent le fait qu'aucun ne prend en charge le parallélisme intra-requête. En d'autres termes, une requête est exécutée en tant que bloc unique par un seul thread, et elle ne peut pas être décomposée en morceaux et exécutée séparément. Il s'agit le plus souvent d'un problème lors de l'exécution de grandes requêtes analytiques sur de grandes quantités de données. C'est là que Postgres-XC et Green Plum viennent à la rescousse car ils séparent le stockage de l'exécution, et peuvent le faire au niveau du coordinateur. Notez que Postgres-XC et Green Plum utilisent essentiellement le sharding en interne mais les coordinateurs appliquent toute la cohérence à l'échelle mondiale.

Avec le parallélisme intra-requête, vous pouvez décomposer la requête, faire en sorte que différents processeurs/canaux d'E/S disque en exécutent des parties et rapporter des morceaux du jeu de résultats à assembler et à renvoyer à l'application. Encore une fois, cela est généralement plus utile pour l'analyse que pour le traitement des transactions.

La deuxième chose est que certains systèmes, comme Vertica ou Greenplum stockent ensemble des colonnes d'informations. Cela rend le système plus difficile à utiliser du point de vue OLTP et y diminue les performances, mais il augmente considérablement les performances pour les grandes charges de travail analytiques. Il s'agit donc d'un compromis spécifique à la charge de travail.

Donc, la réponse est qu'une fois que vous avez dépassé 1-2 TB en taille, vous pouvez vous retrouver face à un nombre des compromis entre les systèmes et les charges de travail. Encore une fois, cela est spécifique aux bases de données, à la taille des ensembles de travail, etc.

Cela signifie bien sûr que les limites ne sont généralement pas quantifiables.

Edit: J'ai maintenant travaillé avec une base de données de 9 To qui gère un mélange d'aide à la décision et de charges de travail de traitement transactionnel dans PostgreSQL. Le plus grand défi est que si vous avez des questions qui touchent de grandes parties de l'ensemble de données, vous devrez attendre un certain temps pour obtenir la réponse.

Cependant, avec une attention particulière aux fondamentaux (y compris les index, l'auto-vide, leur fonctionnement à bas niveau, etc.) et des ressources informatiques suffisantes, celles-ci sont entièrement gérables (et j'estime qu'elles seraient gérables bien dans la plage de 30 To en Pg).

Edit2: Une fois que vous vous dirigez vers 100 To, ce qui fonctionne dépendra de votre ensemble de données. Je travaille sur un en ce moment qui ne sera pas mis à l'échelle dans cette plage, car il atteindra d'abord la limite de 32 To par table dans PostgreSQL.

52
Chris Travers