多数据库

  • 引入于 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. 启用后端迁移