Geo database replication

原文:https://docs.gitlab.com/ee/administration/geo/replication/database.html

Geo database replication

注意:如果您的 GitLab 安装使用外部(不受 Omnibus 管理)PostgreSQL 实例,则 Omnibus 角色将无法执行所有必要的配置步骤. 在这种情况下,请改用 Geo with external PostgreSQL instances 文档 .Note: The stages of the setup process must be completed in the documented order. Before attempting the steps in this stage, complete all prior stages.

本文档介绍了将 GitLab 数据库复制到辅助节点的数据库时必须执行的最少步骤. 您可能需要根据数据库设置,数据库大小等来更改一些值.

我们鼓励您先阅读所有步骤,然后再在测试/生产环境中执行这些步骤.

PostgreSQL replication

进行写操作的 GitLab 节点将连接到数据库服务器, 辅助节点将连接到他们自己的数据库服务器(也是只读的).

我们建议使用PostgreSQL 复制插槽,以确保节点保留恢复节点所需的所有数据. 请参阅下面的更多细节.

The following guide assumes that:

  • 您使用的是 Omnibus,因此使用的是 PostgreSQL 11 或更高版本,其中包括pg_basebackup工具和改进的Foreign Data Wrapper支持.
  • 您已经设置了一个节点(您要从中复制的 GitLab 服务器),并且正在运行 Omnibus 的 PostgreSQL(或等效版本),并且已经设置了一个新的辅助服务器,并且具有相同版本的 OS,PostgreSQL 和 GitLab.所有节点.

警告: Geo 可用于流复制. 目前不支持逻辑复制. 在讨论支持问题 .

