Help us learn about your current experience with the documentation. Take the survey.

Geo 与外部 PostgreSQL 实例

  • 版本:Premium, Ultimate
  • 产品:GitLab Self-Managed

本文档适用于使用不由 Linux 软件包管理的 PostgreSQL 实例的情况。这包括 云托管实例, 或手动安装和配置的 PostgreSQL 实例。

请确保您使用的是 Linux 软件包附带 的 PostgreSQL 版本之一,以便在需要重建 Geo 站点时避免版本不匹配

如果您正在使用 GitLab Geo,我们强烈建议您运行通过 Linux 软件包安装的实例,或使用 已验证的云托管实例, 因为我们的主动开发和测试都基于这些实例。 我们无法保证与其他外部数据库的兼容性。

站点

  1. 通过 SSH 登录到您主站点上的 Rails 节点并以 root 用户身份登录:

    sudo -i
  2. 编辑 /etc/gitlab/gitlab.rb 并添加以下内容:

    ##
    ## Geo Primary role
    ## - configure dependent flags automatically to enable Geo
    ##
    roles ['geo_primary_role']
    
    ##
    ## The unique identifier for the Geo site. See
    ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
  3. 重新配置 Rails 节点以使更改生效:

    gitlab-ctl reconfigure
  4. Rails 节点上执行以下命令,将该站点定义为站点:

    gitlab-ctl set-geo-primary-node

    此命令会使用您在 /etc/gitlab/gitlab.rb 中定义的 external_url

配置外部数据库以进行复制

要设置外部数据库,您可以:

  • 自己设置流复制(例如 Amazon RDS,或不由 Linux 软件包管理的裸机)。
  • 按照以下说明手动配置您的 Linux 软件包安装。

利用您的云提供商工具复制主数据库

假设您已在 AWS EC2 上设置了使用 RDS 的主站点。 现在,您只需在不同区域创建一个只读副本,复制过程将由 AWS 管理。请确保您已根据需要设置了网络 ACL(访问控制列表)、子网和安全组,以便辅助站点的 Rails 节点可以访问数据库。

以下说明详细介绍了如何为常见的云提供商创建只读副本:

当您的只读副本设置完成后,您可以跳转到配置您的辅助站点

不支持使用逻辑复制方法,例如 AWS Database Migration ServiceGoogle Cloud Database Migration Service,来将本地主数据库复制到 RDS 辅助数据库等场景。

手动配置主数据库以进行复制

geo_primary_role 通过修改 pg_hba.confpostgresql.conf 来配置节点的数据库以进行复制。请手动对您的外部数据库配置进行以下更改,并确保之后重启 PostgreSQL 以使更改生效:

##
## Geo Primary Role
## - pg_hba.conf
##
host    all         all               <trusted primary IP>/32       md5
host    replication gitlab_replicator <trusted primary IP>/32       md5
host    all         all               <trusted secondary IP>/32     md5
host    replication gitlab_replicator <trusted secondary IP>/32     md5
##
## Geo Primary Role
## - postgresql.conf
##
wal_level = hot_standby
max_wal_senders = 10
wal_keep_segments = 50
max_replication_slots = 1 # number of secondary instances
hot_standby = on

辅助站点

手动配置副本数据库

请手动对您的外部副本数据库的 pg_hba.confpostgresql.conf 进行以下配置更改,并确保之后重启 PostgreSQL 以使更改生效:

##
## Geo Secondary Role
## - pg_hba.conf
##
host    all         all               <trusted secondary IP>/32     md5
host    replication gitlab_replicator <trusted secondary IP>/32     md5
host    all         all               <trusted primary IP>/24       md5
##
## Geo Secondary Role
## - postgresql.conf
##
wal_level = hot_standby
max_wal_senders = 10
wal_keep_segments = 10
hot_standby = on

配置辅助站点以使用外部只读副本

对于 Linux 软件包安装, geo_secondary_role 具有三个主要功能:

  1. 配置副本数据库。
  2. 配置跟踪数据库。
  3. 启用 Geo 日志游标(本节不涉及)。

要配置到外部只读副本数据库的连接并启用日志游标:

  1. 通过 SSH 登录到您辅助站点上的每个 Rails、Sidekiq 和 Geo 日志游标节点,并以 root 用户身份登录:

    sudo -i
  2. 编辑 /etc/gitlab/gitlab.rb 并添加以下内容

    ##
    ## Geo Secondary role
    ## - configure dependent flags automatically to enable Geo
    ##
    roles ['geo_secondary_role']
    
    # note this is shared between both databases,
    # make sure you define the same password in both
    gitlab_rails['db_password'] = '<your_primary_db_password_here>'
    
    gitlab_rails['db_username'] = 'gitlab'
    gitlab_rails['db_host'] = '<database_read_replica_host>'
    
    # Disable the bundled Omnibus PostgreSQL because we are
    # using an external PostgreSQL
    postgresql['enable'] = false
  3. 保存文件并重新配置 GitLab

