docker-gitlab高可用数据库:PostgreSQL主从复制配置

docker-gitlab高可用数据库:PostgreSQL主从复制配置

【免费下载链接】docker-gitlab Dockerized GitLab 【免费下载链接】docker-gitlab 项目地址: https://gitcode.com/gh_mirrors/do/docker-gitlab

数据库故障导致GitLab服务中断?团队协作被迫停滞?本文将详解如何通过PostgreSQL主从复制实现docker-gitlab数据库高可用,确保代码仓库数据安全与服务持续运行。完成配置后,你将获得自动故障转移能力、零数据丢失保障和99.9%的服务可用性。

架构设计与工作原理

PostgreSQL主从复制通过WAL(Write-Ahead Logging)机制实现数据同步。主库(Master)处理所有写操作并记录日志,从库(Standby)实时同步日志并回放,确保数据一致性。当主库故障时,从库可快速提升为主库,保障服务连续性。

当前项目默认配置为单节点数据库,存在单点故障风险:

准备工作与环境要求

硬件资源

  • 主库: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.105432/srv/gitlab/postgresql/master
从库192.168.1.115432/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: streamingsent_lsnwrite_lsnflush_lsn值接近。

测试故障转移

  1. 停止主库服务:docker-compose stop postgresql
  2. 观察GitLab应用是否自动切换到从库
  3. 验证数据一致性:在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前需:

  1. 停止主库写入流量
  2. 确保所有WAL日志同步至从库
  3. 按主库→从库顺序升级
  4. 升级完成后验证复制状态

总结与最佳实践

通过PostgreSQL主从复制配置,docker-gitlab实现了数据库层面的高可用。关键要点:

  • 使用专用复制用户并限制权限
  • 合理配置WAL保留策略,避免从库追赶失败
  • 定期测试故障转移流程,确保生产环境可用
  • 结合监控工具(如Prometheus+Grafana)监控复制延迟

完整配置文件可参考:

建议根据实际业务规模调整服务器资源和复制拓扑,大规模部署可考虑添加PgBouncer连接池和Patroni自动故障转移工具。

【免费下载链接】docker-gitlab Dockerized GitLab 【免费下载链接】docker-gitlab 项目地址: https://gitcode.com/gh_mirrors/do/docker-gitlab

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值