Geo with external PostgreSQL instances

Geo with external PostgreSQL instances

如果您使用的不是由 Omnibus 管理的 PostgreSQL 实例,则此文档很重要. 这包括 AWS RDS 之类的云托管实例,或者手动安装和配置的 PostgreSQL 实例.

注意:我们强烈建议运行 Omnibus 管理的实例,因为它们是积极开发和测试的. 我们的目标是与大多数外部数据库(不受 Omnibus 管理)兼容,但我们不保证兼容性.

  1. SSH 到 GitLab 应用程序服务器并以 root 用户身份登录:

  2. 编辑并为您的节点添加一个唯一的 ID(任意值):

    1. # The unique identifier for the Geo node.
    2. gitlab_rails['geo_node_name'] = '<node_name_here>'
  3. 重新配置节点以使更改生效:

    1. gitlab-ctl reconfigure
  4. 执行以下命令以将节点定义为主节点:

    1. gitlab-ctl set-geo-primary-node

    该命令将使用您在/etc/gitlab/gitlab.rb定义的external_url .

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

  • 自己设置流复制(例如,在 AWS RDS 中).
  • 手动执行 Omnibus 配置,如下所示.

Leverage your cloud provider’s tools to replicate the primary database

假设您在使用 RDS 的 AWS EC2 上设置了一个主节点. 现在,您仅可以在其他区域中创建只读副本,复制过程将由 AWS 管理. 确保已根据需要设置了网络 ACL,子网和安全组,以便辅助应用程序节点可以访问数据库.

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

  • Amazon RDS- 创建只读副本
  • PostgreSQL 的 Azure 数据库-在 PostgreSQL 的 Azure 数据库中

Manually configure the primary database for replication

通过更改pg_hba.confpostgresql.conf来配置要复制的节点数据库. 手动对外部数据库配置进行以下配置更改,并确保稍后重新启动 PostgreSQL 才能使更改生效:

  1. ##
  2. ## Geo Primary Role
  3. ## - pg_hba.conf
  4. ##
  5. host all all <trusted primary IP>/32 md5
  6. host replication gitlab_replicator <trusted primary IP>/32 md5
  7. host all all <trusted secondary IP>/32 md5
  8. host replication gitlab_replicator <trusted secondary IP>/32 md5

Secondary nodes

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

  1. ##
  2. ## Geo Secondary Role
  3. ##
  4. host all all <trusted secondary IP>/32 md5
  5. host replication gitlab_replicator <trusted secondary IP>/32 md5
  6. host all all <trusted primary IP>/24 md5
  1. ##
  2. ## Geo Secondary Role
  3. ## - postgresql.conf
  4. ##
  5. wal_level = hot_standby
  6. wal_keep_segments = 10
  7. hot_standby = on

对于 Omnibus, 具有三个主要功能:

  1. 配置副本数据库.
  2. 配置跟踪数据库.
  3. 启用地理日志光标 (本节未介绍).

要配置与外部只读副本数据库的连接并启用 Log Cursor,请执行以下操作:

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

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

    1. ##
    2. ## Geo Secondary role
    3. ## - configure dependent flags automatically to enable Geo
    4. ##
    5. roles ['geo_secondary_role']
    6. # note this is shared between both databases,
    7. # make sure you define the same password in both
    8. gitlab_rails['db_password'] = '<your_password_here>'
    9. gitlab_rails['db_username'] = 'gitlab'
    10. gitlab_rails['db_host'] = '<database_read_replica_host>'
    11. # Disable the bundled Omnibus PostgreSQL, since we are
    12. # using an external PostgreSQL
    13. postgresql['enable'] = false
  3. 保存文件并

辅助节点使用单独的 PostgreSQL 安装作为跟踪数据库,以跟踪复制状态并自动从潜在的复制问题中恢复. 设置了roles ['geo_secondary_role'] Omnibus 会自动配置跟踪数据库. 如果要在 Omnibus 外部运行此数据库,请按照以下说明进行操作.

如果您将云托管服务用于跟踪数据库,则可能需要向跟踪数据库用户授予其他角色(默认情况下,这是gitlab_geo ):

  • Amazon RDS 需要rds_superuser角色.
  • PostgreSQL 的 Azure 数据库需要角色.

跟踪数据库需要与辅助副本数据库建立FDW连接以提高性能.

注意:如果您要将 AWS RDS 用作跟踪数据库,请确保其有权访问辅助数据库. 不幸的是,仅分配相同的安全组是不够的,因为出站规则不适用于 RDS PostgreSQL 数据库. 因此,您需要将入站规则显式添加到只读副本的安全组,以允许来自跟踪数据库的端口 5432 上的所有 TCP 通信.

  1. 通过手动更改与跟踪数据库关联的pg_hba.conf ,确保辅助节点可以与跟踪数据库通信. 请记住,之后要重新启动 PostgreSQL 才能使更改生效:

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

    1. 使用 PostgreSQL 实例的机器的连接参数和凭据编辑/etc/gitlab/gitlab.rb

      1. geo_secondary['db_username'] = 'gitlab_geo'
      2. geo_secondary['db_password'] = '<your_password_here>'
      3. geo_secondary['db_port'] = <tracking_database_port> # change to the correct port
      4. geo_secondary['db_fdw'] = true # enable FDW
      5. geo_postgresql['enable'] = false # don't use internal managed instance
    2. 保存文件并

    3. 运行跟踪数据库迁移:

      1. gitlab-rake geo:db:create
      2. gitlab-rake geo:db:migrate
    4. 配置PostgreSQL FDW连接和凭据:

      将下面的脚本保存在一个文件中,例如. /tmp/geo_fdw.sh并修改连接参数以匹配您的环境. 执行它以建立 FDW 连接.

      1. #!/bin/bash
      2. # Secondary Database connection params:
      3. DB_HOST="<public_ip_or_vpc_private_ip>"
      4. DB_NAME="gitlabhq_production"
      5. DB_USER="gitlab"
      6. DB_PASS="<your_password_here>"
      7. DB_PORT="5432"
      8. # Tracking Database connection params:
      9. GEO_DB_HOST="<public_ip_or_vpc_private_ip>"
      10. GEO_DB_NAME="gitlabhq_geo_production"
      11. GEO_DB_USER="gitlab_geo"
      12. GEO_DB_PORT="5432"
      13. query_exec () {
      14. gitlab-psql -h $GEO_DB_HOST -U $GEO_DB_USER -d $GEO_DB_NAME -p $GEO_DB_PORT -c "${1}"
      15. }
      16. query_exec "CREATE EXTENSION postgres_fdw;"
      17. query_exec "CREATE SERVER gitlab_secondary FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '${DB_HOST}', dbname '${DB_NAME}', port '${DB_PORT}');"
      18. query_exec "CREATE USER MAPPING FOR ${GEO_DB_USER} SERVER gitlab_secondary OPTIONS (user '${DB_USER}', password '${DB_PASS}');"
      19. query_exec "CREATE SCHEMA gitlab_secondary;"
      20. query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};"

      注意:上面的脚本模板使用gitlab-psql因为它打算从 Geo 机器上执行,但是您可以将其更改为并从任何有权访问数据库的机器上运行. 我们还建议将psql用于 AWS RDS.

    5. 保存文件并
    6. Populate the FDW tables: