doc-locale/fr-fr/administration/gitaly/praefect/recovery.md
Gitaly Cluster (Praefect) peut récupérer après une défaillance du nœud primaire et des dépôts indisponibles. Gitaly Cluster (Praefect) peut effectuer une récupération de données et dispose d'outils pour la base de données de suivi Praefect.
Vous pouvez ajouter et remplacer des nœuds Gitaly sur un Gitaly Cluster (Praefect).
Pour ajouter un nouveau nœud Gitaly :
Installez le nouveau nœud Gitaly en suivant la documentation.
Ajoutez le nouveau nœud à votre configuration Praefect sous praefect['virtual_storages'].
Reconfigurez et redémarrez Praefect en exécutant les commandes suivantes :
gitlab-ctl reconfigure
gitlab-ctl restart praefect
Le comportement de réplication dépend de votre paramètre de facteur de réplication.
Si un facteur de réplication personnalisé est défini, Praefect ne réplique pas automatiquement les dépôts existants vers le nouveau nœud Gitaly. Vous devez définir le facteur de réplication pour chaque dépôt à l'aide de la commande Praefect set-replication-factor. Les nouveaux dépôts sont répliqués en fonction du facteur de réplication.
Si le facteur de réplication par défaut est utilisé, Praefect réplique automatiquement toutes les données vers tout nouveau nœud Gitaly ajouté à la configuration afin de maintenir le facteur de réplication.
Vous pouvez remplacer un nœud Gitaly existant par un nouveau nœud portant le même nom ou un nom différent. Avant de supprimer l'ancien nœud :
Lorsqu'un nœud Gitaly primaire est supprimé, les dépôts gérés par ce nœud deviennent indisponibles jusqu'à ce que :
Pendant que le nœud est indisponible, les requêtes de lecture vers les dépôts affectés échouent avec des erreurs 404. Gitaly résout automatiquement cette situation lors de la prochaine tentative d'écriture sur les dépôts affectés en déclenchant un basculement pour établir un nouveau nœud primaire.
Pour utiliser le même nom pour le nœud de remplacement, utilisez le vérificateur de dépôt afin d'analyser le stockage et de supprimer les enregistrements de métadonnées orphelins. Priorisez manuellement la vérification du stockage remplacé pour accélérer le processus.
Les étapes pour remplacer un nœud par un nœud portant un nom différent dans Gitaly Cluster (Praefect) dépendent de la définition ou non d'un facteur de réplication.
Si un facteur de réplication personnalisé est défini, utilisez praefect set-replication-factor pour redéfinir le facteur de réplication par dépôt afin d'obtenir un nouveau stockage attribué.
Par exemple, si deux nœuds du stockage virtuel ont un facteur de réplication de 2 et qu'un nouveau nœud (gitaly-3) est ajouté, vous devez augmenter le facteur de réplication à 3 :
$ sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml set-replication-factor -virtual-storage default -relative-path @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git -replication-factor 3
current assignments: gitaly-1, gitaly-2, gitaly-3
Cela garantit que le dépôt est répliqué vers le nouveau nœud et que la table repository_assignments est mise à jour avec le nom du nouveau nœud Gitaly.
Si le facteur de réplication par défaut est défini, les nouveaux nœuds ne sont pas automatiquement inclus dans la réplication. Vous devez suivre les étapes décrites précédemment.
Après avoir vérifié que le dépôt a bien été répliqué vers le nouveau nœud :
Supprimez le nœud gitaly-1 de la configuration Praefect sous praefect['virtual_storages'].
Reconfigurez et redémarrez Praefect :
gitlab-ctl reconfigure
gitlab-ctl restart praefect
L'état de la base de données faisant référence à l'ancien nœud Gitaly peut être ignoré.
Une alternative consiste à réattribuer tous les dépôts de l'ancien stockage vers le nouveau, après avoir configuré le nouveau nœud Gitaly :
Connectez-vous à la base de données Praefect :
/opt/gitlab/embedded/bin/psql -h <psql host> -U <user> -d <database name>
Mettez à jour la table repository_assignments pour remplacer l'ancien nom du nœud Gitaly (par exemple, old-gitaly) par le nouveau nom du nœud Gitaly (par exemple, new-gitaly) :
UPDATE repository_assignments SET storage='new-gitaly' WHERE storage='old-gitaly';
Cela déclencherait les jobs de réplication appropriés pour ramener le système à l'état souhaité.
Gitaly Cluster (Praefect) récupère après une défaillance du nœud Gitaly primaire en promouvant un secondaire sain comme nouveau primaire. Gitaly Cluster (Praefect) :
dataloss pour le détecter.Un dépôt est indisponible si toutes ses répliques à jour sont indisponibles. Les dépôts indisponibles ne sont pas accessibles via Praefect afin d'éviter de servir des données obsolètes susceptibles de perturber les outils automatisés.
La sous-commande Praefect dataloss identifie les dépôts indisponibles. Cela permet d'identifier les pertes de données potentielles et les dépôts qui ne sont plus accessibles parce que toutes leurs copies de répliques à jour sont indisponibles.
Les paramètres suivants sont disponibles :
-virtual-storage qui spécifie quel stockage virtuel vérifier. Comme ils peuvent nécessiter l'intervention d'un administrateur, le comportement par défaut est d'afficher les dépôts indisponibles.-partially-unavailable qui spécifie si les dépôts disponibles mais dont certaines copies attribuées sont indisponibles doivent être inclus dans la sortie.[!note]
datalossest encore en bêta et le format de sortie est susceptible de changer.
Pour vérifier les dépôts dont les primaires sont obsolètes ou les dépôts indisponibles, exécutez :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <virtual-storage>]
Chaque stockage virtuel configuré est vérifié si aucun n'est spécifié :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss
Les dépôts qui n'ont pas de copies saines et entièrement à jour disponibles sont listés dans la sortie. Les informations suivantes sont affichées pour chaque dépôt :
(unavailable) est affiché à côté du chemin disque si le dépôt est indisponible.No Primary.Les informations supplémentaires incluent :
assigned host est affiché à côté des nœuds attribués pour stocker le dépôt. Le texte est omis si le nœud contient une copie du dépôt mais n'est pas attribué pour le stocker. Ces copies ne sont pas maintenues synchronisées par Praefect, mais peuvent servir de sources de réplication pour mettre à jour les copies attribuées.unhealthy est affiché à côté des copies situées sur des nœuds Gitaly non sains.Exemple de sortie :
Virtual storage: default
Outdated repositories:
@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git (unavailable):
Primary: gitaly-1
In-Sync Storages:
gitaly-2, assigned host, unhealthy
Outdated Storages:
gitaly-1 is behind by 3 changes or less, assigned host
gitaly-3 is behind by 3 changes or less
Une confirmation est affichée lorsque chaque dépôt est disponible. Par exemple :
Virtual storage: default
All repositories are available!
Pour également lister les informations sur les dépôts disponibles mais indisponibles depuis certains nœuds attribués, utilisez le drapeau -partially-unavailable.
Un dépôt est disponible s'il existe une réplique saine et à jour disponible. Certaines des répliques secondaires attribuées peuvent être temporairement indisponibles pendant qu'elles attendent de répliquer les dernières modifications.
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <virtual-storage>] [-partially-unavailable]
Exemple de sortie :
Virtual storage: default
Outdated repositories:
@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git:
Primary: gitaly-1
In-Sync Storages:
gitaly-1, assigned host
Outdated Storages:
gitaly-2 is behind by 3 changes or less, assigned host
gitaly-3 is behind by 3 changes or less
Avec le drapeau -partially-unavailable défini, une confirmation est affichée si chaque réplique attribuée est entièrement à jour et saine.
Par exemple :
Virtual storage: default
All repositories are fully available on all assigned storages!
Pour vérifier les sommes de contrôle du dépôt d'un projet sur tous les nœuds Gitaly, exécutez la tâche Rake des répliques sur le nœud GitLab principal.
[!warning]
accept-datalossentraîne une perte de données permanente en écrasant d'autres versions du dépôt. Les efforts de récupération des données doivent être effectués avant de l'utiliser.
S'il n'est pas possible de remettre en ligne l'une des répliques à jour, vous devrez peut-être accepter une perte de données. Lors de l'acceptation d'une perte de données, Praefect marque la réplique choisie du dépôt comme la dernière version et la réplique vers les autres nœuds Gitaly attribués. Ce processus écrase toute autre version du dépôt, donc des précautions s'imposent.
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss
-virtual-storage <virtual-storage> -relative-path <relative-path> -authoritative-storage <storage-name>
[!warning]
accept-datalossentraîne une perte de données permanente en écrasant d'autres versions du dépôt. Les efforts de récupération des données doivent être effectués avant de l'utiliser.
Praefect fournit les sous-commandes suivantes pour réactiver les écritures ou accepter une perte de données. S'il n'est pas possible de remettre en ligne l'un des nœuds à jour, vous devrez peut-être accepter une perte de données :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss -virtual-storage <virtual-storage> -relative-path <relative-path> -authoritative-storage <storage-name>
Lors de l'acceptation d'une perte de données, Praefect :
Marque la copie choisie du dépôt comme la dernière version.
Réplique la copie vers les autres nœuds Gitaly attribués.
Ce processus écrase toute autre copie du dépôt, donc des précautions s'imposent.
Si un nœud Gitaly échoue dans ses jobs de réplication pour quelque raison que ce soit, il finit par héberger des versions obsolètes des dépôts affectés. Praefect fournit des outils pour la réconciliation automatique. Ces outils réconcilent les dépôts obsolètes pour les remettre entièrement à jour.
Praefect réconcilie automatiquement les dépôts qui ne sont pas à jour. Par défaut, cette opération est effectuée toutes les cinq minutes. Pour chaque dépôt obsolète sur un nœud Gitaly sain, Praefect choisit une réplique aléatoire et entièrement à jour du dépôt sur un autre nœud Gitaly sain à partir duquel répliquer. Un job de réplication n'est planifié que s'il n'y a pas d'autres jobs de réplication en attente pour le dépôt cible.
La fréquence de réconciliation peut être modifiée via la configuration. La valeur peut être toute valeur de durée Go valide. Les valeurs inférieures à 0 désactivent la fonctionnalité.
Exemples :
praefect['configuration'] = {
# ...
reconciliation: {
# ...
scheduling_interval: '5m', # the default value
},
}
praefect['configuration'] = {
# ...
reconciliation: {
# ...
scheduling_interval: '30s', # reconcile every 30 seconds
},
}
praefect['configuration'] = {
# ...
reconciliation: {
# ...
scheduling_interval: '0', # disable the feature
},
}
La sous-commande Praefect remove-repository supprime un dépôt d'un Gitaly Cluster (Praefect), ainsi que tout l'état associé à un dépôt donné, notamment :
Par défaut, la commande fonctionne en mode simulation (dry-run). Par exemple :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml remove-repository -virtual-storage <virtual-storage> -relative-path <repository>
Remplacez <virtual-storage> par le nom du stockage virtuel contenant le dépôt.
Remplacez <repository> par le chemin relatif du dépôt à supprimer.
Ajoutez -db-only pour supprimer l'entrée de la base de données de suivi Praefect sans supprimer le dépôt sur disque. Utilisez cette option pour supprimer les entrées de base de données orphelines et protéger les données du dépôt sur disque contre la suppression lorsqu'un dépôt valide est spécifié par erreur. Si l'entrée de base de données est supprimée accidentellement, effectuez un nouveau suivi du dépôt avec la commande track-repository.
Ajoutez -apply pour exécuter la commande en dehors du mode simulation et supprimer le dépôt. Par exemple :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml remove-repository -virtual-storage <virtual-storage> -relative-path <repository> -apply
-virtual-storage est le stockage virtuel dans lequel se trouve le dépôt. Les stockages virtuels sont configurés dans /etc/gitlab/gitlab.rb sous praefect['configuration']['virtual_storage] et se présentent comme suit :
praefect['configuration'] = {
# ...
virtual_storage: [
{
# ...
name: 'default',
},
{
# ...
name: 'storage-1',
},
],
}
Dans cet exemple, le stockage virtuel à spécifier est default ou storage-1.
-repository est le chemin relatif du dépôt dans le stockage commençant par @hashed. Par exemple :
@hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git
Des parties du dépôt peuvent continuer à exister après l'exécution de remove-repository. Cela peut être dû à :
Si cela se produit, exécutez à nouveau remove-repository.
Les tâches de maintenance courantes sur la base de données de suivi Praefect sont documentées dans cette section.
La sous-commande Praefect list-untracked-repositories liste les dépôts du Gitaly Cluster (Praefect) qui répondent aux deux critères suivants :
Ajoutez l'option -older-than pour éviter d'afficher les dépôts qui :
Remplacez <duration> par une durée (par exemple, 5s, 10m, ou 1h). Par défaut, 6h.
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories -older-than <duration>
Seuls les dépôts dont la date de création est antérieure à la durée spécifiée sont pris en compte.
La commande génère en sortie :
STDOUT et les journaux de la commande.STDERR.Chaque entrée est une chaîne JSON complète avec un saut de ligne à la fin (configurable à l'aide du drapeau -delimiter). Par exemple :
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories
{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567890.git"}
{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567891.git"}
[!warning] En raison d'un problème connu, dans GitLab 16.0 et versions antérieures, vous ne pouvez pas ajouter des dépôts à la base de données de suivi Praefect avec des chemins de réplique générés par Praefect (
@cluster). Ces dépôts ne sont pas associés au chemin de dépôt utilisé par GitLab et sont inaccessibles.
La sous-commande Praefect track-repository ajoute des dépôts sur disque à la base de données de suivi Praefect pour être suivis.
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml track-repository -virtual-storage <virtual-storage> -authoritative-storage <storage-name> -relative-path <repository> -replica-path <disk_path> -replicate-immediately
-virtual-storage est le stockage virtuel dans lequel se trouve le dépôt. Les stockages virtuels sont configurés dans /etc/gitlab/gitlab.rb sous praefect['configuration'][:virtual_storage] et se présentent comme suit :
praefect['configuration'] = {
# ...
virtual_storage: [
{
# ...
name: 'default',
},
{
# ...
name: 'storage-1',
},
],
}
Dans cet exemple, le stockage virtuel à spécifier est default ou storage-1.
-relative-path est le chemin relatif dans le stockage virtuel. Généralement commençant par @hashed. Par exemple :
@hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git
-replica-path est le chemin relatif sur le stockage physique. Peut commencer par @cluster ou correspondre à relative_path.
-authoritative-storage est le stockage que nous souhaitons que Praefect traite comme le primaire. Obligatoire si la réplication par dépôt est définie comme stratégie de réplication.
-replicate-immediately entraîne la réplication immédiate du dépôt vers ses secondaires par la commande. Sinon, les jobs de réplication sont planifiés pour exécution dans la base de données et sont récupérés par un processus d'arrière-plan Praefect.
La commande génère en sortie :
STDOUT et les journaux de la commande.STDERR.Cette commande échoue si :
[!warning] En raison d'un problème connu, dans GitLab 16.0 et versions antérieures, vous ne pouvez pas ajouter des dépôts à la base de données de suivi Praefect avec des chemins de réplique générés par Praefect (
@cluster). Ces dépôts ne sont pas associés au chemin de dépôt utilisé par GitLab et sont inaccessibles.
Les migrations utilisant l'API ajoutent automatiquement des dépôts à la base de données de suivi Praefect.
Si vous copiez manuellement des dépôts depuis une infrastructure existante, vous pouvez utiliser la sous-commande Praefect track-repositories. Cette sous-commande ajoute de grandes quantités de dépôts sur disque à la base de données de suivi Praefect.
# Omnibus GitLab install
sudo gitlab-ctl praefect track-repositories --input-path /path/to/input.json
# Source install
sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml track-repositories -input-path /path/to/input.json
La commande valide que toutes les entrées :
Si une entrée ne passe pas ces vérifications, la commande s'interrompt avant de tenter de suivre un dépôt.
input-path est le chemin vers un fichier contenant une liste de dépôts formatés sous forme d'objets JSON délimités par des sauts de ligne. Les objets doivent contenir les clés suivantes :
relative_path : correspond à repository dans track-repository.
authoritative-storage : le stockage que Praefect doit traiter comme le primaire.
virtual-storage : le stockage virtuel dans lequel se trouve le dépôt.
Par exemple :
{"relative_path":"@hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git","replica_path":"@cluster/fe/d3/1","authoritative_storage":"gitaly-1","virtual_storage":"default"}
{"relative_path":"@hashed/f8/9f/f89f8d0e735a91c5269ab08d72fa27670d000e7561698d6e664e7b603f5c4e40.git","replica_path":"@cluster/7b/28/2","authoritative_storage":"gitaly-2","virtual_storage":"default"}
-replicate-immediately, entraîne la réplication immédiate du dépôt vers ses secondaires par la commande. Sinon, les jobs de réplication sont planifiés pour exécution dans la base de données et sont récupérés par un processus d'arrière-plan Praefect.
La sous-commande Praefect list-storages liste les stockages virtuels et leurs nœuds de stockage associés. Si un stockage virtuel est :
-virtual-storage, il liste uniquement les nœuds de stockage du stockage virtuel spécifié.sudo -u git -- /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-storages -virtual-storage <virtual_storage_name>
La commande génère en sortie :
STDOUT et les journaux de la commande.STDERR.