Ce document contient des informations qui vous aideront à effectuer une division préalable de votre base de données.
Spanner gère les divisions de base de données et s'adapte aux changements de charge et de taille. La division et la fusion sont dynamiques et basées sur le trafic. Lorsqu'une division reçoit plus de trafic, Spanner la subdivise en plages plus petites et redistribue les divisions obtenues sur les autres ressources disponibles de l'instance. Spanner fusionne la division lorsque celle-ci reçoit systématiquement moins de trafic.
Le fractionnement n'est pas instantané. Si la répartition et le rééquilibrage ne peuvent pas suivre le trafic, une division peut potentiellement utiliser ses ressources de calcul et de mémoire disponibles. Dans ce cas, le programmeur de travail de Spanner place d'autres requêtes en file d'attente, ce qui augmente la latence, ce qui peut entraîner des délais avant expiration et des transactions annulées.
Grâce à la division préalable de la base de données, Spanner peut se préparer à une hausse prévisible du trafic. Vous pouvez effectuer une division préalable de votre base de données en créant des points de division.
Envisagez de procéder à une division préalable de votre base de données dans les cas suivants:
- Vous chargez pour la première fois un ensemble de données volumineux dans de nouvelles tables et de nouveaux index d'une base de données Spanner, par exemple lors d'un chargement groupé ponctuel.
- Vous prévoyez une augmentation de la charge de trafic dans une base de données Spanner existante dans un avenir proche. Par exemple, vous pouvez avoir besoin de gérer un événement générant du trafic de grande ampleur, comme un lancement de produit ou une campagne de vente.
Déterminer le nombre de divisions
Nous vous recommandons de créer 10 points de division par nœud. Étant donné que Spanner peut répartir le trafic et s'y adapter rapidement pour les petites instances, vous n'avez pas besoin de procéder à une division préalable.
Déterminer les points de division
Tenez compte des points suivants lorsque vous déterminez les points de division de votre base de données:
Si votre trafic est réparti uniformément sur la plage de clés, par exemple lorsque vous utilisez des UUID ou des clés de séquence avec inversion du bit, choisissez des points de division qui divisent uniformément l'espace clé de trafic post-trafic.
Si votre trafic est concentré sur un ensemble de plages de clés connues, divisez et isolez ces plages de clés.
Si vous prévoyez du trafic sur vos index, utilisez des points de division sur l'index correspondant.
Les tables entrelacées sont divisées si des points de division sont ajoutés à la table parente. Si vous prévoyez un trafic plus important sur la table entrelacée, veillez à utiliser des points de division dans la table entrelacée correspondante.
Vous pouvez allouer les points de division aux objets de schéma de manière proportionnelle à l'augmentation du trafic.
Exemple de workflow permettant de déterminer les points de division
Supposons que votre base de données possède les structures de table définies par le LDD suivant:
CREATE TABLE UserInfo (
UserId INT64 NOT NULL,
Info BYTES(MAX),
) PRIMARY KEY (UserId);
CREATE TABLE UserLocationInfo (
UserId INT64 NOT NULL,
LocationId STRING(MAX) NOT NULL,
ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;
CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);
UserId
est un hachage généré de manière aléatoire dans l'espace INT64
. Vous devez ajouter 100 points de division pour répartir uniformément l'augmentation prévue du trafic sur la table UserInfo
et ses tables entrelacées. Comme les points de division sont répartis uniformément, vous devez trouver le nombre de lignes, ou offset
, entre chaque point de division:
offset
= valeur maximale de la plage UserId
/ 99
Ensuite, les points de division de la table UserInfo
sont déterminés à partir de la première ligne de UserId
, soit UserId_first
. Pour déterminer le Nième point de division, utilisez le calcul suivant:
Point de division N: UserId_first
+ (offset
* (N-1))
Par exemple, le premier point de division est UserId_first
+ (offset
* 0) et le troisième point de division est UserId_first
+ (offset
* 2).
Comme la table UserLocationInfo
est une table entrelacée de la table UserInfo
, elle est également divisée au niveau des limites UserId
. Vous pouvez également créer des points de fractionnement dans la table UserLocationInfo
de la colonne LocationId
.
Notez que LocationId
suit le format $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER
, par exemple US_CA_SVL_MTL_1100_7
.
Pour une UserId
, en fonction du préfixe de la chaîne LocationId
, vous pouvez déterminer les divisions afin de placer la table UserLocationInfo
pour UserId
dans trois pays différents dans trois divisions différentes:
- Point de division 1: (1 000, "CN")
- Point de division 2: (1000, "FR")
- Point de division 3: (1 000, "US")
Vous pouvez ajouter de nouveaux points de division à l'aide d'un simple préfixe et n'avez pas besoin de correspondre au format spécifié pour une colonne ou un index. Dans cet exemple, les points de division ne correspondent pas au format spécifié pour LocationId
et n'utilisent que $COUNTRY
comme préfixe.
Si vous souhaitez diviser l'index UsersByLocation
, vous pouvez répartir uniformément les points de division sur la colonne LocationId
ou isoler quelques valeurs de colonne LocationId
susceptibles de générer davantage de trafic:
- Point de division 1 : "CN"
- Point de division 2 : "US"
- Point de division 3 : "US_NYC"
Vous pouvez diviser davantage l'index en utilisant les éléments clés de la table indexées pour les emplacements qui reçoivent encore plus de trafic. Par exemple, si vous vous attendez à ce que l'emplacement CN
enregistre une augmentation du trafic, vous pouvez introduire les points de division suivants:
- Point de division 1 : "CN" et TableKey: (1000, "CN")
- Point de division 2 : "CN" et TableKey: (2000, "CN")
- Point de division 3 : "CN" et TableKey: (3000, "CN")
Expiration du point de fractionnement
Vous pouvez définir un délai d'expiration pour chaque point de fractionnement. Selon votre cas d'utilisation, configurez vos points de fractionnement pour qu'ils expirent après la baisse de l'augmentation prévue du trafic.
Le délai d'expiration par défaut est de 10 jours à compter de la création ou de la mise à jour du fractionnement. Le délai d'expiration maximal autorisé est de 30 jours à compter de la création ou de la mise à jour de la répartition.
Une fois la division arrivée à expiration, Spanner prend en charge la gestion de la division et vous ne pouvez plus la visualiser. Spanner peut fusionner la division en fonction du trafic.
Vous pouvez également mettre à jour le délai d'expiration d'un point de fractionnement avant qu'il n'expire. Par exemple, si l'augmentation du trafic n'a pas diminué, vous pouvez augmenter le délai d'expiration du fractionnement. Si vous n'avez plus besoin d'un point de fractionnement, vous pouvez le configurer pour qu'il expire immédiatement. Pour savoir comment définir le délai d'expiration des points de fractionnement, consultez la section Faire expirer un point de fractionnement.
Résultats de la division préalable de votre base de données
Les résultats suivants sont probables après l'ajout des points de division:
Modifications de la latence: l'ajout de points de division est un moyen de simuler des augmentations de trafic sur la base de données. Lorsqu'une base de données comporte davantage de divisions, la latence de lecture et d'écriture peut augmenter de façon permanente en raison de l'augmentation du nombre de participants aux transactions et de la répartition des requêtes. Vous pouvez également vous attendre à une augmentation de l'utilisation du calcul et des requêtes par requête de lecture ou d'écriture.
Efficacité des points de division: pour déterminer si les points de division ajoutés sont bénéfiques, surveillez le profil de latence pour obtenir des modifications minimales et le visualisateur clé pour identifier les points d'accès. Si vous remarquez des hotspots, vous pouvez les faire expirer immédiatement et en créer d'autres. Pour en savoir plus sur l'expiration des points de fractionnement, consultez la section Faire expirer un point de fractionnement. Envisagez d'introduire un plus petit nombre de divisions dans la prochaine itération d'ajout de divisions et observez le profil de latence.
Comportement des points de division après l'augmentation du trafic: les points de division ajoutés doivent être supprimés une fois que l'augmentation du trafic se stabilise. Il est possible que la distribution fractionnée ne converge pas vers l'endroit où elle se trouvait avant l'augmentation de la charge. La base de données peut s'appuyer sur un profil de latence différent en raison de la modification du trafic et de la répartition requise pour prendre en charge le trafic.
Exemple d'utilisation
Considérez que vous êtes administrateur de base de données dans une entreprise de jeux vidéo et que vous prévoyez une augmentation du trafic pour le lancement d'un nouveau jeu. Vous prévoyez du trafic sur les nouvelles tables qui sont vides.
Vous devez vous assurer qu'il n'y a pas d'interruption de service lors de la transmission du trafic, afin qu'il n'y ait pas d'impact observable sur la latence ou les taux d'erreur.
Prenons la stratégie générale de division préalable suivante pour ce cas d'utilisation:
Identifiez le nombre de nœuds dont l'instance a besoin pour gérer l'augmentation du trafic. Pour savoir comment identifier le nombre de nœuds, consultez la section Présentation des performances. Si vous utilisez un autoscaler, définissez le paramètre de limite maximale sur le nombre de nœuds que vous avez identifié. Définissez également le paramètre de limite minimale sur (nombre de nœuds que vous avez identifié / 5).
Identifiez les tables et les index qui génèrent le plus de trafic et qui peuvent bénéficier le plus de l'utilisation de points de division. Analysez les données actuelles et choisissez entre utiliser des points de division personnalisés ou des points de fractionnement répartis uniformément.
Créez les points de division au plus tôt sept jours et au plus tard 12 heures avant l'augmentation prévue du trafic.
Vérifiez que les divisions ont été créées. Pour afficher les points de fractionnement créés sur une instance, consultez Afficher les points de fractionnement.
Mises en garde
Tenez compte des mises en garde suivantes lorsque vous créez des points de division:
Suppression d'une table, d'un index et d'une base de données: avant de supprimer une table, un index ou une base de données, vous devez vous assurer que tous les points de division correspondants ont expiré. Pour ce faire, définissez la date d'expiration du fractionnement sur l'heure actuelle. Cette opération est nécessaire pour récupérer le quota au niveau de l'instance. Pour en savoir plus sur l'expiration des points de fractionnement, consultez la section Faire expirer un point de fractionnement.
Sauvegarder et restaurer des bases de données: les divisions ajoutées ne sont pas sauvegardées. Vous devez créer des divisions sur une base de données restaurée.
Autoscaling asymétrique: si vous utilisez l'autoscaling asymétrique, le nombre de nœuds utilisé pour déterminer le nombre de points de fractionnement correspond au nombre minimal de nœuds dans toutes les régions.
Augmentation temporaire des métriques d'utilisation du stockage: l'ajout de points de fractionnement augmente temporairement la métrique espace de stockage total de la base de données jusqu'à ce que Spanner termine le compactage. Pour en savoir plus, consultez la section Utilisation du stockage. Cela ne se produit que lorsque les plages de clés existantes sont divisées davantage, et non lorsque de nouvelles plages de clés sont divisées.
Vous devez créer des points de division au plus tôt sept jours et au plus tard 12 heures avant l'augmentation prévue du trafic.
Limites avant le fractionnement
La pré-division de votre base de données présente les limites suivantes:
Vous ne pouvez pas effectuer de fractionnement préalable des index de recherche. Il vous suffit de procéder à une division préalable de la table de base. Pour en savoir plus, consultez la section Segmentation des index de recherche.
Vous ne pouvez pas effectuer une division préalable à l'aide d'index vectoriels. Pour en savoir plus sur les index vectoriels, consultez la section Index vectoriel.
Pour en savoir plus sur les quotas pour les points de fractionnement, consultez la page Quotas et limites.