多数据库

  • 引入于 15.7 版本。
caution此功能尚未准备好用于生产。

默认情况下,极狐GitLab 使用单个应用程序数据库,称为 main 数据库。

要扩展极狐GitLab,您可以将极狐GitLab 配置为使用多个应用程序数据库。

由于已知问题,使用多数据库配置极狐GitLab 功能处于 beta 阶段。

当您设置多数据库后,极狐GitLab 会为 CI/CD 功能使用第二个应用程序数据库,引用为 ci 数据库。我们不会排除在单个 PostgreSQL 实例上同时托管两个数据库

mainci 数据库中的所有数据表结构必须要精确一致。看一些例子:

  • 当配置多数据库时,ci_pipelines 数据表同时存在于 mainci 数据库中,当时极狐GitLab 仅读写 ci 数据库中的 ci_pipelines 数据表。
  • 相似的,projects 数据表同时存在于 mainci 数据库中,当时极狐GitLab 仅读写 main 数据库中的 projects 数据表。
  • 对有些数据表(比如 loose_foreign_keys_deleted_records),极狐GitLab 会同时在 mainci 数据库进行读写。

已知问题

  • 一旦数据被迁移到 ci 数据库中,您无法将其迁移回。
  • 对于大型安装可能会有宕机时间(数据库超过 100GB)。
  • 两个数据库的运行在 Geo 中还不支持。

使用脚本来迁移既有安装实例

  • 迁移既有 Linux 软件包安装实例的脚本引入于极狐GitLab 16.8。

既有的 Linux 软件包安装

此迁移需要宕机时间。如果在迁移期间发生了一些非期望的事情,安全起见,应重新开始。

准备

  1. 验证数据磁盘的可用空间:

    • 数据库节点需要足够的空间来存储 gitlabhq_production_ci 数据库的副本:我们 复制 gitlabhq_production。运行以下 SQL 查询以找出需要多少空间。添加 25%,以确保不会用完磁盘空间。

      sudo gitlab-psql -c "SELECT pg_size_pretty( pg_database_size('gitlabhq_production') );"
      
    • 在此过程中,gitlabhq_production 数据库的 dump 需要临时存储在运行迁移的节点的文件系统上。执行以下 SQL 语句以找出需要多少本地磁盘空间。添加 25%,以确保不会用完磁盘空间。

      sudo gitlab-psql -c "select sum(pg_table_size(concat(table_schema,'.',table_name))) from information_schema.tables where table_catalog = 'gitlabhq_production' and table_type = 'BASE TABLE'"
      
  2. 计划宕机时间。宕机时间取决于 gitlabhq_production 数据库的大小。

    • 我们会 dump gitlabhq_production 并将其恢复到一个新的 gitlabhq_production_ci 数据库。50GB 以下的数据库应该在 30 分钟内完成。大型数据库可能需要更多时间。比如,100GB 的数据库可能需要 1-2 小时拷贝到新数据库中。
    • 我们还建议为小型作业(诸如修改配置)也计划一些时间。
  3. 创建新的 gitlabhq_production_ci 数据库:

    sudo gitlab-psql -c "CREATE DATABASE gitlabhq_production_ci WITH OWNER 'gitlab'"
    

迁移

此流程会包含宕机时间。运行迁移脚本将停止极狐GitLab 实例。迁移完成后,实例会重启。

  1. 创建配置备份:

    sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.org
    
  2. 编辑 /etc/gitlab/gitlab.rb 并保存更改。不要 运行重新配置命令,因为迁移脚本会为您执行此过程。

    gitlab_rails['env'] = { 'GITLAB_ALLOW_SEPARATE_CI_DATABASE' => 'true' }
    gitlab_rails['databases']['ci']['enable'] = true
    gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
    
  3. 运行迁移脚本:

    sudo gitlab-ctl pg-decomposition-migration
    

此时,极狐GitLab 示例应该重启且好用了。

如果您想终端流程并且您想启动极狐GitLab,运行如下命令:

sudo cp /etc/gitlab/gitlab.rb.org /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

清除

如果一切运行正常,我们可以清理非需要的数据:

  • 在 Main 数据库中删除 CI 数据:
sudo gitlab-rake gitlab:db:truncate_legacy_tables:main
  • 在 CI 数据库中删除 Main 数据:
sudo gitlab-rake gitlab:db:truncate_legacy_tables:ci

迁移既有实例(手动流程)

要将既有数据从 main 数据库迁移至 ci 数据库,您可以拷贝数据库。

note如果在迁移期间发生了意外,安全起见,请重新开始。