Step 1. Configure the primary server

  1. SSH 到您的 GitLab 服务器并以 root 用户身份登录:

    1. sudo -i
  2. 编辑/etc/gitlab/gitlab.rb并为您的节点添加一个唯一的名称:

    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 .

  5. 仅限于 GitLab 10.4 及更高版本:执行以下操作以确保gitlab数据库用户已定义密码:

    生成所需密码的 MD5 哈希值:

    1. gitlab-ctl pg-password-md5 gitlab
    2. # Enter password: <your_password_here>
    3. # Confirm password: <your_password_here>
    4. # fca0b89a972d69f00eb3ec98a5838484

    Edit /etc/gitlab/gitlab.rb:

    1. # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab`
    2. postgresql['sql_user_password'] = '<md5_hash_of_your_password>'
    3. # Every node that runs Puma or Sidekiq needs to have the database
    4. # password specified as below. If you have a high-availability setup, this
    5. # must be present in all application nodes.
    6. gitlab_rails['db_password'] = '<your_password_here>'
  6. Omnibus GitLab 已经有一个名为gitlab_replicator复制用户 . 您必须手动设置该用户的密码. 系统将提示您输入密码:

    1. gitlab-ctl set-replication-password

    如果您已将gitlab_replicator用户名更改为其他名称,则此命令还将读取postgresql['sql_replication_user'] Omnibus 设置.

    如果您使用的不是由 Omnibus GitLab 管理的外部数据库,则需要创建复制器用户并手动为其定义密码:

    1. --- Create a new user 'replicator'
    2. CREATE USER gitlab_replicator;
    3. --- Set/change a password and grants replication privilege
    4. ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<replication_password>';
  7. 配置 PostgreSQL 以侦听网络接口:

    出于安全原因,PostgreSQL 默认情况下不侦听任何网络接口. 但是,Geo 要求辅助节点能够连接到节点的数据库. 因此,我们需要每个节点的地址.

    注意:对于外部 PostgreSQL 实例,请参见其他说明 .

    如果使用的是云提供商,则可以通过云提供商的管理控制台查找每个地理节点的地址.

    要查找 Geo 节点的地址,请 SSH 到 Geo 节点并执行:

    1. ##
    2. ## Private address
    3. ##
    4. ip route get 255.255.255.255 | awk '{print "Private address:", $NF; exit}'
    5. ##
    6. ## Public address
    7. ##
    8. echo "External address: $(curl --silent ipinfo.io/ip)"

    在大多数情况下,以下地址将用于配置 GitLab Geo:

    | Configuration | Address | | —- | —- | | postgresql['listen_address'] | 节点的公用或 VPC 专用地址. | | postgresql['md5_auth_cidr_addresses'] | 辅助节点的公用或 VPC 专用地址. |

    如果您使用的是 Google Cloud Platform,SoftLayer 或提供虚拟私有云(VPC)的任何其他供应商,则可以将节点和辅助节点的私有地址(对应于 Google Cloud Platform 的”内部地址”)用于postgresql['md5_auth_cidr_addresses']postgresql['listen_address'] .

    listen_address选项打开 PostgreSQL 直至与给定地址对应的接口的网络连接. 有关更多详细信息,请参见PostgreSQL 文档 .

    根据您的网络配置,建议的地址可能不正确. 如果您的节点和辅助节点通过局域网或连接可用性区域的虚拟网络(例如Amazon 的 VPCGoogle 的 VPC)进行连接 ,则应将辅助节点的私有地址用于postgresql['md5_auth_cidr_addresses'] .

    编辑/etc/gitlab/gitlab.rb并添加以下内容,将 IP 地址替换为适合您的网络配置的地址:

    1. ##
    2. ## Geo Primary role
    3. ## - configure dependent flags automatically to enable Geo
    4. ##
    5. roles ['geo_primary_role']
    6. ##
    7. ## Primary address
    8. ## - replace '<primary_node_ip>' with the public or VPC address of your Geo primary node
    9. ##
    10. postgresql['listen_address'] = '<primary_node_ip>'
    11. ##
    12. # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be
    13. # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32']
    14. ##
    15. postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32']
    16. ##
    17. ## Replication settings
    18. ## - set this to be the number of Geo secondary nodes you have
    19. ##
    20. postgresql['max_replication_slots'] = 1
    21. # postgresql['max_wal_senders'] = 10
    22. # postgresql['wal_keep_segments'] = 10
    23. ##
    24. ## Disable automatic database migrations temporarily
    25. ## (until PostgreSQL is restarted and listening on the private address).
    26. ##
    27. gitlab_rails['auto_migrate'] = false
  8. 可选:如果要添加另一个辅助节点,则相关设置应如下所示:

    1. postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32', '<another_secondary_node_ip>/32']

    您可能还需要编辑wal_keep_segmentsmax_wal_senders以匹配您的数据库复制要求. 有关更多信息,请查阅PostgreSQL-复制文档 .

  9. 保存文件并重新配置 GitLab,以进行数据库侦听更改和要应用的复制插槽更改:

    1. gitlab-ctl reconfigure

    重新启动 PostgreSQL 以使其更改生效:

    1. gitlab-ctl restart postgresql
  10. 现在,重新启动 PostgreSQL 并重新侦听私有地址,即可重新启用迁移.

    编辑/etc/gitlab/gitlab.rb并将配置更改true

    1. gitlab_rails['auto_migrate'] = true

    保存文件并重新配置 GitLab:

    1. gitlab-ctl reconfigure
  11. 现在,PostgreSQL 服务器已设置为接受远程连接,请运行netstat -plnt | grep 5432 netstat -plnt | grep 5432 ,以确保 PostgreSQL 在端口5432上侦听服务器的私有地址.

  12. 重新配置 GitLab 时会自动生成一个证书. 这将自动用于保护 PostgreSQL 流量免遭窃听,但是为了防止主动(中间人)攻击者, 辅助节点需要证书的副本. 通过运行以下命令,在节点上复制 PostgreSQL server.crt文件:

    1. cat ~gitlab-psql/data/server.crt

    将输出复制到剪贴板或本地文件中. 设置辅助节点时将需要它! 证书不是敏感数据.

