doc-locale/fr-fr/administration/postgresql/upgrading_os.md
[!warning] Geo ne peut pas être utilisé pour migrer une base de données PostgreSQL d'un système d'exploitation vers un autre. Si vous tentez de le faire, le site secondaire peut sembler être répliqué à 100 % alors qu'en réalité certaines données ne sont pas répliquées, ce qui entraîne une perte de données. Cela est dû au fait que Geo dépend de la réplication en flux PostgreSQL, qui souffre des limitations décrites dans ce document. Voir aussi Geo Troubleshooting - Check OS locale data compatibility.
Si vous mettez à niveau le système d'exploitation sur lequel PostgreSQL s'exécute, tout changement dans les données de paramètres régionaux peut corrompre vos index de base de données. En particulier, la mise à niveau vers glibc 2.28 est susceptible de causer ce problème. Pour éviter ce problème, effectuez la migration en utilisant l'une des options suivantes, grossièrement dans l'ordre de complexité :
Assurez-vous d'effectuer une sauvegarde avant de tenter toute migration, et validez le processus de migration dans un environnement similaire à la production. Si la durée de l'interruption de service peut poser un problème, envisagez de chronométrer différentes approches avec une copie des données de production dans un environnement similaire à la production.
Si vous exécutez un environnement GitLab à grande échelle et qu'aucun autre service ne s'exécute sur les nœuds où PostgreSQL est exécuté, nous vous recommandons de mettre à niveau le système d'exploitation des nœuds PostgreSQL séparément. Pour réduire la complexité et les risques, ne combinez pas la procédure avec d'autres modifications, en particulier si ces modifications ne nécessitent pas d'interruption de service, comme la mise à niveau du système d'exploitation des nœuds exécutant uniquement Puma ou Sidekiq.
Pour plus d'informations sur la manière dont GitLab prévoit de résoudre ce problème, consultez l'epic 8573.
La sauvegarde et la restauration recrée l'intégralité de la base de données, y compris les index.
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sauvegardez la base de données PostgreSQL avec pg_dump ou l'outil de sauvegarde GitLab, avec tous les types de données sauf db exclus (de sorte que seule la base de données soit sauvegardée).
Sur tous les nœuds PostgreSQL, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL, installez le nouveau package GitLab de la même version de GitLab.
Restaurez la base de données PostgreSQL à partir de la sauvegarde.
Sur tous les nœuds, démarrez GitLab.
Avantages :
Inconvénients :
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds de tous les sites, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sur le site principal, sauvegardez la base de données PostgreSQL avec pg_dump ou l'outil de sauvegarde GitLab, avec tous les types de données sauf db exclus (de sorte que seule la base de données soit sauvegardée).
Sur tous les nœuds PostgreSQL de tous les sites, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL de tous les sites, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL de tous les sites, installez le nouveau package GitLab de la même version de GitLab.
Sur le site principal, restaurez la base de données PostgreSQL à partir de la sauvegarde.
Facultativement, commencez à utiliser le site principal, au risque de ne pas avoir de site secondaire comme secours à chaud.
Configurez à nouveau la réplication en flux PostgreSQL vers les sites secondaires.
Si les sites secondaires reçoivent du trafic des utilisateurs, laissez les bases de données en lecture-réplica se rattraper avant de démarrer GitLab.
Sur tous les nœuds de tous les sites, démarrez GitLab.
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sur tous les nœuds PostgreSQL, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL, installez le nouveau package GitLab de la même version de GitLab.
Dans une console de base de données, reconstruisez tous les index :
SET statement_timeout = 0;
REINDEX DATABASE gitlabhq_production;
Après la réindexation de la base de données, la version doit être actualisée pour toutes les collations affectées. Pour mettre à jour le catalogue système afin d'enregistrer la version de collation actuelle :
ALTER DATABASE gitlabhq_production REFRESH COLLATION VERSION;
Les bases de données système telles que template1 ou postgres peuvent également présenter des problèmes de collation au démarrage de PostgreSQL. Vérifiez les indications dans les messages d'erreur et actualisez également les collations dans ces bases de données.
Sur tous les nœuds, démarrez GitLab.
Avantages :
Inconvénients :
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds de tous les sites, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sur tous les nœuds PostgreSQL, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL, installez le nouveau package GitLab de la même version de GitLab.
Sur le site principal, dans une console de base de données, reconstruisez tous les index :
SET statement_timeout = 0;
REINDEX DATABASE gitlabhq_production;
Après la réindexation de la base de données, la version doit être actualisée pour toutes les collations affectées. Pour mettre à jour le catalogue système afin d'enregistrer la version de collation actuelle :
ALTER DATABASE <database_name> REFRESH COLLATION VERSION;
Si les sites secondaires reçoivent du trafic des utilisateurs, laissez les bases de données en lecture-réplica se rattraper avant de démarrer GitLab.
Sur tous les nœuds de tous les sites, démarrez GitLab.
Cette approche est similaire à celle utilisée pour GitLab.com. Pour en savoir plus sur ce processus et sur la façon dont les différents types d'index ont été traités, consultez le billet de blog sur la mise à niveau du système d'exploitation sur nos clusters de bases de données PostgreSQL.
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sur tous les nœuds PostgreSQL, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL, installez le nouveau package GitLab de la même version de GitLab.
Dans une console de base de données, réindexez chaque index affecté :
SET statement_timeout = 0;
REINDEX INDEX <index name> CONCURRENTLY;
Après la réindexation des index défectueux, la collation doit être actualisée. Pour mettre à jour le catalogue système afin d'enregistrer la version de collation actuelle :
ALTER DATABASE <database_name> REFRESH COLLATION VERSION;
Sur tous les nœuds, démarrez GitLab.
Avantages :
Inconvénients :
Planifiez une fenêtre d'interruption de service programmée. Sur tous les nœuds de tous les sites, arrêtez les services GitLab inutiles :
gitlab-ctl stop
gitlab-ctl start postgresql
Sur tous les nœuds PostgreSQL, mettez à niveau le système d'exploitation.
Sur tous les nœuds PostgreSQL, mettez à jour les sources du package GitLab après la mise à niveau du système d'exploitation.
Sur tous les nœuds PostgreSQL, installez le nouveau package GitLab de la même version de GitLab.
Sur le site principal, dans une console de base de données, réindexez chaque index affecté :
SET statement_timeout = 0;
REINDEX INDEX <index name> CONCURRENTLY;
Après la réindexation des index défectueux, la collation doit être actualisée. Pour mettre à jour le catalogue système afin d'enregistrer la version de collation actuelle :
ALTER DATABASE <database_name> REFRESH COLLATION VERSION;
La réplication en flux PostgreSQL existante devrait répliquer les modifications de réindexation vers les bases de données en lecture-réplica.
Sur tous les nœuds de tous les sites, démarrez GitLab.
glibc {#checking-glibc-versions}Pour voir quelle version de glibc est utilisée, exécutez ldd --version.
Le tableau suivant indique les versions de glibc fournies pour différents systèmes d'exploitation :
| Système d'exploitation | Version de glibc |
|---|---|
| CentOS 7 | 2.17 |
| RedHat Enterprise 8 | 2.28 |
| RedHat Enterprise 9 | 2.34 |
| Ubuntu 18.04 | 2.27 |
| Ubuntu 20.04 | 2.31 |
| Ubuntu 22.04 | 2.35 |
| Ubuntu 24.04 | 2.39 |
Par exemple, supposons que vous effectuez une mise à niveau de CentOS 7 vers RedHat Enterprise 8. Dans ce cas, l'utilisation de PostgreSQL sur ce système d'exploitation mis à niveau nécessite d'utiliser l'une des deux approches mentionnées, car glibc est mis à niveau de 2.17 à 2.28. Le fait de ne pas gérer correctement les modifications de collation entraîne des défaillances importantes dans GitLab, par exemple des runners qui ne récupèrent pas les jobs avec des étiquettes.
D'un autre côté, si PostgreSQL s'exécute déjà sur glibc 2.28 ou supérieur sans problème, vos index devraient continuer à fonctionner sans autre action. Par exemple, si vous avez exécuté PostgreSQL sur RedHat Enterprise 8 (glibc 2.28) pendant un certain temps et souhaitez effectuer une mise à niveau vers RedHat Enterprise 9 (glibc 2.34), il ne devrait pas y avoir de problèmes liés aux collations.
glibc {#verifying-glibc-collation-versions}Pour PostgreSQL 13 et versions ultérieures, vous pouvez vérifier que la version de collation de votre base de données correspond à votre système avec cette requête SQL :
SELECT collname AS COLLATION_NAME,
collversion AS VERSION,
pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';
Par exemple, sur un système Ubuntu 22.04, la sortie d'un système correctement indexé ressemble à :
gitlabhq_production=# SELECT collname AS COLLATION_NAME,
collversion AS VERSION,
pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';
collation_name | version | actual_version
----------------+---------+----------------
C | |
POSIX | |
ucs_basic | |
C.utf8 | |
en_US.utf8 | 2.35 | 2.35
en_US | 2.35 | 2.35
(6 rows)
D'un autre côté, si vous avez effectué une mise à niveau d'Ubuntu 18.04 vers 22.04 sans réindexation, vous pourriez voir :
gitlabhq_production=# SELECT collname AS COLLATION_NAME,
collversion AS VERSION,
pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';
collation_name | version | actual_version
----------------+---------+----------------
C | |
POSIX | |
ucs_basic | |
C.utf8 | |
en_US.utf8 | 2.27 | 2.35
en_US | 2.27 | 2.35
(6 rows)
Le problème d'index corrompu affecte la réplication en flux PostgreSQL. Vous devez reconstruire tous les index ou reconstruire uniquement les index affectés avant d'autoriser les lectures sur un réplica avec des données de paramètres régionaux différentes.
Les procédures de mise à niveau documentées précédemment ne sont pas gravées dans le marbre. Avec Geo, il existe potentiellement davantage d'options, car il existe une infrastructure redondante. Vous pouvez envisager des modifications adaptées à votre cas d'utilisation, mais veillez à les évaluer par rapport à la complexité supplémentaire que cela engendre. Voici quelques exemples :
Pour réserver un site secondaire comme secours à chaud en cas de sinistre lors de la mise à niveau du système d'exploitation du site principal et de l'autre site secondaire :
Pour fournir aux utilisateurs un accès en lecture seule à GitLab pendant la mise à niveau du système d'exploitation (interruption de service partielle) :
[!warning] Même si le site secondaire dispose déjà d'une lecture-réplica de la base de données, vous ne pouvez pas mettre à niveau son système d'exploitation avant la promotion. Si vous tentiez de le faire, le site secondaire pourrait manquer la réplication de certains dépôts Git ou fichiers, en raison des index corrompus. Voir Réplication en flux.