配置跟踪数据库

辅助站点使用一个独立的 PostgreSQL 安装作为跟踪 数据库,以跟踪复制状态并自动从潜在的复制问题中恢复。当设置 roles ['geo_secondary_role'] 时,Linux 软件包会自动配置一个跟踪数据库。 如果您希望将此数据库运行在 Linux 软件包安装之外,请使用以下说明。

了解内部和外部跟踪数据库

您可以将跟踪数据库配置为:

  • 内部 (geo_postgresql['enable'] = true):跟踪数据库作为受管理的 PostgreSQL 实例,与 Rails 应用程序在同一台服务器上运行。这是默认设置。
  • 外部 (geo_postgresql['enable'] = false):跟踪数据库在独立的服务器上运行,或作为云托管服务运行。

在多节点辅助站点设置中,如果您在一个 Rails 节点上启用了跟踪数据库,那么对于该站点内的所有其他 Rails 节点来说,它就变成了“外部”数据库。所有其他 Rails 节点都必须设置 geo_postgresql['enable'] = false 并指定连接详细信息以连接到该跟踪数据库。

云托管数据库服务

如果您为跟踪数据库使用云托管服务,则可能需要为您的跟踪数据库用户(默认为 gitlab_geo)授予额外的角色:

这是为了在安装和升级期间安装扩展。作为替代方案, 请确保手动安装扩展,并阅读在未来的 GitLab 升级中可能出现的问题

如果您想使用 Amazon RDS 作为跟踪数据库,请确保它可以访问辅助数据库。不幸的是,仅分配相同的安全组是不够的,因为出站规则不适用于 RDS PostgreSQL 数据库。因此,您需要向只读副本的安全组显式添加一条入站规则,允许来自跟踪数据库在端口 5432 上的任何 TCP 流量。

创建跟踪数据库

在您的 PostgreSQL 实例中创建并配置跟踪数据库:

  1. 根据数据库要求文档设置 PostgreSQL。

  2. 设置一个 gitlab_geo 用户,使用您选择的密码,创建 gitlabhq_geo_production 数据库,并使该用户成为数据库的所有者。 您可以在自编译安装文档中看到此设置的示例。

  3. 如果您使用云托管的 PostgreSQL 数据库,请通过手动修改与您的跟踪数据库关联的 pg_hba.conf,确保您的辅助站点可以与跟踪数据库通信。 请记住在之后重启 PostgreSQL 以使更改生效:

    ##
    ## Geo Tracking Database Role
    ## - pg_hba.conf
    ##
    host    all         all               <trusted tracking IP>/32      md5
    host    all         all               <trusted secondary IP>/32     md5
    # In multi-node setups, add entries for all Rails nodes that will connect

配置 GitLab

配置 GitLab 以使用此数据库。这些步骤适用于 Linux 软件包和 Docker 部署。

  1. 通过 SSH 登录到 GitLab 辅助服务器并以 root 用户身份登录:

    sudo -i
  2. 编辑 /etc/gitlab/gitlab.rb,填入运行 PostgreSQL 实例的机器的连接参数和凭据:

    geo_secondary['db_username'] = 'gitlab_geo'
    geo_secondary['db_password'] = '<your_tracking_db_password_here>'
    
    geo_secondary['db_host'] = '<tracking_database_host>'
    geo_secondary['db_port'] = <tracking_database_port>      # change to the correct port
    geo_postgresql['enable'] = false     # don't use internal managed instance

    在多节点设置中,将此配置应用于每个需要连接到外部跟踪数据库的 Rails 节点。

  3. 保存文件并重新配置 GitLab

设置数据库模式

对于 Linux 软件包和 Docker 部署,前面步骤中的 reconfigure 命令应会自动处理这些步骤。

  1. 此任务会创建数据库模式。它要求数据库用户是超级用户。

    sudo gitlab-rake db:create:geo
  2. 应用 Rails 数据库迁移(模式和数据更新)也由 reconfigure 执行。如果设置了 geo_secondary['auto_migrate'] = false,或者模式是手动创建的,则需要执行此步骤:

    sudo gitlab-rake db:migrate:geo