Retour à l'accueil

Sharding uniforme de DB : Distribution des données et stratégies de recherche

L'article explique les principes du sharding uniforme de base de données pour le scaling horizontal. Il couvre les stratégies de distribution des données, la génération d'identifiants, la gestion des tables de référence et le traitement des requêtes de recherche avec paging dans les systèmes distribués.

Sharding uniforme : Comment distribuer les données sans clé de partitionnement
Advertisement 728x90

Sharding uniforme des bases de données : Stratégies de distribution et de gestion des requêtes

Le sharding uniforme est une technique de mise à l'échelle horizontale pour les bases de données où les données sont réparties sur des shards sans clé de partitionnement prédéfinie. Cette approche résout les problèmes lorsque la logique métier n'autorise pas une clé statique ou quand une clé perd de son efficacité avec le temps. L'objectif principal est d'équilibrer la charge et de répartir uniformément les enregistrements sur les nœuds, ce qui est essentiel pour les systèmes aux exigences évolutives.

Principes de la distribution uniforme des données

L'uniformité s'obtient par deux méthodes principales : sélection aléatoire du shard ou basée sur la charge des nœuds. La distribution aléatoire est simple à implémenter mais ne corrige pas les déséquilibres si les shards commencent avec des tailles différentes. Une approche plus flexible utilise des priorités de shards basées sur le nombre actuel d'enregistrements, permettant :

  • Un nivellement automatique de la charge, même à partir de points de départ inégaux.
  • La prise en compte du matériel hétérogène du cluster via des ajustements de priorités.
  • L'exclusion temporaire des shards des écritures (ex. : priorité 0) pour maintenance ou archivage.

Pour surveiller la charge, le service interroge périodiquement la taille des tables clés de chaque shard et met en cache ces valeurs pour minimiser la surcharge.

Google AdInline article slot

Génération et utilisation des identifiants d'objets

Dans le sharding uniforme, l'ID d'un objet doit intégrer l'information du shard, comme un offset ou une graine dans la clé numérique. Cela accélère les opérations OLTP comme SELECT et UPDATE par ID spécifique, car le shard est déterminé directement à partir de l'ID. La génération de clés nécessite une stratégie efficace :

  • Les demandes de clés doivent renvoyer des lots (ex. : NN clés d'un coup) plutôt que une par une pour éviter les goulots d'étranglement.
  • Les graines pour chaque table peuvent être stockées dans une table système du shard ou dans la configuration de connexion pour une gestion flexible.
  • Le service métier exécute une requête DML pour obtenir une nouvelle clé avant d'insérer un objet, garantissant l'intégrité des données.

Gestion des tables de référence et réplication logique

Les systèmes shardés incluent souvent des tables de référence (tables de lookup) petites, rarement mises à jour mais essentielles pour la précision des requêtes. Les bonnes pratiques comprennent :

  • Stocker les tables de référence dans une instance de base de données dédiée, avec mises à jour uniquement là.
  • Utiliser la réplication logique (ex. : mécanismes PostgreSQL) pour synchroniser ces tables vers les shards.
  • Cela réduit la charge sur les shards et simplifie la cohérence des données sans efforts de mise à jour redondants.

Recherche de données et pagination en environnements distribués

Avec le sharding uniforme, les recherches sans clé de shard connue nécessitent une coordination des nœuds. Prenons l'exemple de la récupération de la troisième page d'un flux de commandes, trié par date décroissante. Le coordinateur (proxy ou service métier) procède ainsi :

Google AdInline article slot
  • Diffuse la requête à tous les shards, en ajustant les bornes de page : LIMIT = taille_page * numéro_page + 1, OFFSET toujours 0.
  • Chaque shard renvoie les données triées localement dans la LIMIT.
  • Le coordinateur fusionne les résultats de tous les shards et effectue un tri global en une passe.
  • Il extrait la page demandée de la liste fusionnée et la renvoie à l'utilisateur.

Cela assure une cohérence de lecture mais peut être gourmand en mémoire pour une pagination profonde en raison du retri du coordinateur. Des atténuations incluent :

  • Les utilisateurs rarement ne creusent pas profondément dans les pages, optimisez pour les cas courants.
  • Pour les exports volumineux (ex. : XLSX/CSV), utilisez une génération de fichiers asynchrone par un service dédié avec beaucoup de mémoire, traitant les données séquentiellement.

Exemple d'implémentation de la pagination

Supposons une table shardée t1 avec une colonne id répartie sur les shards A et B. Une demande pour la première page de 2 enregistrements, triée par id croissant, devient : SELECT id FROM t1 ORDER BY id LIMIT 3 OFFSET 0. Le coordinateur l'envoie à chaque shard, fusionne et trie les résultats, puis renvoie la page. Pour la deuxième page, LIMIT passe à 5 (2 * 2 + 1), permettant de détecter plus de données et d'afficher un bouton "Page suivante". Cela équilibre performance et cohérence, s'adaptant à la profondeur de navigation.

Points clés

  • Le sharding uniforme gère les clés de partitionnement dynamiques via l'équilibrage de charge.
  • Intégrer l'info shard dans les ID des objets accélère les ops OLTP et le routage.
  • La réplication logique pour les tables de référence réduit la surcharge de mise à jour.
  • La pagination coordonnée nécessite une optimisation mémoire mais fonctionne bien pour les flux utilisateurs typiques.
  • Le traitement asynchrone convient aux exports de gros volumes, minimisant l'impact sur le système principal.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Lire ensuite