Présentation de la problématique

Les applications à grande échelle nécessitent souvent des milliers de serveurs pour gérer les requêtes et les données. La composante la plus difficile à mettre à l’échelle est généralement la base de données. Une seule base de données ne peut pas gérer une telle demande, il est donc nécessaire de répartir les requêtes et les données sur plusieurs serveurs à l’aide de la technique de sharding.

Limites de la mise à l’échelle verticale

La mise à l’échelle verticale, qui consiste à augmenter la puissance de calcul et la mémoire d’un serveur, ne peut pas résoudre tous les problèmes. Même avec des serveurs puissants, les goulots d’étranglement apparaissent rapidement, notamment en raison de la contention des ressources et de la cohérence des données. La loi de scalabilité universelle (USL) stipule que la contention des ressources entraîne une croissance sublinéaire de la scalabilité et que, à un certain stade, la perte de cohérence entraîne une dégradation des performances.

Mise en œuvre du sharding

Le sharding consiste à répartir les données et les requêtes sur plusieurs serveurs distincts. Cette technique permet de résoudre les problèmes de contention des ressources et de cohérence des données. Par exemple, pour stocker un pétaoctet de données, on peut utiliser 256 shards, chacun avec un serveur principal et deux réplicas, ce qui nécessite 768 serveurs. Cependant, cela ajoute une complexité significative à l’application, car il faut gérer la répartition des données et des requêtes, les sauvegardes, la surveillance de l’état du système, etc.

Résolution de la complexité

Pour résoudre cette complexité, on peut utiliser une couche de proxy qui situe entre les serveurs d’application et les serveurs de base de données. Cette couche de proxy permet de masquer la complexité du système de sharding et de présenter une interface unique aux serveurs d’application. Les solutions telles que Neki pour Postgres et Vitess pour MySQL offrent cette fonctionnalité. Le proxy PgBouncer est également utilisé pour la mise en pool de connexions et la mise en file d’attente des requêtes. Il accepte un grand nombre de connexions des clients et les achemine vers un pool de connexions plus petit qu’il maintient avec Postgres.

SELECT * FROM table_name;

En résumé, la mise à l’échelle d’une base de données nécessite souvent l’utilisation de la technique de sharding pour répartir les données et les requêtes sur plusieurs serveurs. Cependant, cela ajoute une complexité significative à l’application. L’utilisation d’une couche de proxy peut aider à résoudre cette complexité et à présenter une interface unique aux serveurs d’application.