doc-locale/fr-fr/administration/gitaly/praefect/_index.md
{{< details >}}
{{< /details >}}
Le stockage Git est fourni via le service Gitaly dans GitLab et est essentiel au fonctionnement de GitLab. Lorsque le nombre d'utilisateurs, de dépôts et l'activité augmentent, il est important de mettre à l'échelle Gitaly de manière appropriée en :
Gitaly peut être exécuté dans une configuration en cluster pour :
Dans cette configuration, chaque dépôt Git peut être stocké sur plusieurs nœuds Gitaly dans le cluster.
L'utilisation de Gitaly Cluster (Praefect) augmente la tolérance aux pannes en :
[!note] Le support technique pour Gitaly Cluster (Praefect) est limité aux clients GitLab Premium et Ultimate.
Ce qui suit montre GitLab configuré pour accéder à storage-1, un stockage virtuel fourni par Gitaly Cluster (Praefect) :
Dans cet exemple :
storage-1.storage-1 : gitaly-1, gitaly-2 et gitaly-3.3. Trois copies de chaque dépôt sont conservées.Les objectifs de disponibilité pour Gitaly Cluster (Praefect) en supposant une défaillance d'un seul nœud sont :
Objectif de point de récupération (RPO) : Moins d'1 minute.
Les écritures sont répliquées de manière asynchrone. Toute écriture n'ayant pas été répliquée vers le nouveau nœud primaire promu est perdue. Toute opération de lecture en cours sur le nœud défaillant est terminée.
La cohérence forte évite les pertes dans certaines circonstances.
Objectif de temps de récupération (RTO) : Moins de 10 secondes. Les pannes sont détectées par un contrôle de santé effectué par chaque nœud Praefect toutes les secondes. Le basculement nécessite dix contrôles de santé consécutifs échoués sur chaque nœud Praefect.
Des améliorations du RPO et du RTO sont proposées dans l'epic 8903.
[!warning] En cas de défaillance complète du cluster, les plans de reprise après sinistre doivent être mis en œuvre. Ceux-ci peuvent affecter le RPO et le RTO discutés précédemment.
Gitaly Cluster (Praefect) offre les avantages de la tolérance aux pannes, mais implique une complexité supplémentaire de configuration et de gestion. Avant de déployer Gitaly Cluster (Praefect), consultez :
Si vous n'avez pas encore migré vers Gitaly Cluster (Praefect), vous avez deux options :
Contactez votre Customer Success Manager ou le support client si vous avez des questions.
Si vous utilisez déjà Gitaly Cluster (Praefect) et rencontrez un problème ou une limitation, contactez le support client pour une aide immédiate à la restauration ou à la récupération.
Le tableau suivant présente les problèmes connus actuels ayant un impact sur l'utilisation de Gitaly Cluster (Praefect). Pour connaître le statut actuel de ces problèmes, consultez les tickets et les epics référencés.
| Problème | Résumé | Comment éviter |
|---|---|---|
| Gitaly Cluster (Praefect) + Geo - Problèmes lors de la relance des synchronisations échouées | Si Gitaly Cluster (Praefect) est utilisé sur un site secondaire Geo, les dépôts dont la synchronisation a échoué peuvent continuer à échouer lorsque Geo tente de les resynchroniser. La récupération depuis cet état nécessite l'assistance du support pour exécuter des étapes manuelles. | Dans GitLab 15.0 à 15.2, activez le gitaly_praefect_generated_replica_paths feature flag sur votre site primaire Geo. Dans GitLab 15.3, le feature flag est activé par défaut. |
| Praefect incapable d'insérer des données dans la base de données en raison de migrations non appliquées après une mise à niveau | Si la base de données n'est pas tenue à jour avec les migrations terminées, le nœud Praefect est incapable d'effectuer des opérations standard. | Assurez-vous que la base de données Praefect est opérationnelle avec toutes les migrations terminées. Par exemple, cette commande devrait afficher la liste de toutes les migrations appliquées : sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status. Envisagez de demander une assistance à la mise à niveau afin que votre plan de mise à niveau puisse être examiné par le support. |
| Restauration d'un nœud Gitaly Cluster (Praefect) à partir d'un snapshot dans un cluster en cours d'exécution | Étant donné que Gitaly Cluster (Praefect) fonctionne avec un état cohérent, l'introduction d'un seul nœud en retard empêche le cluster de réconcilier les données de ce nœud avec celles des autres nœuds. | Ne restaurez pas un seul nœud Gitaly Cluster (Praefect) à partir d'un snapshot de sauvegarde. Si vous devez effectuer une restauration à partir d'une sauvegarde : |
1. Arrêtez GitLab.
2. Prenez un snapshot de tous les nœuds Gitaly Cluster (Praefect) en même temps.
3. Effectuez un dump de la base de données Praefect. |
| Limitations lors de l'exécution dans Kubernetes, Amazon ECS ou similaire | Gitaly Cluster (Praefect) n'est pas pris en charge et Gitaly présente des limitations connues. Pour plus d'informations, consultez l'epic 6127. | Utilisez nos architectures de référence. |
| PostReceiveHook invoqué avant que l'écriture ait été enregistrée par Praefect | Une condition de concurrence permet à PostReceiveHook de s'exécuter avant que les écritures ne soient répliquées sur tous les nœuds. Lorsque les pipelines CI/CD ciblent des réplicas qui n'ont pas encore reçu l'écriture, cette condition de concurrence provoque l'échec des pipelines avec une erreur couldn't find remote ref refs/merge-requests/$iid/{head,merge}. Pour plus d'informations, consultez le ticket 5406 | Relancez l'intégralité du job ou relancez uniquement l'étape de récupération des sources. Pour plus d'informations, consultez les tentatives d'étapes de job. |
| La mise à l'échelle automatique HPA peut entraîner l'échec silencieux des déplacements de stockage | Lors de l'utilisation de l'Horizontal Pod Autoscaler (HPA) avec des pods Sidekiq, les déplacements de stockage de dépôt peuvent échouer silencieusement en raison de la mise à l'échelle des pods pendant l'exécution du job. | Avant d'effectuer des déplacements de stockage de dépôt, configurez HPA avec des réplicas fixes, en définissant minReplicas = maxReplicas pour éviter la mise à l'échelle pendant la migration. |
Gitaly Cluster (Praefect) ne prend pas en charge les sauvegardes par snapshot. Les sauvegardes par snapshot peuvent entraîner des problèmes de désynchronisation entre la base de données Praefect et le stockage disque. En raison de la façon dont Praefect reconstruit les métadonnées de réplication des informations du disque Gitaly lors d'une restauration, vous devez utiliser les tâches Rake officielles de sauvegarde et de restauration.
La méthode de sauvegarde incrémentielle peut être utilisée pour accélérer les sauvegardes de Gitaly Cluster (Praefect).
Si vous ne pouvez pas utiliser l'une ou l'autre méthode, contactez le support client pour obtenir de l'aide à la restauration.
Gitaly Cluster (Praefect) et Geo offrent différents types de redondance.
Le tableau suivant présente les principales différences entre Gitaly Cluster (Praefect) et Geo :
| Outil | Nœuds | Emplacements | Tolérance à la latence | Basculement | Cohérence | Assure la redondance pour |
|---|---|---|---|---|---|---|
| Gitaly Cluster (Praefect) | Multiple | Unique | Moins d'1 seconde, idéalement en millisecondes à un seul chiffre | Automatique | Forte | Stockage de données dans Git |
| Geo | Multiple | Multiple | Jusqu'à une minute | Manuelle | Éventuelle | Instance GitLab entière |
Pour plus d'informations, voir :
Le stockage virtuel permet de disposer d'un seul stockage de dépôt dans GitLab pour simplifier la gestion des dépôts.
Le stockage virtuel avec Gitaly Cluster (Praefect) peut généralement remplacer les configurations de stockage Gitaly direct. Cependant, cela se fait au détriment d'un espace de stockage supplémentaire nécessaire pour stocker chaque dépôt sur plusieurs nœuds Gitaly. L'avantage d'utiliser le stockage virtuel Gitaly Cluster (Praefect) par rapport au stockage Gitaly direct est :
Le nombre de réplicas de dépôt peut être configuré à l'aide d'un facteur de réplication.
Il peut être peu économique d'avoir le même facteur de réplication pour tous les dépôts. Pour offrir une plus grande flexibilité aux instances GitLab extrêmement grandes, le facteur de réplication variable est suivi dans ce ticket.
Comme pour les stockages Gitaly standard, les stockages virtuels peuvent être fragmentés (sharded).
Vous pouvez configurer plusieurs stockages virtuels dans un déploiement Gitaly Cluster (Praefect). Cela vous permet de :
Les stockages virtuels sont configurés dans gitlab_rails['repositories_storages'] sur le serveur GitLab. Chaque entrée dans ce hash représente un stockage virtuel distinct. La configuration de Praefect définit quels nœuds Gitaly servent chaque stockage virtuel. Les dépôts dans différents stockages virtuels sont complètement indépendants et ne sont pas répliqués entre les stockages virtuels.
Par exemple, vous pourriez configurer :
storage-1 : Un stockage virtuel pour les dépôts de production critiques avec un facteur de réplication de 3.storage-2 : Un stockage virtuel pour les dépôts moins critiques avec un facteur de réplication de 2.Chaque stockage virtuel nécessite son propre ensemble de nœuds Gitaly.
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
accTitle: Multiple virtual storages
accDescr: Example of multiple virtual storages, one with a replication factor of three and one with a replication factor of two.
GitLab[[GitLab server]]
Storage1[(storage-1
Praefect cluster)]
Storage2[(storage-2
Praefect cluster)]
GitLab --> Storage1
GitLab --> Storage2
Storage1 --> G1[Gitaly node 1]
Storage1 --> G2[Gitaly node 2]
Storage1 --> G3[Gitaly node 3]
Storage2 --> G4[Gitaly node 4]
Storage2 --> G5[Gitaly node 5]
Pour les instructions de configuration, consultez Configurer plusieurs stockages virtuels.
Vous pouvez configurer GitLab pour utiliser une combinaison de :
Vous pouvez utiliser une configuration mixte lorsque :
Dans une configuration mixte, chaque stockage est configuré indépendamment dans GitLab :
GitLab traite tous les stockages configurés de manière égale, qu'ils soient autonomes ou en cluster. Lors de la création d'un nouveau dépôt, GitLab sélectionne un stockage en fonction des poids de stockage configurés et de la capacité disponible.
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
accTitle: Mixed configuration
accDescr: Example result of mixed configuration, with a Gitaly Cluster (Praefect) and standalone Gitaly configured together.
GitLab[[GitLab server]]
Praefect[(Praefect cluster)]
Standalone1[(Standalone gitaly)]
GitLab -->|cluster storage| Praefect
GitLab -->|default storage| Standalone1
Praefect --> G1[Gitaly node 1]
Praefect --> G2[Gitaly node 2]
Praefect --> G3[Gitaly node 3]
Pour plus d'informations, voir :
[!warning] Le layout de stockage est un détail interne de Gitaly Cluster (Praefect) et n'est pas garanti de rester stable entre les releases. Les informations ici sont uniquement à titre informatif et pour aider au débogage. L'exécution de modifications dans les dépôts directement sur le disque n'est pas prise en charge et peut entraîner des dysfonctionnements ou l'écrasement des modifications.
Les stockages virtuels Gitaly Cluster (Praefect) fournissent une abstraction qui ressemble à un stockage unique mais qui consiste en réalité en plusieurs stockages physiques. Gitaly Cluster (Praefect) doit répliquer chaque opération vers chaque stockage physique. Les opérations peuvent réussir sur certains stockages physiques mais échouer sur d'autres.
Les opérations partiellement appliquées peuvent causer des problèmes avec d'autres opérations et laisser le système dans un état dont il ne peut pas se remettre. Pour éviter ces types de problèmes, chaque opération doit soit s'appliquer entièrement, soit ne pas s'appliquer du tout. Cette propriété des opérations est appelée atomicité.
GitLab contrôle le layout de stockage sur les stockages de dépôts. GitLab indique au stockage de dépôt où créer, supprimer et déplacer les dépôts. Ces opérations créent des problèmes d'atomicité lorsqu'elles sont appliquées à plusieurs stockages physiques. Par exemple :
En conséquence, le réplica obsolète qui était indisponible au moment de la suppression peut entraîner des conflits et empêcher la recréation du dépôt.
Ces problèmes d'atomicité ont causé plusieurs problèmes par le passé avec :
Gitaly Cluster (Praefect) assure l'atomicité de ces opérations en stockant les dépôts sur le disque dans un layout spécial qui prévient les conflits pouvant survenir en raison d'opérations partiellement appliquées.
Les dépôts sont stockés dans les stockages au chemin relatif déterminé par le client Gitaly. Ces chemins peuvent être identifiés par le fait qu'ils ne commencent pas par le préfixe @cluster. Les chemins relatifs suivent le schéma de stockage haché.
Lorsque Gitaly Cluster (Praefect) crée un dépôt, il lui attribue un identifiant unique et permanent appelé ID de dépôt. L'ID de dépôt est interne à Gitaly Cluster (Praefect) et n'est pas lié à d'autres identifiants dans GitLab. Si un dépôt est supprimé de Gitaly Cluster (Praefect) et déplacé ultérieurement, le dépôt se voit attribuer un nouvel ID de dépôt et est considéré comme un dépôt différent du point de vue de Gitaly Cluster (Praefect). La séquence des IDs de dépôt augmente toujours, mais il peut y avoir des lacunes dans la séquence.
L'ID de dépôt est utilisé pour dériver un chemin de stockage unique appelé chemin de réplica pour chaque dépôt dans le cluster. Les réplicas d'un dépôt sont tous stockés au même chemin de réplica sur les stockages. Le chemin de réplica est distinct du chemin relatif :
Praefect traduit les dépôts dans les RPC de l'identifiant virtuel (virtual storage, relative path) en identifiant de dépôt physique (storage, replica_path) lors du traitement des requêtes clientes.
Le format du chemin de réplica pour :
@cluster/pools/<xx>/<xx>/<repository ID>. Les pools d'objets sont stockés dans un répertoire différent des autres dépôts. Ils doivent être identifiables par Gitaly pour éviter qu'ils ne soient élagués dans le cadre de la maintenance. L'élagage des pools d'objets peut entraîner une perte de données dans les dépôts liés.@cluster/repositories/<xx>/<xx>/<repository ID>Par exemple, @cluster/repositories/6f/96/54771.
Le dernier composant du chemin de réplica, 54771, est l'ID du dépôt. Cela peut être utilisé pour identifier le dépôt sur le disque.
<xx>/<xx> sont les quatre premiers chiffres hexadécimaux du hachage SHA256 de la représentation sous forme de chaîne de l'ID du dépôt. Ces chiffres sont utilisés pour équilibrer les dépôts uniformément dans des sous-répertoires afin d'éviter des répertoires trop volumineux qui pourraient causer des problèmes sur certains systèmes de fichiers. Dans ce cas, 54771 est haché en 6f960ab01689464e768366d3315b3d3b2c28f38761a58a70110554eb04d582f7, donc les quatre premiers chiffres sont 6f et 96.
Utilisez la sous-commande praefect metadata pour :
Le dépôt sur le disque contient également le chemin du projet dans le fichier de configuration Git. Le fichier de configuration peut être utilisé pour déterminer le chemin du projet même si les métadonnées du dépôt ont été supprimées. Suivez les instructions dans la documentation du stockage haché.
Gitaly Cluster (Praefect) utilise le magasin de métadonnées PostgreSQL avec le layout de stockage pour garantir l'atomicité des opérations de création, de suppression et de déplacement de dépôts. Les opérations sur disque ne peuvent pas être appliquées de manière atomique sur plusieurs stockages. Cependant, PostgreSQL garantit l'atomicité des opérations de métadonnées. Gitaly Cluster (Praefect) modélise les opérations de manière à ce que les opérations échouées laissent toujours les métadonnées dans un état cohérent. Les disques peuvent contenir un état obsolète même après des opérations réussies. Cette situation est attendue et l'état résiduel n'interfère pas avec les opérations futures, mais peut occuper inutilement de l'espace disque jusqu'à ce qu'un nettoyage soit effectué.
Des travaux sont en cours sur un crawler en arrière-plan qui nettoie les dépôts résiduels des stockages.
Lors de la création de dépôts, Praefect :
Même si deux opérations concurrentes créent le même dépôt, elles seraient stockées dans des répertoires différents sur les stockages et ne seraient pas en conflit. La première à se terminer crée l'enregistrement de métadonnées et l'autre opération échoue avec une erreur « already exists ». La création échouée laisse des dépôts résiduels sur les stockages. Des travaux sont en cours sur un crawler en arrière-plan qui nettoie les dépôts résiduels des stockages.
Les IDs de dépôt sont générés à partir de repositories_repository_id_seq dans PostgreSQL. Dans l'exemple précédent, l'opération échouée a pris un ID de dépôt sans créer avec succès un dépôt avec celui-ci. Les créations de dépôts échouées sont susceptibles d'entraîner des lacunes dans les IDs de dépôt.
Un dépôt est supprimé en retirant son enregistrement de métadonnées. Le dépôt cesse d'exister logiquement dès que l'enregistrement de métadonnées est supprimé. PostgreSQL garantit l'atomicité de la suppression et une suppression concurrente échoue avec une erreur « not found ». Après avoir supprimé avec succès l'enregistrement de métadonnées, Praefect tente de supprimer les réplicas des stockages. Cela peut échouer et laisser un état résiduel dans les stockages. L'état résiduel est éventuellement nettoyé.
Contrairement à Gitaly, Gitaly Cluster (Praefect) ne déplace pas les dépôts dans les stockages, mais ne fait que déplacer virtuellement le dépôt en mettant à jour le chemin relatif du dépôt dans le magasin de métadonnées.
Gitaly Cluster (Praefect) est composé de plusieurs composants :
Praefect est un routeur et gestionnaire de transactions pour Gitaly, et un composant requis pour l'exécution de Gitaly Cluster (Praefect).
Pour plus d'informations, consultez Gitaly High Availability (HA) Design.
Gitaly Cluster (Praefect) fournit les fonctionnalités suivantes :
Suivez l'epic 1489 pour les améliorations proposées, y compris la distribution horizontale des lectures.
Gitaly Cluster (Praefect) prend en charge la distribution des opérations de lecture entre les nœuds Gitaly configurés pour le stockage virtuel.
Tous les RPCs marqués avec l'option ACCESSOR sont redirigés vers un nœud Gitaly à jour et en bonne santé. Par exemple, GetBlob.
« À jour » dans ce contexte signifie que :
Le nœud primaire est choisi pour traiter la requête si :
Si vous avez un dépôt volumineux et fortement modifié (comme un monorepo de plusieurs gigaoctets), le nœud primaire peut traiter la plupart ou la totalité des requêtes si les modifications arrivent plus vite que Praefect ne peut les répliquer vers les secondaires. Lorsque cela se produit, les jobs CI/CD et autre trafic du dépôt sont limités par la capacité du nœud primaire.
Vous pouvez surveiller la distribution des lectures à l'aide de Prometheus.
Gitaly Cluster (Praefect) assure une cohérence forte en écrivant les modifications de manière synchrone sur tous les réplicas sains et à jour. Si un réplica est obsolète ou défaillant au moment de la transaction, l'écriture lui est répliquée de manière asynchrone.
La cohérence forte est la méthode de réplication principale. Un sous-ensemble d'opérations utilise encore des jobs de réplication (cohérence éventuelle) au lieu de la cohérence forte. Consultez l'epic de cohérence forte pour plus d'informations.
Si la cohérence forte est indisponible, Gitaly Cluster (Praefect) garantit la cohérence éventuelle. Dans ce cas, Gitaly Cluster (Praefect) réplique toutes les écritures vers les nœuds Gitaly secondaires après que l'écriture sur le nœud Gitaly primaire a eu lieu.
Pour plus d'informations sur la surveillance de la cohérence forte, consultez Surveillance de Gitaly Cluster (Praefect).
Le facteur de réplication est le nombre de copies que Gitaly Cluster (Praefect) conserve d'un dépôt donné. Un facteur de réplication plus élevé :
Par défaut, Gitaly Cluster (Praefect) réplique les dépôts vers chaque stockage dans un stockage virtuel.
Pour les informations de configuration, consultez Configurer le facteur de réplication.
Pour mettre à niveau un Gitaly Cluster (Praefect), suivez la documentation sur les mises à niveau sans interruption de service.
Si vous devez revenir à une version antérieure de Gitaly Cluster (Praefect), certaines migrations de la base de données Praefect peuvent devoir être annulées.
Pour revenir à une version antérieure d'un Gitaly Cluster (Praefect), en supposant plusieurs nœuds Praefect :
Arrêtez le service Praefect sur tous les nœuds Praefect :
gitlab-ctl stop praefect
Revenez à l'ancienne version du package GitLab sur l'un des nœuds Praefect.
Sur le nœud dont la version a été rétablie, vérifiez l'état des migrations Praefect :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status
Comptez le nombre de migrations avec unknown migration dans la colonne APPLIED.
Sur un nœud Praefect dont la version n'a pas été rétablie, effectuez une simulation du retour en arrière pour valider les migrations à annuler. <CT_UNKNOWN> est le nombre de migrations inconnues signalé par le nœud dont la version a été rétablie.
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate <CT_UNKNOWN>
Si les résultats semblent corrects, exécutez la même commande avec l'option -f pour annuler les migrations :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate -f <CT_UNKNOWN>
Revenez à l'ancienne version du package GitLab sur les nœuds Praefect restants et redémarrez le service Praefect :
gitlab-ctl start praefect
[!warning] Certains problèmes connus existent dans Gitaly Cluster (Praefect). Consultez les informations suivantes avant de continuer.
Avant de migrer vers Gitaly Cluster (Praefect) :
Pour migrer vers Gitaly Cluster (Praefect) :
Même si vous n'utilisez pas le stockage de dépôt default, vous devez vous assurer qu'il est configuré. En savoir plus sur cette limitation.
Pour migrer depuis le chart Gitaly sur Kubernetes, suivez les instructions de migration spécifiques.
Si les limitations et compromis de Gitaly Cluster (Praefect) s'avèrent inadaptés à votre environnement, vous pouvez migrer depuis Gitaly Cluster (Praefect) vers une instance Gitaly fragmentée :