多数据库
- 引入于 15.7 版本。
默认情况下,极狐GitLab 使用单个应用程序数据库,称为 main
数据库。
要扩展极狐GitLab,您可以将极狐GitLab 配置为使用多个应用程序数据库。
由于已知问题,使用多数据库配置极狐GitLab 功能处于 beta 阶段。
当您设置多数据库后,极狐GitLab 会为 CI/CD 功能使用第二个应用程序数据库,引用为 ci
数据库。我们不会排除在单个 PostgreSQL 实例上同时托管两个数据库
在 main
和 ci
数据库中的所有数据表结构必须要精确一致。看一些例子:
- 当配置多数据库时,
ci_pipelines
数据表同时存在于main
和ci
数据库中,当时极狐GitLab 仅读写ci
数据库中的ci_pipelines
数据表。 - 相似的,
projects
数据表同时存在于main
和ci
数据库中,当时极狐GitLab 仅读写main
数据库中的projects
数据表。 - 对有些数据表(比如
loose_foreign_keys_deleted_records
),极狐GitLab 会同时在main
和ci
数据库进行读写。
已知问题
- 一旦数据被迁移到
ci
数据库中,您无法将其迁移回。 - 对于大型安装可能会有宕机时间(数据库超过 100GB)。
- 两个数据库的运行在 Geo 中还不支持。
使用脚本来迁移既有安装实例
- 迁移既有 Linux 软件包安装实例的脚本引入于极狐GitLab 16.8。
既有的 Linux 软件包安装
此迁移需要宕机时间。如果在迁移期间发生了一些非期望的事情,安全起见,应重新开始。
准备
-
验证数据磁盘的可用空间:
-
数据库节点需要足够的空间来存储
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'"
-
-
计划宕机时间。宕机时间取决于
gitlabhq_production
数据库的大小。- 我们会 dump
gitlabhq_production
并将其恢复到一个新的gitlabhq_production_ci
数据库。50GB 以下的数据库应该在 30 分钟内完成。大型数据库可能需要更多时间。比如,100GB 的数据库可能需要 1-2 小时拷贝到新数据库中。 - 我们还建议为小型作业(诸如修改配置)也计划一些时间。
- 我们会 dump
-
创建新的
gitlabhq_production_ci
数据库:sudo gitlab-psql -c "CREATE DATABASE gitlabhq_production_ci WITH OWNER 'gitlab'"
迁移
此流程会包含宕机时间。运行迁移脚本将停止极狐GitLab 实例。迁移完成后,实例会重启。
-
创建配置备份:
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.org
-
编辑
/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'
-
运行迁移脚本:
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
数据库,您可以拷贝数据库。
既有自编译实例
-
停止极狐GitLab,除了PostgreSQL:
sudo service gitlab stop sudo service postgresql start
-
Dump
main
数据库:sudo -u git pg_dump -f gitlabhq_production.sql gitlabhq_production
-
创建
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
-
配置极狐GitLab 以使用多数据库。
既有的 Linux 软件包安装
-
停止极狐GitLab,除了 PostgreSQL:
sudo gitlab-ctl stop sudo gitlab-ctl start postgresql
-
Dump
main
数据库:sudo -u gitlab-psql /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production
-
创建
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
-
配置极狐GitLab 以使用多个数据库。
使用流复制的既有 Linux 软件包安装实例
为了减少宕机时间,您可以设置流复制来从 main
数据库迁移既有数据到 ci
数据库。此流程会导致两个数据库集群。
此流程可能同时耗时、耗资源的。在执行之前要在可用性之间做好平衡。
要为创建两个数据库集群设置流复制:
- 从极狐GitLab 数据库设置流复制到新数据库实例。
- 当新副本已经可用时,禁用后端迁移。
- 确保所有后端迁移完成。
-
停止极狐GitLab,除了 PostgreSQL:
sudo gitlab-ctl stop sudo gitlab-ctl start postgresql
- 副本完成后,停止流复制,将副本提升到主实例中。现在您就有
main
和ci
两个数据库集群了。 - 配置极狐GitLab 以使用多个数据库。
关于如何设置流复制的更多详情,可以查阅 Linux 软件包安装的 PostgreSQL 复制和故障转移。
设置多个数据库
要配置极狐GitLab 使用多个应用程序数据库,根据您的安装类型来执行如下操作。
main
数据会写入到 ci
数据库,反之亦然。私有化部署实例
-
对于既有实例,首先迁移数据。
-
以防万一,备份极狐GitLab。
-
停止极狐GitLab:
sudo service gitlab stop
-
打开
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 # ...
-
保存
config/database.yml
文件。 -
更新服务文件,将
GITLAB_ALLOW_SEPARATE_CI_DATABASE
环境变量设置为true
。 -
仅针对新安装实例。创建
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
-
锁定
main
数据库中的ci
数据表的写权限,反之亦然。sudo -u git -H bundle exec rake gitlab:db:lock_writes
-
重启极狐GitLab:
sudo service gitlab restart
Linux 软件包安装
-
对于既有实例,首先迁移数据。
-
以防万一,备份极狐GitLab。
-
停止极狐GitLab:
sudo gitlab-ctl stop
-
编辑
/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'
-
保存
/etc/gitlab/gitlab.rb
文件。 -
重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
-
可选,仅对新安装的实例。如果
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
-
锁定
main
数据库中的ci
数据表的写权限,反之亦然。sudo gitlab-ctl start postgresql sudo gitlab-rake gitlab:db:lock_writes
-
重启极狐GitLab:
sudo gitlab-ctl restart