灾难恢复(Geo)

Geo 会复制您的数据库、您的 Git 仓库和一些其他资产,但存在一些限制

caution多次要节点配置需要完全重新同步和重新配置所有未升级的次要节点,并导致停机。

在单次要节点配置中提升次要 Geo 站点

我们目前不提供自动方式来提升 Geo 副本并进行故障转移,但如果您对机器具有 root 访问权限,则可以手动进行。

此过程将次要 站点提升为主要站点。要尽快恢复 Geo 冗余,您应该在遵循这些说明后,立即添加一个新的次要站点。

步骤 1. 如果可能,允许复制完成

如果次要站点仍在从主要站点复制数据,请尽可能遵循计划的故障转移文档,以避免不必要的数据丢失。

步骤 2. 永久禁用主要站点

caution如果主要站点脱机,可能有保存在主要站点上的数据尚未复制到次要站点。如果您继续,此数据应被视为丢失。

如果主要站点发生中断,您应该尽一切可能避免在两个不同的极狐GitLab 实例中发生写入的脑裂情况,从而使恢复工作复杂化。因此,为了准备故障转移,我们必须禁用主要站点。

  • 如果您有 SSH 访问权限:

    1. SSH 进入主要站点,停止和禁用极狐GitLab:

      sudo gitlab-ctl stop
      
    2. 如果服务器意外重启,防止极狐GitLab 再次启动:

      sudo systemctl disable gitlab-runsvdir
      
  • 如果您没有对主要站点的 SSH 访问权限,请使计算机脱机并通过您可以使用的任何方式阻止其重新启动。您可能需要:

    • 重新配置负载均衡器。
    • 更改 DNS 记录(例如,将主 DNS 记录指向次要站点以停止使用主要站点)。
    • 停止虚拟服务器。
    • 通过防火墙阻止流量。
    • 撤销主要站点的对象存储权限。
    • 物理断开机器。

    如果您打算更新主域名 DNS 记录,您可能希望现在降低 TTL 以加快传播速度。

步骤 3. 提升次要站点

提升次要节点时请注意以下事项:

  • 如果在次要站点上暂停了复制(例如,作为升级的一部分,当您运行低于 13.4 的版本时),您必须在继续之前使用数据库启用该站点。如果次要站点已暂停,则升级会执行时间点恢复,到最后一个已知状态。在次要节点暂停时在主节点上创建的数据会丢失。
  • 此时不应添加新的次要站点。如果要添加新的次要站点,请在完成将次要站点提升为主要站点的整个过程后执行此操作。

提升在运行 14.5 及更高版本的单个节点上运行的次要站点

  1. SSH 到您的次要站点并执行:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  2. 验证您可以使用之前用于次要站点的 URL,连接到新升级的主要站点。
  3. 如果成功,现在将次要站点提升为主要站点。

提升在运行 14.4 及更早版本的单个节点上运行的次要站点

cautiongitlab-ctl promote-to-primary-nodegitlab-ctl promote-db 命令在 14.5 及更高版本中已弃用,并在 15.0 版本中删除。改用 gitlab-ctl geo promote
  1. SSH 到您的次要站点并以 root 身份登录:

    sudo -i
    
  2. 如果您使用的是 13.5 及更高版本,请跳过此步骤。如果没有,请编辑 /etc/gitlab/gitlab.rb 并删除以下任何可能存在的行:

    geo_secondary_role['enable'] = true
    roles ['geo_secondary_role']
    
  3. 次要站点提升为主要站点:

    • 运行预检检查

      gitlab-ctl promote-to-primary-node
      
    • 如果您已经单独运行了预检检查或不想运行它们,您可以跳过它们:

      gitlab-ctl promote-to-primary-node --skip-preflight-checks
      
      note在 13.7 及更早版本中,如果您有一个包含零项要同步的数据类型并且不跳过预检检查,那么即使复制实际上是最新的,提升次要节点时也会报告 ERROR - Replication is not up-to-date。如果复制和验证输出显示已完成,您可以跳过预检检查以使命令完成升级。此错误已在 13.8 及更高版本中修复。
    • 将次要站点提升为主要站点无需任何进一步确认,即使预检检查失败:

      gitlab-ctl promote-to-primary-node --force
      
  4. 验证您可以使用之前用于次要站点的 URL 连接到新升级的主要站点。
  5. 如果成功,现在将次要站点提升为主要站点。

提升具有多个运行 14.5 及更高版本的节点的次要站点

  1. SSH 到次要站点中的每个 Sidekiq、PostgreSQL 和 Gitaly 节点,并运行以下命令之一:

    • 要将次要站点上的节点提升为主节点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  2. SSH 到您的次要站点上的每个 Rails 节点并运行以下命令之一:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  3. 验证您可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  4. 如果成功,则次要站点现在升级为主要站点。

提升具有多个运行 14.4 及更早版本的节点的次要站点

cautiongitlab-ctl promote-to-primary-nodegitlab-ctl promote-db 命令在 14.5 及更高版本中已弃用,并在 15.0 版本中删除。改用 gitlab-ctl geo promote

gitlab-ctl promote-to-primary-node 命令还不能与多个节点一起使用,因为它只能在只有一个节点的次要站点上执行更改。您必须手动执行此操作。

  1. SSH 到次要站点中的数据库节点并触发 PostgreSQL 提升为读写:

    sudo gitlab-ctl promote-db
    
  1. 次要站点中的每个节点上编辑 /etc/gitlab/gitlab.rb 以通过删除以下任何可能存在的行来反映其作为主要站点的新状态:

    geo_secondary_role['enable'] = true
    roles ['geo_secondary_role']
    

    进行这些更改后,在每台机器上重新配置极狐GitLab,使更改生效。

  2. 次要站点提升为主要站点。SSH 进入单个应用程序服务器并执行:

    sudo gitlab-rake geo:set_secondary_as_primary
    
  3. 验证您是否可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  4. 如果成功,则次要站点现在升级为主要站点。

使用运行 14.5 及更高版本的 Patroni 备用集群提升次要站点

  1. SSH 到次要站点中的每个 Sidekiq、PostgreSQL 和 Gitaly 节点,并运行以下命令之一:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  2. SSH 到您的次要站点上的每个 Rails 节点并运行以下命令之一:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  3. 验证您可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  4. 如果成功,则次要站点现在升级为主要站点。

使用运行 14.4 及更早版本的 Patroni 备用集群提升次要站点

cautiongitlab-ctl promote-to-primary-nodegitlab-ctl promote-db 命令在 14.5 及更高版本中已弃用,并在 15.0 版本中删除。改用 gitlab-ctl geo promote

gitlab-ctl promote-to-primary-node 命令还不能与 Patroni 备用集群一起使用,因为它只能在只有一个节点的次要站点上执行更改。您必须手动执行此操作。

  1. SSH 到次要站点中的 Standby Leader 数据库节点并触发 PostgreSQL 提升为读写:

    sudo gitlab-ctl promote-db
    
  2. 在次要节点中的每个应用程序和 Sidekiq 节点上编辑 /etc/gitlab/gitlab.rb,通过删除可能存在的以下任何行来反映其作为主节点的新状态:

    geo_secondary_role['enable'] = true
    roles ['geo_secondary_role']
    
  3. 在次要节点中的每个 Patroni 节点上编辑 /etc/gitlab/gitlab.rb 以禁用备用集群:

    patroni['standby_cluster']['enable'] = false
    
  4. 在每台机器上重新配置极狐GitLab,使更改生效:

    sudo gitlab-ctl reconfigure
    
  5. 次要站点提升为主要站点。SSH 进入单个应用程序服务器并执行:

    sudo gitlab-rake geo:set_secondary_as_primary
    
  6. 验证您是否可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  7. 如果成功,则次要站点现在升级为主要站点。

使用运行 14.5 及更高版本的外部 PostgreSQL 数据库提升次要站点

