docker-gitlab高可用数据库:PostgreSQL主从复制配置
【免费下载链接】docker-gitlab Dockerized GitLab 项目地址: https://gitcode.com/gh_mirrors/do/docker-gitlab
数据库故障导致GitLab服务中断?团队协作被迫停滞?本文将详解如何通过PostgreSQL主从复制实现docker-gitlab数据库高可用,确保代码仓库数据安全与服务持续运行。完成配置后,你将获得自动故障转移能力、零数据丢失保障和99.9%的服务可用性。
架构设计与工作原理
PostgreSQL主从复制通过WAL(Write-Ahead Logging)机制实现数据同步。主库(Master)处理所有写操作并记录日志,从库(Standby)实时同步日志并回放,确保数据一致性。当主库故障时,从库可快速提升为主库,保障服务连续性。
当前项目默认配置为单节点数据库,存在单点故障风险:
- docker-compose.yml中定义的postgresql服务仅1个实例
- kubernetes/postgresql-rc.yml的replicas参数设为1
- 数据卷使用本地存储,无冗余备份
准备工作与环境要求
硬件资源
- 主库:2核CPU/4GB内存/50GB SSD
- 从库:2核CPU/4GB内存/50GB SSD
- 网络:主从节点间100Mbps以上带宽,延迟<10ms
软件版本
- Docker Engine: 20.10+
- Docker Compose: 2.0+
- PostgreSQL: 16 (匹配docker-compose.yml中的kkimurak/sameersbn-postgresql:16)
- GitLab: 18.5.1 (对应docker-compose.yml的sameersbn/gitlab:18.5.1)
网络规划
| 节点角色 | IP地址 | 服务端口 | 数据卷路径 |
|---|---|---|---|
| 主库 | 192.168.1.10 | 5432 | /srv/gitlab/postgresql/master |
| 从库 | 192.168.1.11 | 5432 | /srv/gitlab/postgresql/standby |
主库配置步骤
1. 修改Docker Compose配置
编辑docker-compose.yml,在postgresql服务中添加复制所需环境变量和配置文件挂载:
services:
postgresql:
restart: always
image: kkimurak/sameersbn-postgresql:16
volumes:
- postgresql-data:/var/lib/postgresql:Z
- ./postgresql-master.conf:/etc/postgresql/16/main/conf.d/replication.conf:ro
environment:
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
- DB_EXTENSION=pg_trgm,btree_gist
- REPLICATION_USER=repluser
- REPLICATION_PASS=replpassword
2. 创建主库配置文件
在项目根目录创建postgresql-master.conf:
# 启用WAL归档
wal_level = replica
max_wal_senders = 3
wal_keep_size = 16GB
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/archive/%f'
# 复制连接限制
max_replication_slots = 3
hot_standby = on
3. 初始化主库并创建复制用户
启动主库容器并执行初始化命令:
docker-compose up -d postgresql
docker-compose exec postgresql su - postgres -c "psql -c \"CREATE USER repluser WITH REPLICATION ENCRYPTED PASSWORD 'replpassword'\""
从库配置步骤
1. 创建从库Docker Compose配置
在从库服务器创建docker-compose-standby.yml:
version: '3'
services:
postgresql-standby:
restart: always
image: kkimurak/sameersbn-postgresql:16
volumes:
- postgresql-standby-data:/var/lib/postgresql:Z
- ./postgresql-standby.conf:/etc/postgresql/16/main/conf.d/replication.conf:ro
environment:
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
- REPLICATION_ROLE=standby
- PRIMARY_HOST=192.168.1.10
- PRIMARY_PORT=5432
- REPLICATION_USER=repluser
- REPLICATION_PASS=replpassword
ports:
- "5432:5432"
volumes:
postgresql-standby-data:
2. 创建从库配置文件
创建postgresql-standby.conf:
hot_standby = on
max_standby_archive_delay = 300s
max_standby_streaming_delay = 300s
primary_conninfo = 'host=192.168.1.10 port=5432 user=repluser password=replpassword application_name=standby1'
recovery_target_timeline = 'latest'
3. 初始化从库复制
# 停止从库服务
docker-compose -f docker-compose-standby.yml down
# 清空数据目录
sudo rm -rf /var/lib/docker/volumes/$(basename $(pwd))_postgresql-standby-data/_data/*
# 启动从库,自动同步主库数据
docker-compose -f docker-compose-standby.yml up -d
GitLab应用配置
修改数据库连接配置
编辑assets/runtime/config/gitlabhq/database.yml,添加故障转移配置:
production:
main:
adapter: postgresql
encoding: unicode
database: gitlabhq_production
host: 192.168.1.10
port: 5432
username: gitlab
password: "password"
pool: 10
prepared_statements: false
# 故障转移配置
replica_host: 192.168.1.11
replica_port: 5432
replica_username: gitlab
replica_password: "password"
load_balancing:
hosts:
- 192.168.1.10
- 192.168.1.11
discover:
nameserver: 127.0.0.1
record: db.gitlab.example.com
验证与监控
检查复制状态
在主库执行:
docker-compose exec postgresql su - postgres -c "psql -x -c \"SELECT * FROM pg_stat_replication\""
正常输出应显示从库连接信息,包括state: streaming和sent_lsn、write_lsn、flush_lsn值接近。
测试故障转移
- 停止主库服务:
docker-compose stop postgresql - 观察GitLab应用是否自动切换到从库
- 验证数据一致性:在GitLab创建新项目,恢复主库后检查数据是否同步
维护与注意事项
定期备份策略
结合PostgreSQL复制与GitLab自身备份功能:
# 执行GitLab完整备份
docker-compose exec gitlab gitlab-rake gitlab:backup:create
# 备份文件位于[docker-compose.yml](https://link.gitcode.com/i/de0a80dd745ddfaa06d86e0ec1f64844)定义的gitlab-data卷中
版本升级注意事项
升级PostgreSQL前需:
- 停止主库写入流量
- 确保所有WAL日志同步至从库
- 按主库→从库顺序升级
- 升级完成后验证复制状态
总结与最佳实践
通过PostgreSQL主从复制配置,docker-gitlab实现了数据库层面的高可用。关键要点:
- 使用专用复制用户并限制权限
- 合理配置WAL保留策略,避免从库追赶失败
- 定期测试故障转移流程,确保生产环境可用
- 结合监控工具(如Prometheus+Grafana)监控复制延迟
完整配置文件可参考:
- Docker Compose示例:contrib/docker-swarm/docker-compose.yml
- Kubernetes部署:kubernetes/postgresql-rc.yml
建议根据实际业务规模调整服务器资源和复制拓扑,大规模部署可考虑添加PgBouncer连接池和Patroni自动故障转移工具。
【免费下载链接】docker-gitlab Dockerized GitLab 项目地址: https://gitcode.com/gh_mirrors/do/docker-gitlab
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



