极狐GitLab集群高可用方案,多节点架构与故障自愈实践

集群高可用方案指通过多节点部署与组件级冗余,消除极狐GitLab研发平台中数据库、缓存、存储等单点故障,实现故障自动转移与持续可用。

一个单节点实例撑不住一家企业的研发命脉

很多团队从单节点极狐GitLab起步,跑了几百人规模一切正常,于是默认它永远不会挂。但单节点的风险从不体现在日常,而是体现在数据库损坏、磁盘故障、机房断网这些低频高损事件上。

研发平台一停,代码提交、合并请求、流水线、发布全部中断。对多数企业来说,这已经不是"运维事故",而是研发组织停摆。

极狐GitLab在参考架构文档中把这件事讲得很直白:2,000用户以内建议单节点或非HA部署配合自动备份;3,000用户及以上建议完整HA架构。也就是说,HA不是可选项,而是规模的函数------用户量到了,可用性要求就到了。

三种部署形态,先把路选对

极狐GitLab官方提供了三种可投入生产的多节点形态,选择前先对号入座:

部署形态 组成方式 适用规模
Linux 软件包(Omnibus) 全组件部署在虚拟机,PostgreSQL/Redis/对象存储可选云服务 1k / 2k / 3k / 5k / 10k / 25k / 50k 用户
云原生混合(Cloud Native Hybrid) 无状态组件(Webservice、Sidekiq)用 Helm Chart 跑在 K8s,有状态组件留在 VM 或云服务 2k / 3k / 5k / 10k / 25k / 50k 用户
云原生(Cloud Native) 全部组件进 K8s,PostgreSQL/Redis/对象存储用外部托管服务 小(≤100 RPS)/ 中(≤200)/ 大(≤500)/ 超大(≤1000 RPS)

选型还有一条官方红线要注意:不支持在 K8s 中运行有状态组件 (PostgreSQL、Redis),也不支持跨多个地域部署单个环境------高延迟与脑裂风险是硬约束。跨地域容灾请走 Geo 方案,那是另一个专题。

以3K参考架构为例,看清楚每个节点在干什么

3K架构(60 RPS / 3,000用户)是官方定义的实现HA的最小推荐规模。它的组件分工如下:

组件 节点数与规格 HA机制
PostgreSQL 3 × 2 vCPU / 7.5 GB Patroni 管理 1主2从,故障自动转移
PgBouncer 3 × 2 vCPU / 1.8 GB 经内部负载均衡分发连接
Redis/Sentinel 3 × 2 vCPU / 7.5 GB 主从 + Sentinel 哨兵,quorum=2 自动选主
Gitaly 3 × 4 vCPU / 15 GB Gitaly Cluster,仓库多副本自动切换
Praefect 3 × 2 vCPU / 1.8 GB 事务代理,奇数节点法定人数
GitLab Rails 3 × 8 vCPU / 7.2 GB 无状态,负载均衡后横向扩展
Sidekiq 2 × 4 vCPU / 15 GB 后台任务横向扩展
Consul 3 × 2 vCPU / 1.8 GB 服务发现与健康检查
监控节点 1 × 2 vCPU / 1.8 GB Prometheus 全链路指标
负载均衡 外部1 + 内部1,各 4 vCPU 流量入口与组件间分发

这里体现了一个通用工程共识:HA的本质是把"单点"改成"奇数个节点的多数派"。PostgreSQL靠Patroni、Redis靠Sentinel、Gitaly Cluster靠Praefect,三套机制殊途同归。

故障自愈是怎么发生的

以数据库为例,三个PostgreSQL节点由Patroni托管。主库宕机时,Patroni在剩余两个从库中自动选出新主库,Rails应用通过数据库负载均衡(db_load_balancing配置)将读写路由到新主,全程无需人工介入。验证集群状态只需一条命令:

shell 复制代码
sudo gitlab-ctl patroni members

Git仓库层面,Gitaly Cluster把每个仓库复制到所有Gitaly节点,Praefect监控副本健康度,主Gitaly节点故障时自动提升新主,写入请求随即切换。

落地配置长什么样