gitlab-ctl geo promote 命令可以与外部 PostgreSQL 数据库结合使用。在这种情况下,您必须首先手动提升与次要站点关联的副本数据库:

  1. 提升与次要站点关联的副本数据库。这会将数据库设置为读写。

      #!/bin/bash
    
      PG_SUPERUSER=postgres
    
      # The path to your pg_ctl binary. You may need to adjust this path to match
      # your PostgreSQL installation
      PG_CTL_BINARY=/usr/lib/postgresql/10/bin/pg_ctl
    
      # The path to your PostgreSQL data directory. You may need to adjust this
      # path to match your PostgreSQL installation. You can also run
      # `SHOW data_directory;` from PostgreSQL to find your data directory
      PG_DATA_DIRECTORY=/etc/postgresql/10/main
    
      # Promote the PostgreSQL database and allow read/write operations
      sudo -u $PG_SUPERUSER $PG_CTL_BINARY -D $PG_DATA_DIRECTORY promote
    
  2. SSH 到次要站点中的每个 Sidekiq、PostgreSQL 和 Gitaly 节点,并运行以下命令之一:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  3. SSH 到您的次要站点上的每个 Rails 节点并运行以下命令之一:

    • 要将次要站点提升为主要站点:

      sudo gitlab-ctl geo promote
      
    • 将次要站点提升为主要站点无需任何进一步确认

      sudo gitlab-ctl geo promote --force
      
  4. 验证您可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  5. 如果成功,则次要站点现在升级为主要站点。

使用运行 14.4 及更早版本的外部 PostgreSQL 数据库提升次要站点

cautiongitlab-ctl promote-to-primary-nodegitlab-ctl promote-db 命令在 14.5 及更高版本中已弃用,并在 15.0 版本中删除。改用 gitlab-ctl geo promote

gitlab-ctl promote-to-primary-node 命令不能与外部 PostgreSQL 数据库一起使用,因为它只能在具有极狐GitLab 的次要节点和同一台机器上的数据库上执行更改。因此,需要手动过程:

  1. 提升与次要站点关联的副本数据库。这会将数据库设置为读写。

      #!/bin/bash
    
      PG_SUPERUSER=postgres
    
      # The path to your pg_ctl binary. You may need to adjust this path to match
      # your PostgreSQL installation
      PG_CTL_BINARY=/usr/lib/postgresql/10/bin/pg_ctl
    
      # The path to your PostgreSQL data directory. You may need to adjust this
      # path to match your PostgreSQL installation. You can also run
      # `SHOW data_directory;` from PostgreSQL to find your data directory
      PG_DATA_DIRECTORY=/etc/postgresql/10/main
    
      # Promote the PostgreSQL database and allow read/write operations
      sudo -u $PG_SUPERUSER $PG_CTL_BINARY -D $PG_DATA_DIRECTORY promote
    
  2. 次要站点中的每个节点上编辑 /etc/gitlab/gitlab.rb,通过删除以下任何可能存在的行来反映其作为主要站点的新状态:

    geo_secondary_role['enable'] = true
    roles ['geo_secondary_role']
    

    在每个节点上进行这些更改,重新配置极狐GitLab 后,更改才会生效。

  3. 次要站点提升为主要站点。SSH 进入单个辅助应用程序节点并执行:

    sudo gitlab-rake geo:set_secondary_as_primary
    
  4. 验证您是否可以使用之前用于次要站点的 URL 连接到新提升的主要站点。
  5. 如果成功,则次要站点现在升级为主要站点。

步骤 4. (可选)更新主域名 DNS 记录

