插件窝 干货文章 如何在Linux上配置高可用的本地代码仓库(如GitLab)

如何在Linux上配置高可用的本地代码仓库(如GitLab)

GitLab 节点 PostgreSQL 配置 858    来源:    2025-04-16

在Linux上配置高可用GitLab仓库方案

方案概述

要实现高可用的GitLab代码仓库,可以采用以下两种主要架构:

  1. 主从复制架构:一个主节点处理所有写操作,多个从节点提供读服务
  2. 多主架构:多个节点同时处理读写操作(更复杂但可用性更高)

以下我将详细介绍主从复制架构的实现方案。

方案一:GitLab主从复制高可用架构

1. 基础环境要求

  • 服务器:至少2台Linux服务器(推荐Ubuntu/CentOS)
    • 主节点:8核CPU,16GB内存,100GB+存储
    • 从节点:4核CPU,8GB内存,100GB+存储
  • 网络:低延迟内网连接(<1ms延迟最佳)
  • 存储:建议使用SSD存储

2. 安装GitLab主节点

# 在Ubuntu上安装GitLab主节点
sudo apt update
sudo apt install -y curl openssh-server ca-certificates
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab-primary.example.com" apt-get install gitlab-ce

3. 配置PostgreSQL主从复制

主节点配置:

# 编辑PostgreSQL配置
sudo nano /var/opt/gitlab/postgresql/data/postgresql.conf

# 修改以下参数:
wal_level = hot_standby
max_wal_senders = 3
wal_keep_segments = 32
hot_standby = on

# 配置pg_hba.conf
sudo nano /var/opt/gitlab/postgresql/data/pg_hba.conf
# 添加从节点访问权限:
host replication gitlab-replicator <secondary-ip>/32 md5

# 重启PostgreSQL
sudo gitlab-ctl restart postgresql

从节点配置:

# 首先安装GitLab(不配置EXTERNAL_URL)
sudo apt install -y gitlab-ce

# 停止GitLab服务
sudo gitlab-ctl stop

# 清空现有数据
sudo rm -rf /var/opt/gitlab/postgresql/data/*

# 从主节点同步初始数据
sudo -u gitlab-psql pg_basebackup -h <primary-ip> -D /var/opt/gitlab/postgresql/data -U gitlab-replicator -v -P --wal-method=stream

# 创建恢复配置
sudo tee /var/opt/gitlab/postgresql/data/recovery.conf <<EOF
standby_mode = 'on'
primary_conninfo = 'host=<primary-ip> port=5432 user=gitlab-replicator password=<password>'
trigger_file = '/var/opt/gitlab/postgresql/data/postgresql.trigger'
EOF

# 启动服务
sudo gitlab-ctl start

4. 配置Redis高可用

GitLab使用Redis作为缓存和会话存储,建议配置Redis Sentinel:

# 在主节点上配置Redis
sudo nano /etc/gitlab/gitlab.rb

# 添加:
redis['master_password'] = 'your-redis-password'
redis['master_ip'] = '<primary-ip>'
redis['master_port'] = 6379
redis['slave_ip'] = '<secondary-ip>'
redis['slave_port'] = 6379
sentinel['bind'] = '0.0.0.0'
sentinel['master_name'] = 'gitlab-redis'
sentinel['master_ip'] = '<primary-ip>'
sentinel['master_port'] = 6379
sentinel['quorum'] = 2

# 重新配置GitLab
sudo gitlab-ctl reconfigure

5. 配置GitLab从节点

# 在从节点上编辑gitlab.rb
sudo nano /etc/gitlab/gitlab.rb

# 添加:
external_url 'http://gitlab-secondary.example.com'
gitlab_rails['enable'] = true
gitlab_rails['db_host'] = '/var/opt/gitlab/postgresql'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'gitlab'
gitlab_rails['db_password'] = 'your-db-password'
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'unicode'
postgresql['enable'] = false
redis['enable'] = false
unicorn['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = true
nginx['enable'] = true
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitaly['enable'] = true

# 重新配置GitLab
sudo gitlab-ctl reconfigure

6. 配置负载均衡器

使用Nginx或HAProxy作为前端负载均衡器:

# Nginx配置示例
upstream gitlab {
  server gitlab-primary.example.com:80;
  server gitlab-secondary.example.com:80 backup;
}

server {
  listen 80;
  server_name gitlab.example.com;

  location / {
    proxy_pass http://gitlab;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

7. 配置监控和故障转移

  • 使用Prometheus监控GitLab集群状态
  • 配置自动故障转移脚本检测主节点状态
  • 设置监控告警(如通过Alertmanager)

方案二:使用云托管解决方案(简化方案)

如果不想自行维护高可用架构,可以考虑:

  1. GitLab Premium高可用版:GitLab官方提供的企业级高可用解决方案
  2. GitHub Enterprise:GitHub的企业版,内置高可用支持
  3. Bitbucket Data Center:Atlassian提供的企业级Git解决方案

维护建议

  1. 定期备份bash sudo gitlab-rake gitlab:backup:create
  2. 监控关键指标:数据库连接数、响应时间、存储空间
  3. 定期测试故障转移:确保高可用机制在真实故障时能正常工作
  4. 保持更新:定期升级GitLab版本以获取安全更新和新功能

常见问题解决

  1. 复制延迟问题

    • 检查网络延迟
    • 增加wal_keep_segments
    • 监控PostgreSQL复制状态:SELECT * FROM pg_stat_replication;
  2. 故障转移后数据不一致

    • 确保使用正确的备份恢复流程
    • 检查PostgreSQL的WAL日志完整性
  3. 性能问题

    • 优化Gitaly配置(Git仓库服务)
    • 考虑添加更多从节点分担读负载
    • 使用SSD存储提高I/O性能

此方案提供了企业级的高可用GitLab配置,可根据实际需求调整服务器规格和节点数量。