极狐GitLab双机热备搭建指南,主机备机部署与切换实操

定义框:双机热备是指用极狐GitLab Geo搭建一主一备两个站点,备站点实时复制主站点数据,主站点故障时可切换接管的部署架构。

先说清楚:极狐GitLab的"双机热备"长什么样

聊双机热备,很多人的第一反应是数据库层面的主从切换------备机平时待命,主机一挂VIP飘过去。极狐GitLab的方案逻辑类似,但载体是Geo组件:主站点持续把数据库、Git仓库、附件等资产复制到从站点,从站点保持一份随时可用的完整副本。需要切换时,按照灾难恢复文档执行提升操作,从站点一键转正为主站点。

有三条官方边界必须先讲明白,否则方案评审会上会被架住:

  1. 版本要求:Geo为极狐GitLab专业版及以上功能,私有化部署所有站点共用一份许可证;
  2. 版本一致:主、从站点必须运行相同的极狐GitLab版本,且站点间需通过特定端口互通;
  3. 环境对齐:主站点如果使用对象存储,从站点也必须使用对象存储;两站点时钟偏差超过1分钟,复制就会失败。

还有一条容易被忽略:官方文档明确写明自行编译安装不支持Geo,Linux软件包安装是推荐路径。

搭建前账:两台机器怎么分工

以最常见的两台单节点站点(1K参考架构)为例,主机与备机的分工如下:

维度 主站点 从站点(备机)
数据库角色 PostgreSQL读写 只读副本,流式复制
日常用途 承接全部读写流量 数据同步+可选就近读取
关键配置 geo_primary_role geo_secondary_role
切换方式 故障时永久禁用 gitlab-ctl geo promote提升

开始动手前,逐项核对这份前置检查单:

  1. 两个站点均已按参考架构文档独立安装并可登录;
  2. 主站点持有专业版或旗舰版订阅;
  3. 两站点极狐GitLab版本严格一致;
  4. 从站点可访问主站点PostgreSQL的5432端口;
  5. 两站点时钟已通过NTP同步。

主站点配置:六步打底

以下命令均出自官方两个单节点站点设置Geo文档。

第一步,设置唯一的Geo站点名称并应用:

ruby 复制代码
# /etc/gitlab/gitlab.rb
gitlab_rails['geo_node_name'] = 'gitlab-primary'
shell 复制代码
gitlab-ctl reconfigure
gitlab-ctl set-geo-primary-node

第二步,为数据库用户和复制用户设置密码(先生成MD5哈希再写入配置):

shell 复制代码
gitlab-ctl pg-password-md5 gitlab
gitlab-ctl pg-password-md5 gitlab_replicator
ruby 复制代码
postgresql['sql_user_password'] = '<gitlab用户md5哈希>'
postgresql['sql_replication_password'] = '<复制用户md5哈希>'
gitlab_rails['db_password'] = '<数据库明文密码>'

第三步,声明Geo主角色并开放网络监听:

ruby 复制代码
roles(['geo_primary_role'])
postgresql['listen_address'] = '<主站点IP>'
postgresql['md5_auth_cidr_addresses'] = ['<主站点IP>/32', '<从站点IP>/32']

第四步,临时关闭自动迁移后重启PostgreSQL,再恢复:

shell 复制代码
gitlab-ctl reconfigure
gitlab-ctl restart postgresql

第五步,确认PostgreSQL已监听5432端口,并取出复制证书:

shell 复制代码
netstat -plnt | grep 5432
cat ~gitlab-psql/data/server.crt

从站点配置:复制数据库是分水岭

备机这边的动作顺序很讲究,核心是一条命令:gitlab-ctl replicate-geo-database。它会删除从站点PostgreSQL上的全部现有数据,所以官方反复强调------从站点装好后先别往里灌任何数据。

按官方文档,从站点的落地步骤如下:

  1. 停止应用服务,验证到主站点数据库的网络连通性:
shell 复制代码
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
gitlab-rake gitlab:tcp_check[<主站点IP>,5432]
  1. 安装主站点复制证书并测试数据库连接:
shell 复制代码
install -D -o gitlab-psql -g gitlab-psql -m 0400 -T server.crt ~gitlab-psql/.postgresql/root.crt

sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql \
    --list -U gitlab_replicator \
    -d "dbname=gitlabhq_production sslmode=verify-ca" \
    -W -h <主站点IP>
  1. 在gitlab.rb中声明从角色:
ruby 复制代码
roles(['geo_secondary_role'])
postgresql['listen_address'] = '<从站点IP>'
postgresql['sql_replication_password'] = '<复制用户md5哈希>'
  1. 执行复制(每个从站点的复制槽名称必须全局唯一):
shell 复制代码
gitlab-ctl replicate-geo-database \
   --slot-name=secondary_one \
   --host=<主站点IP> \
   --sslmode=verify-ca

复制完成后还有两个必须手动做 的动作:把主站点的/etc/gitlab/gitlab-secrets.json复制到从站点(该文件不随Geo复制,涉及CI/CD变量与双因子认证的加解密),以及复制SSH主机密钥,否则用户通过SSH访问从站点时会收到主机密钥变更警告。

注册站点与切换实操

数据同步跑通后,在主站点UI的管理员 > Geo > 站点 > 添加站点 中登记从站点,注意名称必须与从站点的geo_node_name完全一致,外部URL必须与从站点external_url一致。随后在从站点执行验证:

shell 复制代码
gitlab-rake gitlab:geo:check

真正的切换(故障转移)同样有官方明确的三步流程:

  1. 永久禁用主站点 ,防止脑裂------有SSH权限就gitlab-ctl stop加systemctl disable gitlab-runsvdir,没有就改DNS、停虚拟机或防火墙阻断;
  2. 提升从站点 ------单节点执行sudo gitlab-ctl geo promote,提升前可用gitlab-ctl promotion-preflight-checks做最终校验;
  3. 清理跟踪数据库配置 ------注释gitlab.rb中的geo_secondary[]配置并gitlab-ctl reconfigure。

两条血泪边界也一并转述:提升启用了选择性同步的从站点,未复制的数据会永久丢失;原主站点提升后完全脱离Geo体系,想恢复只能作为新从站点重新接入。

FAQ

Q1:双机热备场景下,备站点平时能承担读流量吗?

可以。从站点提供完整的UI访问体验,未同步的读取会透明代理到主站点;也可通过统一URL配置地理路由,让就近团队自动接入。但写入始终在主站点,备站点数据库本身是只读的。

Q2:gitlab-secrets.json为什么必须手动复制?

该文件存放加密密钥,用于CI/CD变量、双因子认证等敏感数据的加解密。Geo不复制此文件,从站点与主站点密钥不一致时,故障转移后这些数据将无法解密。

Q3:切换后原主站点还能加回来吗?

可以,但不能直接复活。官方要求先确认旧主站点已彻底禁用,再按"将旧主站点恢复为从站点"的流程重新初始化,让它作为新从站点跟随当前主站点重新同步。

写在最后

双机热备不是装完就完事:时钟同步、版本对齐、secrets文件、切换演练,任何一环掉链子,真出事时备机就是一块昂贵的摆设。建议每季度做一次计划内故障转移演练,把切换流程变成肌肉记忆。

想评估Geo双机热备方案,或需要针对私有化环境的高可用架构咨询,可预约极狐GitLab专家演示,或前往官方文档中心查阅Geo完整章节。

相关推荐
zzu123zsw5 小时前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
Sayai2 天前
Neo4j 社区版高可用实战:DRBD 块级复制 + Keepalived 虚拟 IP 冷备切换(附启停 SOP 与脑裂防范)
运维·neo4j·keepalived·高可用·drbd
我不会起名字3224 天前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
有同事要进步6 天前
如何在github或者是gitlab上创建空文件
gitlab·github
GoodStudyAndDayDayUp8 天前
gitlab私有化跑CICD
gitlab·gitlab私有化跑cicd
成为你的宁宁8 天前
【Gitlab测试项目】
gitlab·devops
熊出没9 天前
高并发高可用系统设计:限流、熔断、降级与多级缓存实战指南
缓存·高并发·架构设计·高可用
光依旧10 天前
发版就掉请求?Spring Boot优雅停机的四步
运维·spring boot·nginx·高可用·优雅停机·mcp server
_可乐无糖10 天前
GitLab CI 脚本之 CI_COMMIT_AUTHOR
ci/cd·gitlab