PostgreSQL节点核心配置(/etc/gitlab/gitlab.rb):

ruby 复制代码
roles(['patroni_role', 'pgbouncer_role'])
patroni['postgresql']['max_replication_slots'] = 6
patroni['postgresql']['max_wal_senders'] = 7

Rails节点连接数据库与Praefect:

ruby 复制代码
gitlab_rails['db_host'] = '10.6.0.20'
gitlab_rails['db_port'] = 6432
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] }
gitlab_rails['repositories_storages'] = {
  "default" => { "gitaly_address" => "tcp://10.6.0.40:2305", "gitaly_token" => '<praefect_external_token>' }
}

部署完成后按顺序验证:

  1. sudo gitlab-ctl status------各节点服务状态全绿
  2. sudo /opt/gitlab/embedded/bin/consul members------Consul成员完整
  3. sudo gitlab-rake gitlab:gitaly:check------Gitaly连通性通过
  4. gitlab-ctl pgb-console 后执行 show databases;------PgBouncer连接正常

什么时候别一步到位上全套HA

官方在3K架构文档中给出了明确的伸缩口径:用户数或RPS低于3K但必须保证HA时,可以采用受支持的缩减修改------本质是同一架构的低性能版本,组件拓扑不变、规格下调。但除文档明确列出的修改外,其他缩减均不受支持。

另外三点实践经验值得放在决策清单里:

  • HA意味着每个组件成倍部署,成本会明显高于单节点,先算清可用性收益与预算的账
  • 对象存储建议外置并替代NFS,每种数据类型独立bucket,性能与可靠性都更好
  • 所有节点共享/etc/gitlab/gitlab-secrets.json,这是极易遗漏的坑

如果当前规模还没到临界点,先把自动化备份与恢复演练做扎实,同样能拿到不错的RTO/RPO------高可用是渐进工程,不是一步登天。

常见问题

Q1:多少用户规模才需要上集群高可用?

官方建议2,000用户以内采用单节点或非HA部署配合自动备份;3,000用户及以上采用完整HA架构。若用户数不足3,000但必须保证HA,可使用官方支持的3K架构缩减修改。

Q2:Gitaly Cluster和普通Gitaly节点有什么区别?

普通Gitaly节点是单副本存储,节点故障时该节点上的仓库不可用。Gitaly Cluster通过Praefect将每个仓库复制到多个Gitaly节点,主节点故障自动转移,存储层无单点。

Q3:能不能把PostgreSQL部署在Kubernetes里实现高可用?

官方明确不支持在K8s中运行PostgreSQL、Redis等有状态组件。云原生混合架构中,这类组件应保留在虚拟机或使用外部托管服务,无状态的Webservice和Sidekiq才进K8s。


想评估贵司研发平台的可用性现状与多节点改造路径?可预约极狐GitLab专家演示,或先免费试用体验完整的企业级能力。更多架构细节可直达官方文档中心。

相关推荐
孟健9 分钟前
我用 REA 逆向自己的 Electron 桌面端,扒出 178 个 IPC 通道后我反而放心了
架构·开源·ai编程
Cosolar2 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github
Linye2 小时前
配了 3 套 AI 规则还打架?聊聊 Agent 信源仲裁与三层验真
人工智能·架构
一条Go2 小时前
历史告警归档:为什么"删掉主库行"是最后一步
后端·架构·github
程序员敲笔记2 小时前
把 Ubuntu-22.04 从 C 盘搬到其他盘:小白操作手册
架构
炫酷的大高个2 小时前
3.2TB 权重开源了,我算了 4bit 之后还要几张卡
人工智能·架构·开源
ZhengEnCi4 小时前
AI Agent 时代前端项目怎么组织:按页面纵向切块,替代按类型分层目录
架构·前端框架·前端工程化
得物技术5 小时前
压测AI Agent 治理与评测调优实践
程序员·架构·测试
挖掘狂人6 小时前
负载均衡到底在干嘛?7 个场景给你说明白
架构·负载均衡
codigger7 小时前
负载均衡到底在干嘛?7 个场景给你说明白
网络·架构·负载均衡