Step 2. Configure the secondary server

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

    1. sudo -i
  2. 停止应用程序服务器和 Sidekiq

    1. gitlab-ctl stop puma
    2. gitlab-ctl stop sidekiq

    注意:此步骤很重要,因此在完全配置节点之前,我们不要尝试执行任何操作.

  3. 检查节点的 PostgreSQL 服务器的TCP 连接

    1. gitlab-rake gitlab:tcp_check[<primary_node_ip>,5432]

    注意:如果此步骤失败,则可能是您使用了错误的 IP 地址,或者防火墙可能阻止了对服务器的访问. 检查 IP 地址,并密切注意公用地址和专用地址之间的区别,并确保(如果存在防火墙)允许节点连接到端口 5432 上的节点.

  4. 辅助服务器上创建文件server.crt ,其中包含在节点设置的最后一步中获得的内容:

    1. editor server.crt
  5. 辅助节点上设置 PostgreSQL TLS 验证:

    安装server.crt文件:

    1. install \
    2. -D \
    3. -o gitlab-psql \
    4. -g gitlab-psql \
    5. -m 0400 \
    6. -T server.crt ~gitlab-psql/.postgresql/root.crt

    现在,PostgreSQL 将仅在验证 TLS 连接时识别该确切证书. 只能由有权访问私钥的人复制证书,该私钥仅存在于节点上.

  6. 测试gitlab-psql用户可以连接到节点的数据库(默认的 Omnibus 数据库名称为gitlabhq_production ):

    1. sudo \
    2. -u gitlab-psql /opt/gitlab/embedded/bin/psql \
    3. --list \
    4. -U gitlab_replicator \
    5. -d "dbname=gitlabhq_production sslmode=verify-ca" \
    6. -W \
    7. -h <primary_node_ip>

    出现提示时,输入您在第一步中为gitlab_replicator用户设置的密码. 如果所有方法均正常工作,则应该看到节点数据库的列表.

    此处连接失败表示 TLS 配置不正确. 确保节点上~gitlab-psql/data/server.crt的内容与辅助节点上~gitlab-psql/.postgresql/root.crt的内容匹配.

  7. 配置 PostgreSQL 以启用 FDW 支持:

    此步骤类似于我们配置实例的方式. 我们需要启用它,以启用 FDW 支持,即使使用单个节点也是如此.

    编辑/etc/gitlab/gitlab.rb并添加以下内容,将 IP 地址替换为适合您的网络配置的地址:

    1. ##
    2. ## Geo Secondary role
    3. ## - configure dependent flags automatically to enable Geo
    4. ##
    5. roles ['geo_secondary_role']
    6. ##
    7. ## Secondary address
    8. ## - replace '<secondary_node_ip>' with the public or VPC address of your Geo secondary node
    9. ##
    10. postgresql['listen_address'] = '<secondary_node_ip>'
    11. postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32']
    12. ##
    13. ## Database credentials password (defined previously in primary node)
    14. ## - replicate same values here as defined in primary node
    15. ##
    16. postgresql['sql_user_password'] = '<md5_hash_of_your_password>'
    17. gitlab_rails['db_password'] = '<your_password_here>'
    18. ##
    19. ## Enable FDW support for the Geo Tracking Database (improves performance)
    20. ##
    21. geo_secondary['db_fdw'] = true

    对于外部 PostgreSQL 实例,请参见其他说明 . 如果您使以前的节点重新联机以用作辅助节点,则还需要删除roles ['geo_primary_role']geo_primary_role['enable'] = true .

  8. 重新配置 GitLab,以使更改生效:

    1. gitlab-ctl reconfigure
  9. 重新启动 PostgreSQL 以使 IP 更改生效并再次重新配置:

    1. gitlab-ctl restart postgresql
    2. gitlab-ctl reconfigure

    最后的重新配置将提供 FDW 配置并启用它.

Step 3. Initiate the replication process

在下面,我们提供了一个脚本,该脚本将辅助节点上的数据库连接到主要节点上的数据库,复制数据库,并创建流复制所需的文件.

使用的目录是在 Omnibus 中设置的默认目录. 如果更改了任何默认值,请根据需要配置它,替换目录和路径.

