多节点升级与停机时间
- Tier: 免费版、高级版、旗舰版
- Offering: GitLab 自托管
虽然您可以升级多节点 GitLab 部署 实现零停机, 但存在一些限制。特别是,您每次只能升级一个小版本, 例如从 14.6 升级到 14.7,然后到 14.8,以此类推。
如果您想一次性升级多个小版本(例如从 14.6 到 14.9), 您必须将 GitLab 实例离线,这意味着会有停机时间。 在开始此过程之前,请验证与您的 升级路径 相关的特定版本升级说明:
对于单节点安装,您只需要 升级 GitLab 包。
升级多节点 GitLab 安装的多个组件的过程与零停机升级相同。 区别在于运行 Rails (Puma/Sidekiq) 的服务器和事件顺序。
总体而言,过程如下:
- 关闭 GitLab 应用程序。
- 升级您的 Consul 服务器。
- 升级其他后端组件:
- Gitaly、Rails PostgreSQL、Redis、PgBouncer:这些可以按任意顺序升级。
- 如果您使用云平台的 PostgreSQL 或 Redis 且需要升级, 请将 Linux 包的说明替换为云提供商的说明。
- 升级 GitLab 应用程序(Sidekiq、Puma)并启动应用程序。
停止向数据库写入
升级前,您需要停止向数据库写入。根据您的 参考架构,过程有所不同。
在所有运行这些进程的服务器上关闭 Puma 和 Sidekiq:
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop puma对于 云原生混合 环境:
- 记录数据库客户端的当前副本数,以便后续重启:
kubectl get deploy -n <namespace> -l release=<helm release name> -l 'app in (prometheus,webservice,sidekiq)' -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.replicas}{"\n"}{end}'- 停止数据库客户端:
kubectl scale deploy -n <namespace> -l release=<helm release name> -l 'app in (prometheus,webservice,sidekiq)' --replicas=0升级 Consul 节点
总结:
-
检查所有 Consul 节点是否健康。
-
在所有 Consul 服务器上 升级 GitLab 包。
-
一次重启一个节点的所有 GitLab 服务:
sudo gitlab-ctl restart
如果您的 Consul 集群进程不在自己的服务器上,而是与其他服务(如 Redis HA 或 Patroni)共享, 请确保在升级这些服务器时遵循以下原则:
- 不要同时重启多个服务器上的服务。
- 在升级或重启服务之前,检查 Consul 集群是否健康。
升级 Gitaly 节点(Gitaly 集群(Praefect))
如果您正在运行 Gitaly 集群(Praefect),请遵循 Gitaly 集群(Praefect)的 零停机过程。
如果您在 AWS 上使用 Amazon Machine Images (AMIs),您可以通过 AMI 过程或升级包本身来升级 Gitaly 节点:
- 如果您使用 弹性网络接口 (ENI),您可以通过 AMI 过程进行升级。使用 ENI,您可以在 AMI 实例更改期间保留私有 DNS 名称,这对 Gitaly 工作至关重要。
- 如果您 不 使用 ENI,您必须使用 GitLab 包升级 Gitaly。这是因为 Gitaly 集群(Praefect)通过服务器主机名跟踪 Git 存储库的副本,而使用 AMI 重新部署会为节点分配新的主机名。即使存储相同,当主机名更改时,Gitaly 集群(Praefect)也无法工作。
但是,Praefect 节点可以通过 AMI 重新部署过程进行升级:
- AMI 重新部署过程必须包含
gitlab-ctl reconfigure。 在 AMI 上设置praefect['auto_migrate'] = false,以便所有节点都获得此设置。这可以防止reconfigure自动运行数据库迁移。 - 应使用升级映像重新部署的第一个节点应该是您的部署节点。
- 部署后,在
gitlab.rb中设置praefect['auto_migrate'] = true并使用gitlab-ctl reconfigure应用。这将运行数据库迁移。 - 重新部署您的其他 Praefect 节点。
升级不属于 Gitaly 集群(Praefect)的 Gitaly 节点
对于不属于 Gitaly 集群(Praefect)的 Gitaly 服务器,升级 GitLab 包。
如果您有多个 Gitaly 分片或使用 NFS 的多个负载均衡 Gitaly 节点,升级 Gitaly 服务器的顺序无关紧要。
升级 PostgreSQL 节点
对于非集群化 PostgreSQL 服务器:
-
升级过程不会在升级二进制文件时重启 PostgreSQL。重启以加载新版本:
sudo gitlab-ctl restart
升级 Patroni 节点
Patroni 用于实现 PostgreSQL 的高可用性。
如果需要升级 PostgreSQL 主版本,请遵循主版本过程。
所有其他版本的升级过程首先在所有副本上执行。升级后,集群从领导者故障转移到其中一个升级的副本。这确保只需要一次故障转移,完成后新的领导者已升级。
遵循以下过程:
-
识别领导者节点和副本节点,并 验证集群是否健康。 在数据库节点上运行:
sudo gitlab-ctl patroni members -
在其中一个副本节点上 升级 GitLab 包。
-
重启以加载新版本:
sudo gitlab-ctl restart -
对其他副本重复这些步骤:升级、重启、健康检查。
-
使用与副本相同的包升级升级领导者节点。
-
重启领导者节点上的所有服务以加载新版本,并触发集群故障转移:
sudo gitlab-ctl restart
升级 PgBouncer 节点
如果您在 Rails(应用程序)节点上运行 PgBouncer,则 PgBouncer 作为应用程序服务器升级的一部分进行升级。
在 PgBouncer 节点上 升级 GitLab 包。
升级 Redis 节点
通过 升级 GitLab 包 升级独立的 Redis 服务器。
升级 Redis HA(使用 Sentinel)
- Tier: 高级版、旗舰版
- Offering: GitLab 自托管
遵循 零停机说明 升级您的 Redis HA 集群。
升级 Rails 组件
所有 Puma 和 Sidekiq 进程先前都已关闭。在每个节点上:
-
确保
/etc/gitlab/skip-auto-reconfigure不存在。 -
检查 Puma 和 Sidekiq 已关闭:
ps -ef | egrep 'puma: | puma | sidekiq '
选择一个运行 Puma 的节点。这是您的部署节点,负责运行所有数据库迁移。在部署节点上:
-
确保服务器配置允许常规迁移。检查
/etc/gitlab/gitlab.rb不包含gitlab_rails['auto_migrate'] = false。 要么专门设置gitlab_rails['auto_migrate'] = true,要么省略以使用默认行为(true)。 -
如果您使用 PgBouncer:
在运行迁移之前,您必须绕过 PgBouncer 并直接连接到 PostgreSQL。
Rails 在尝试运行迁移时使用咨询锁,以防止在同一数据库上并发运行迁移。这些锁在事务之间不共享,导致在使用 PgBouncer 在事务池模式下运行数据库迁移时出现
ActiveRecord::ConcurrentMigrationError和其他问题。-
如果您运行 Patroni,找到领导者节点。在数据库节点上运行:
sudo gitlab-ctl patroni members -
在部署节点上更新
gitlab.rb。更改gitlab_rails['db_host']和gitlab_rails['db_port']为:- 您数据库服务器的主机和端口(非集群化 PostgreSQL)。
- 如果您运行 Patroni,则为集群领导者主机和端口。
-
应用更改:
sudo gitlab-ctl reconfigure
-
-
如果您在部署节点上修改了
gitlab.rb以绕过 PgBouncer:-
在部署节点上更新
gitlab.rb。将gitlab_rails['db_host']和gitlab_rails['db_port']更改回您的 PgBouncer 设置。 -
应用更改:
sudo gitlab-ctl reconfigure
-
-
确保所有服务都在运行升级后的版本,并且(如果适用)使用 PgBouncer 访问数据库, 重启部署节点上的所有服务:
sudo gitlab-ctl restart
接下来,升级所有其他 Puma 和 Sidekiq 节点。在这些节点上的 gitlab.rb 中,设置 gitlab_rails['auto_migrate'] 可以是任何值。
它们可以并行升级:
-
确保所有服务都已重启:
sudo gitlab-ctl restart
现在所有有状态组件都已升级,您需要遵循 GitLab 图表升级步骤 来升级无状态组件(Webservice、Sidekiq、其他支持服务)。
执行 GitLab 图表升级后,恢复数据库客户端:
kubectl scale deploy -lapp=sidekiq,release=<helm release name> -n <namespace> --replicas=<value>
kubectl scale deploy -lapp=webservice,release=<helm release name> -n <namespace> --replicas=<value>
kubectl scale deploy -lapp=prometheus,release=<helm release name> -n <namespace> --replicas=<value>