既有自编译实例

  1. 启用后端迁移

  2. 确保所有后端迁移已完成

  3. 停止极狐GitLab,除了PostgreSQL:

    sudo service gitlab stop
    sudo service postgresql start
    
  4. Dump main 数据库:

    sudo -u git pg_dump -f gitlabhq_production.sql gitlabhq_production
    
  5. 创建 ci 数据,并从之前的 dump 拷贝数据:

    sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER git;"
    sudo -u git psql -f gitlabhq_production.sql gitlabhq_production_ci
    
  6. 配置极狐GitLab 以使用多数据库

既有的 Linux 软件包安装

  1. 启用后端迁移

  2. 确保所有后端迁移已完成

  3. 停止极狐GitLab,除了 PostgreSQL:

    sudo gitlab-ctl stop
    sudo gitlab-ctl start postgresql
    
  4. Dump main 数据库:

    sudo -u gitlab-psql /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production
    
  5. 创建 ci 数据库并从之前的 dump 拷贝数据:

    sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER gitlab;"
    sudo -u gitlab-psql  /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production_ci
    
  6. 配置极狐GitLab 以使用多个数据库

使用流复制的既有 Linux 软件包安装实例

为了减少宕机时间,您可以设置流复制来从 main 数据库迁移既有数据到 ci 数据库。此流程会导致两个数据库集群。

此流程可能同时耗时、耗资源的。在执行之前要在可用性之间做好平衡。

要为创建两个数据库集群设置流复制:

  1. 从极狐GitLab 数据库设置流复制到新数据库实例。
  2. 当新副本已经可用时,禁用后端迁移
  3. 确保所有后端迁移完成
  4. 停止极狐GitLab,除了 PostgreSQL:

    sudo gitlab-ctl stop
    sudo gitlab-ctl start postgresql
    
  5. 副本完成后,停止流复制,将副本提升到主实例中。现在您就有 mainci 两个数据库集群了。
  6. 配置极狐GitLab 以使用多个数据库

关于如何设置流复制的更多详情,可以查阅 Linux 软件包安装的 PostgreSQL 复制和故障转移

设置多个数据库

要配置极狐GitLab 使用多个应用程序数据库,根据您的安装类型来执行如下操作。

caution在设置多数据库之前,您必须停止极狐GitLab。这将会防止脑裂的产生,其中 main 数据会写入到 ci 数据库,反之亦然。

私有化部署实例

  1. 对于既有实例,首先迁移数据

  2. 以防万一,备份极狐GitLab

  3. 停止极狐GitLab:

    sudo service gitlab stop
    
  4. 打开 config/database.yml 并在 production: 下面添加 ci: 部分。对于此新的 ci: 部分的可能值,可查看 config/database.yml.decomposed-postgresql。一旦修改,config/database.yml 的内容如下:

    production:
      main:
        # ...
      ci:
        adapter: postgresql
        encoding: unicode
        database: gitlabhq_production_ci
        # ...
    
  5. 保存 config/database.yml 文件。

  6. 更新服务文件,将 GITLAB_ALLOW_SEPARATE_CI_DATABASE 环境变量设置为 true

  7. 仅针对新安装实例。创建 gitlabhq_production_ci 数据库:

    sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
    sudo -u git -H bundle exec rake db:schema:load:ci
    
  8. 锁定 main 数据库中的 ci 数据表的写权限,反之亦然。

    sudo -u git -H bundle exec rake gitlab:db:lock_writes
    
  9. 重启极狐GitLab:

    sudo service gitlab restart
    
  10. 启用后端迁移

Linux 软件包安装

  1. 对于既有实例,首先迁移数据

  2. 以防万一,备份极狐GitLab

  3. 停止极狐GitLab:

    sudo gitlab-ctl stop
    
  4. 编辑 /etc/gitlab/gitlab.rb 并添加如下内容:

    gitlab_rails['env'] = { 'GITLAB_ALLOW_SEPARATE_CI_DATABASE' => 'true' }
    gitlab_rails['databases']['ci']['enable'] = true
    gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
    
  5. 保存 /etc/gitlab/gitlab.rb 文件。

  6. 重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    
  7. 可选,仅对新安装的实例。如果 gitlabhq_production_ci 数据库不存在,则重新配置会创建此数据。如果数据库没有自动创建,请手动创建:

    sudo gitlab-ctl start postgresql
    sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER gitlab;"
    sudo gitlab-rake db:schema:load:ci
    
  8. 锁定 main 数据库中的 ci 数据表的写权限,反之亦然。

    sudo gitlab-ctl start postgresql
    sudo gitlab-rake gitlab:db:lock_writes
    
  9. 重启极狐GitLab:

    sudo gitlab-ctl restart
    
  10. 启用后端迁移