警告:确保在辅助服务器上运行此命令,因为它会在运行pg_basebackup之前删除所有 PostgreSQL 的数据.

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

    1. sudo -i
  2. 选择一个数据库友好名称,以供您的辅助节点用作复制插槽名称. 例如,如果您的域是secondary.geo.example.com ,则可以使用secondary_example作为插槽名称,如以下命令所示.

  3. 执行以下命令以开始备份/还原并开始复制

    警告:每个 Geo 辅助节点必须具有自己的唯一复制插槽名称. 在两个辅助节点之间使用相同的插槽名称将破坏 PostgreSQL 复制.

    1. gitlab-ctl replicate-geo-database \
    2. --slot-name=<secondary_node_name> \
    3. --host=<primary_node_ip>

    注意:复制插槽名称只能包含小写字母,数字和下划线字符.

    出现提示时,输入第一步中为gitlab_replicator用户设置的纯文本密码.

    此命令还带有许多其他选项. 您可以使用--help列出所有内容,但是这里有一些提示:

    • 如果 PostgreSQL 在非标准端口上侦听,则还要添加--port= .
    • 如果数据库太大而无法在 30 分钟内传输,则需要增加超时,例如--backup-timeout=3600如果您希望初始复制花费一个小时以下的话.
    • 通过--sslmode=disable可以完全跳过 PostgreSQL TLS 身份验证(例如,您知道网络路径是安全的,或者您使用的是站点到站点 VPN). 这不是通过公共互联网安全!
    • 您可以在PostgreSQL 文档中阅读有关每个sslmode更多详细信息; 上面的说明均经过精心编写,以确保既能防御被动的窃听者,又能防御主动的”中间人”攻击者.
    • --slot-name更改为要在数据库上使用的复制插槽的名称. 该脚本将尝试自动创建复制插槽(如果不存在).
    • If you’re repurposing an old server into a Geo secondary node, you’ll need to add --force to the command line.
    • 如果不在生产机器中,则可以通过添加--skip-backup确保确实--skip-backup从而禁用备份步骤

复制过程现已完成.

PgBouncer support (optional)

PgBouncer可以与 GitLab Geo 一起使用来合并 PostgreSQL 连接. 如果您在高可用性配置中使用 GitLab,且该群集的节点集群支持 Geo 节点,而另一个节点集群支持 Geo 辅助节点,则建议使用 PgBouncer. 有关更多信息,请参见Omnibus GitLab 的高可用性 .

为了使 Geo 辅助节点能够与数据库前面的 PgBouncer 一起正常使用,它将需要一个单独的只读用户才能使PostgreSQL FDW 查询起作用:

  1. 主要的地理数据库上,以管理员用户身份在控制台上输入 PostgreSQL. 如果使用的是 Omnibus 管理的数据库,请登录到运行 PostgreSQL 数据库的节点(默认的 Omnibus 数据库名称为gitlabhq_production ):

    1. sudo \
    2. -u gitlab-psql /opt/gitlab/embedded/bin/psql \
    3. -h /var/opt/gitlab/postgresql gitlabhq_production
  2. 然后创建只读用户:

    1. -- NOTE: Use the password defined earlier
    2. CREATE USER gitlab_geo_fdw WITH password 'mypassword';
    3. GRANT CONNECT ON DATABASE gitlabhq_production to gitlab_geo_fdw;
    4. GRANT USAGE ON SCHEMA public TO gitlab_geo_fdw;
    5. GRANT SELECT ON ALL TABLES IN SCHEMA public TO gitlab_geo_fdw;
    6. GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO gitlab_geo_fdw;
    7. -- Tables created by "gitlab" should be made read-only for "gitlab_geo_fdw"
    8. -- automatically.
    9. ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON TABLES TO gitlab_geo_fdw;
    10. ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON SEQUENCES TO gitlab_geo_fdw;
  3. 辅助节点上,更改/etc/gitlab/gitlab.rb

    1. geo_postgresql['fdw_external_user'] = 'gitlab_geo_fdw'
  4. 保存文件并重新配置 GitLab 以应用更改:

    1. gitlab-ctl reconfigure

Troubleshooting

阅读故障排除文档 .