- 停止对数据库的写入
- 升级 Consul 节点
- 升级 Gitaly 节点(Praefect / Gitaly 集群)
- 升级不属于 Gitaly 集群的 Gitaly 节点
- 升级 PostgreSQL 节点
- 升级 Patroni 节点
- 升级 PgBouncer 节点
- 升级 Redis 节点
- 升级 Redis HA(使用 Sentinel)
- 升级 Rails 组件
- 升级监控节点
多节点停机升级
虽然你可以通过零停机时间升级多节点极狐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 并且需要升级,请用云提供商的说明替换 Omnibus 极狐GitLab 的说明。
- 升级极狐GitLab应用程序(Sidekiq, Puma)并启动应用程序。
停止对数据库的写入
在升级之前,你需要停止对数据库的写入。该过程因你的参考架构而异。
::Tabs
:::TabTitle Linux 软件包
关闭所有运行这些进程的服务器上的 Puma 和 Sidekiq:
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop puma
:::TabTitle 云原生混合
对于云原生混合环境:
- 记录当前数据库客户端的副本数量以便后续重启:
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
::EndTabs
升级 Consul 节点
总结:
- 检查所有 Consul 节点是否健康。
- 在所有 Consul 服务器上升级极狐GitLab 软件包。
-
一次一个节点地重启所有极狐GitLab服务:
sudo gitlab-ctl restart
如果你的 Consul 集群进程不在它们自己的服务器上,并且与其他服务(如 Redis HA 或 Patroni)共享,请确保在升级这些服务器时遵循以下原则:
- 不要一次重启多个服务器的服务。
- 在升级或重启服务之前,检查 Consul 集群是否健康。
升级 Gitaly 节点(Praefect / Gitaly 集群)
如果你正在运行 Gitaly 集群,请遵循 Gitaly 集群的零停机过程。
如果你在 AWS 上使用 Amazon 机器映像(AMI),你可以通过 AMI 过程升级 Gitaly 节点,或者升级软件包本身:
- 如果你使用的是弹性网络接口(ENI),你可以通过 AMI 过程进行升级。使用 ENI,你可以通过 AMI 实例更改保留私有 DNS 名称,这对于 Gitaly 的工作至关重要。
- 如果你没有使用 ENI,则必须使用极狐GitLab软件包升级 Gitaly。这是因为 Gitaly 集群通过服务器主机名跟踪 Git 存储库的副本,而使用 AMI 的重新部署会为节点分配新的主机名。即使存储相同,当主机名更改时,Gitaly 集群也无法工作。
然而,Praefect 节点可以通过 AMI 重新部署过程进行升级:
- AMI 重新部署过程必须包含
gitlab-ctl reconfigure
。在 AMI 上设置praefect['auto_migrate'] = false
以便所有节点都获取此设置。这可以防止reconfigure
自动运行数据库迁移。 - 第一个使用升级映像重新部署的节点应为你的部署节点。
- 部署后,在
gitlab.rb
中设置praefect['auto_migrate'] = true
并应用gitlab-ctl reconfigure
。这将运行数据库迁移。 - 重新部署你的其他 Praefect 节点。
升级不属于 Gitaly 集群的 Gitaly 节点
对于不属于 Gitaly 集群的 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 作为应用程序服务器升级的一部分进行升级。
升级 Redis 节点
通过升级极狐GitLab软件包来升级独立的 Redis 服务器。
升级 Redis HA(使用 Sentinel)
遵循零停机说明来升级你的 Redis HA 集群。
升级 Rails 组件
::Tabs
:::TabTitle Linux 软件包
所有 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
:::TabTitle 云原生混合
现在所有有状态组件都已升级,你需要遵循极狐GitLab chart 升级步骤以升级无状态组件(Webservice、Sidekiq、其他支持服务)。
在执行极狐GitLab chart 升级后,恢复数据库客户端:
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>
::EndTabs