Sharding
Technique de partitionnement horizontal qui divise une base de données en fragments distribués pour améliorer performance et scalabilité.
Mis à jour le 27 janvier 2026
Le sharding est une stratégie d'architecture de base de données qui consiste à diviser horizontalement les données en partitions distinctes appelées « shards », distribuées sur plusieurs serveurs ou instances. Cette approche permet de gérer des volumes massifs de données et un trafic élevé en répartissant la charge, offrant ainsi une scalabilité quasi-linéaire et des performances optimisées pour les applications à grande échelle.
Fondements du Sharding
- Partitionnement horizontal des données basé sur une clé de sharding (shard key) déterminant la distribution
- Architecture distribuée où chaque shard fonctionne comme une base de données autonome avec son propre schéma
- Mécanisme de routage intelligent qui dirige les requêtes vers le shard approprié selon la clé
- Isolation des données garantissant qu'un shard n'interfère pas avec les autres en termes de ressources
Avantages Stratégiques
- Scalabilité horizontale illimitée : ajout de nouveaux shards pour absorber la croissance sans limitation théorique
- Performance améliorée : réduction de la taille des index et des temps de requête par division du dataset
- Disponibilité accrue : l'indisponibilité d'un shard n'affecte qu'une partie des données, pas l'ensemble du système
- Distribution géographique : possibilité de placer les shards près des utilisateurs pour réduire la latence
- Isolation des ressources : prévention des scénarios où un client monopolise toutes les ressources (noisy neighbor)
Exemple Concret : Sharding d'une Plateforme E-commerce
Considérons une plateforme e-commerce mondiale avec 50 millions d'utilisateurs. Plutôt qu'une base de données monolithique, on implémente un sharding basé sur la région géographique :
// Configuration de sharding basée sur la région
interface ShardConfig {
shardId: string;
region: string;
connectionString: string;
userIdRange?: [number, number];
}
const shardMap: ShardConfig[] = [
{
shardId: 'shard-eu-west',
region: 'EU',
connectionString: 'postgres://eu-west-1.rds.amazonaws.com',
userIdRange: [1, 10000000]
},
{
shardId: 'shard-us-east',
region: 'US',
connectionString: 'postgres://us-east-1.rds.amazonaws.com',
userIdRange: [10000001, 30000000]
},
{
shardId: 'shard-apac',
region: 'APAC',
connectionString: 'postgres://ap-southeast-1.rds.amazonaws.com',
userIdRange: [30000001, 50000000]
}
];
// Router qui sélectionne le bon shard
class ShardRouter {
private shards: Map<string, ShardConfig>;
constructor(configs: ShardConfig[]) {
this.shards = new Map(configs.map(c => [c.shardId, c]));
}
// Stratégie 1: Basée sur un hash de la clé
getShardByHash(userId: number): ShardConfig {
const shardIndex = userId % this.shards.size;
return Array.from(this.shards.values())[shardIndex];
}
// Stratégie 2: Basée sur des ranges prédéfinis
getShardByRange(userId: number): ShardConfig | null {
for (const shard of this.shards.values()) {
const [min, max] = shard.userIdRange || [0, 0];
if (userId >= min && userId <= max) {
return shard;
}
}
return null;
}
// Stratégie 3: Basée sur la géolocalisation
getShardByRegion(region: string): ShardConfig | null {
return Array.from(this.shards.values())
.find(s => s.region === region) || null;
}
}
// Utilisation dans un service
class UserService {
private router: ShardRouter;
constructor(router: ShardRouter) {
this.router = router;
}
async getUserOrders(userId: number, userRegion: string) {
// Sélection du shard approprié
const shard = this.router.getShardByRegion(userRegion);
if (!shard) {
throw new Error('No shard available for region');
}
// Connexion au shard spécifique
const connection = await this.connectToShard(shard);
// Requête limitée à ce shard
return connection.query(
'SELECT * FROM orders WHERE user_id = $1',
[userId]
);
}
private async connectToShard(shard: ShardConfig) {
// Logique de connexion au shard
return { query: async (sql: string, params: any[]) => [] };
}
}Mise en Œuvre du Sharding
- Analyser les patterns d'accès aux données pour identifier la meilleure clé de sharding (user_id, tenant_id, région)
- Choisir une stratégie de distribution : hash-based (uniforme), range-based (prévisible) ou directory-based (flexible)
- Implémenter une couche de routage qui intercepte les requêtes et les dirige vers le bon shard
- Configurer la réplication au sein de chaque shard pour garantir haute disponibilité et tolérance aux pannes
- Mettre en place un mécanisme de rééquilibrage pour redistribuer les données lors de l'ajout de nouveaux shards
- Développer une stratégie de sauvegarde et de récupération adaptée à l'architecture distribuée
- Monitorer les métriques par shard (charge CPU, I/O, distribution des données) pour détecter les déséquilibres
Conseil Pro
Évitez les « hot shards » en choisissant une clé de sharding qui distribue uniformément la charge. Par exemple, un sharding basé uniquement sur la date créerait un hot spot sur le shard le plus récent. Privilégiez des clés composites (user_id + timestamp hashé) ou des stratégies de consistent hashing pour une distribution équilibrée même lors de l'ajout/suppression de shards.
Outils et Technologies Associés
- MongoDB avec sharding natif et balancer automatique
- Vitess pour le sharding transparent de MySQL à grande échelle
- Citus pour transformer PostgreSQL en base distribuée avec sharding automatique
- Apache Cassandra avec partitionnement distribué intégré
- Redis Cluster pour le sharding de cache en mémoire
- ProxySQL ou pgBouncer pour le routage intelligent des requêtes
- Consistent hashing libraries (HashRing, Jump Hash) pour la distribution
Le sharding représente une solution architecturale puissante pour les organisations confrontées à une croissance exponentielle de leurs données. Bien qu'il introduise une complexité opérationnelle (gestion des jointures cross-shard, transactions distribuées, migrations), les gains en scalabilité et performance justifient cet investissement pour les applications à fort trafic. Une stratégie de sharding bien conçue transforme une limitation technique en avantage compétitif, permettant de maintenir des temps de réponse constants quelle que soit l'échelle.

