灾难恢复(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 以加快传播速度。

    note 在此过程中,主站点上的 /etc/gitlab/gitlab.rb 文件不会自动拷贝至次要节点。所以您需要备份主站点的 /etc/gitlab/gitlab.rb 文件,以便稍后您可以在次要站点上恢复任何您想要的数据。

步骤 3. 提升次要站点

当提升次要站点时,需要注意以下内容:

  • 如果次要站点已经被暂停,则该提升操作会执行一次到最后已知状态的时间点恢复(point-in-time recovery)。当次要站点暂停时,主站点上创建的数据会丢失。
  • 在此时,不应该添加新的次要站点。如果您就想要添加新的次要站点,请在此进程完成后再操作,也就是将 次要 站点提升为主要站点之后再操作。
  • 如果在此期间您遇到了 ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 错误信息,请查看故障排除指南
  • 如果您在使用单独的 URL,您应该将主域名的 DNS 指向新提升的站点。否则,您必须要在新提升的站点上重新注册 runner,而且所有的 Git 远端、书签和外部集成都必须进行更新。
  • 如果您正在使用位置感知 DNS,则在旧的主站点从 DNS 条目中被移除后,runner 应该能够自动连接到主站点上。
  • 如果您不希望连接到之前主站点上的 runner 再重新连接过来,您应该移除它们:
    • 通过 UI:
      1. 在左侧导航栏,底部,选择 管理员
      2. 选择 CI/CD > Runners 并移除它们。
    • 使用 Runners API

提升在单个节点上运行的次要站点

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

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

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

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

提升具有多个运行节点的次要站点

  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. 如果成功,则次要站点现在升级为主要站点。

提升具有 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. 如果成功,则次要站点现在升级为主要站点。

提升使用外部 PostgreSQL 数据库的次要站点

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

  1. 提升与次要站点关联的副本数据库。这会将数据库设置为读写。这些操作说明会因数据库的托管位置而异(如 Amazon RDS、Azure PostgreSQL、Google Cloud SQL):

    • 对于其他的外部 PostgreSQL 数据库,在您的次要站点上保存如下脚本,比如 /tmp/geo_promote.sh,并修改连接参数以匹配您的环境。然后,执行它以提升副本:

      #!/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. 如果成功,则次要站点现在升级为主要站点。

步骤 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. 验证您是否可以使用其 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. 初始化复制流程

现在我们需要让每一个 次要 站点都能够监听新 主要 站点上的变更。要实现此功能,您需要再次初始化复制流程,但是这次是针对其他的 主要 站点。所有的旧部分设置都是可以被覆写的。

在极狐GitLab Helm chart 中提升次要 Geo 集群

当更新云原生 Geo 部署时,更新任何位于次要 Kubernetes 集群外部的节点的过程与非云原生方法并无不同。也就是说,您可以总是参考在单个次要配置中提升次要 Geo 站点来获取更多信息。

以下内容以假设您在使用 gitlab 命名空间为前提。当您设置集群时,如果您在使用不同的命名空间,则您应该用您的命名空间来替换 --namespace gitlab

第一步:永久禁用 ** 主要**集群

caution 如果 主要 站点下线,保存在 主要 站点上的数据可能还没有被复制到 次要 站点上。如果您继续进行,这些数据应被视为已丢失。

如果 主要 站点发生了故障,您应该尽您所有来避免脑裂情况的发生,这种情况下,写数据的用户会出现在两个不同的极狐GitLab 实例上,这会让恢复工作变得更加复杂。因此为了做好故障准备,您必须禁用 次要 站点:

  • 如果您有访问 主要 Kubernetees 集群的权限,那就连接到此集群并禁用极狐GitLab webserviceSidekiq pods:

    kubectl --namespace gitlab scale deploy gitlab-geo-webservice-default --replicas=0
    kubectl --namespace gitlab scale deploy gitlab-geo-sidekiq-all-in-1-v1 --replicas=0
    
  • 如果您无法访问 主要 Kubernetes 集群,您需要使用任何手段将 次要 站点下线,以防止它再次上线。您可能需要:

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

第二步:提升外部集群的所有 次要 站点

caution 如果次要站点已经被暂停,则该提升操作会执行一次到最后已知状态的时间点恢复(point-in-time recovery)。当次要站点暂停时,主站点上创建的数据会丢失。
  1. 对于使用 Linux 软件包且位于次要 Kubernetes 集群外部的每个节点(如 PostgreSQL 或 Gitaly),SSH 进入该节点并运行以下命令:

    • 要将 Kubernetes 集群外的 次要 站点提升为 主要 站点:

      sudo gitlab-ctl geo promote
      
    • 要将 Kubernetes 集群外的 次要 站点提升为 主要 站点,而且 无需进一步确认

      sudo gitlab-ctl geo promote --force
      
  2. 找到 toolbox pod:

    kubectl --namespace gitlab get pods -lapp=toolbox
    
  3. 提升次要站点:

    kubectl --namespace gitlab exec -ti gitlab-geo-toolbox-XXX -- gitlab-rake geo:set_secondary_as_primary
    

    可以提供环境变量来修改任务的行为。可用的变量有:

    名称 默认值 描述
    ENABLE_SILENT_MODE false 如为 true,在提升之前启用静默模式 (极狐GitLab 16.4 及以后)。

Step 3. 提升 次要 集群

  1. 更新既有的集群配置。

    您可以使用 Helm 获取既有集群的配置:

    helm --namespace gitlab get values gitlab-geo > gitlab.yaml
    

    既有配置包含 Geo 的一部分,内容类似:

    geo:
       enabled: true
       role: secondary
       nodeName: secondary.example.com
       psql:
          host: geo-2.db.example.com
          port: 5431
          password:
             secret: geo
             key: geo-postgresql-password
    

    要将 次要 集群提升到 主要 集群,您需要将 role: secondary 更新为 role: primary

    如果集群依旧为主要站点,则您可以移除整个 psql 部分;它指向追踪数据库,而且当集群作为主要站点时,它会被忽略。

    使用新的配置更新集群:

    helm upgrade --install --version <current Chart version> gitlab-geo gitlab/gitlab --namespace gitlab -f gitlab.yaml
    
  2. 使用之前次要站点使用的 URL 来验证您是否可以连接到新提升的主要站点上。

  3. 如果成功的话,次要站点就被升级为主要站点了。

故障排查

该部分内容已移动至另一个位置

技术支持

如果您在使用此功能的过程中遇到任何问题,您可以在极狐GitLab 官方论坛上发帖求助,您也可以直接扫描下方二维码咨询专业人员:

jihu-gitlab-support