更新主域名的 DNS 记录以指向次要站点,以防止需要将所有对主域名的引用更新到次要域名,例如更改 Git 远程和 API URL。

  1. SSH 进入次要站点并以 root 身份登录:

    sudo -i
    
  2. 更新主域名的 DNS 记录。更新主域名的 DNS 记录指向次要站点后,编辑次要站点上的 /etc/gitlab/gitlab.rb 以反映新 URL:

    # Change the existing external_url configuration
    external_url 'https://<new_external_url>'
    
    note只要次要 DNS 记录仍然完好无损,更改 external_url 不会阻止通过旧的 URL 进行访问。
  3. 更新次要站点的 SSL 证书:

    • 如果您使用 Let’s Encrypt 集成,证书会自动更新。
    • 如果您手动设置次要节点的证书,请从主要站点复制到次要站点。 如果您无权访问主要站点,请颁发新证书并确保它在主题备用名称中同时包含主要站点和次要站点的 URL。您可以检查:

      /opt/gitlab/embedded/bin/openssl x509 -noout -dates -subject -issuer \
          -nameopt multiline -ext subjectAltName -in /etc/gitlab/ssl/new-gitlab.new-example.com.crt
      
  4. 重新配置次要站点,使更改生效:

    gitlab-ctl reconfigure
    
  5. 执行以下命令更新新提升的主要站点 URL:

    gitlab-rake geo:update_primary_node_url
    

    此命令使用在 /etc/gitlab/gitlab.rb 中定义的更改后的 external_url 配置。

  6. 要确定是否需要这样做,请在 /etc/gitlab/gitlab.rb 文件中搜索 gitlab_rails["geo_node_name"] 设置。如果它被 # 注释掉或根本找不到,那么您需要更新数据库中的主要站点的名称。您可以像这样搜索它:

    grep "geo_node_name" /etc/gitlab/gitlab.rb
    

    要在数据库中更新主要站点的名称:

    gitlab-rails runner 'Gitlab::Geo.primary_node.update!(name: GeoNode.current_node_name)'
    
  7. 验证您是否可以使用其 URL 连接到新提升的主要站点。如果您更新了主域名的 DNS 记录,这些更改可能尚未传播,具体取决于以前的 DNS 记录 TTL。

步骤 5.(可选)将次要 Geo 站点添加到提升的主要站点

使用上述过程将次要站点提升为主要站点不会在新的主要站点上启用 Geo。

要使新的次要站点上线,请按照 Geo 设置说明

步骤 6.(可选)删除次要站点的跟踪数据库

每个次要站点都有一个特殊的跟踪数据库,用于保存主要站点中所有项目的同步状态。 由于次要站点已升级,因此不再需要跟踪数据库中的数据。

可以使用以下命令删除数据:

sudo rm -rf /var/opt/gitlab/geo-postgresql

如果您在 gitlab.rb 文件中启用了任何 geo_secondary[] 配置选项,可以安全地注释掉或删除这些配置选项,然后重新配置极狐GitLab,使更改生效。

在多次要站点配置中提升次要 Geo 副本

如果您有多个次要站点并且需要推广其中一个,我们建议您遵循在单次要站点配置中提升次要 Geo 站点,然后您还需要两个额外的步骤。

步骤 1. 准备新的主要站点,服务于一个或多个次要站点

  1. SSH 进入新的主要站点并以 root 身份登录:

    sudo -i
    
  2. 编辑 /etc/gitlab/gitlab.rb

    ## Enable a Geo Primary role (if you haven't yet)
    roles ['geo_primary_role']
    
    ##
    # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be
    # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32']
    ##
    postgresql['md5_auth_cidr_addresses'] = ['<primary_site_ip>/32', '<secondary_site_ip>/32']
    
    # Every secondary site needs to have its own slot so specify the number of secondary sites you're going to have
    # postgresql['max_replication_slots'] = 1 # Set this to be the number of Geo secondary nodes if you have more than one
    
    ##
    ## Disable automatic database migrations temporarily
    ## (until PostgreSQL is restarted and listening on the private address).
    ##
    gitlab_rails['auto_migrate'] = false
    

    (有关这些设置的更多详细信息,您可以阅读配置主服务器

  3. 保存文件并为数据库监听更改和要应用的复制槽更改,重新配置极狐GitLab:

    gitlab-ctl reconfigure
    

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

    gitlab-ctl restart postgresql
    
  4. 现在重新启用迁移,因为 PostgreSQL 已重新启动并侦听私有地址。

    编辑 /etc/gitlab/gitlab.rb变更配置为 true

    gitlab_rails['auto_migrate'] = true
    

    保存文件并重新配置极狐GitLab:

    gitlab-ctl reconfigure
    

步骤 2. 启动复制过程

现在我们需要让每个次要站点监听新的主要站点上的更改。为此,您需要再次启动复制过程,但这次是针对另一个主要站点。所有旧的复制设置都将被覆盖。