要实现高可用的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
# 编辑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
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
# 在从节点上编辑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
使用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;
}
}
如果不想自行维护高可用架构,可以考虑:
bash
sudo gitlab-rake gitlab:backup:create
复制延迟问题:
wal_keep_segments
值SELECT * FROM pg_stat_replication;
故障转移后数据不一致:
性能问题:
此方案提供了企业级的高可用GitLab配置,可根据实际需求调整服务器规格和节点数量。