{{< details >}}

  • Tier: 专业版, 旗舰版
  • Offering: 私有化部署

{{< /details >}}

本文档描述了在多节点配置中运行 Geo 的最小参考架构。如果您的多节点设置与描述的不同,可以根据需要调整这些说明。

架构概述

Architecture for running Geo in a multi-node configuration with primary and secondary backend services

上图假设 primarysecondary Geo 站点位于两个独立的位置,拥有自己的虚拟网络和私有 IP 地址。网络配置使得在一个地理位置中的所有机器都可以使用其私有 IP 地址互相通信。给出的 IP 地址是示例,可能会根据您部署的网络拓扑而有所不同。

访问这两个 Geo 站点的唯一外部方式是通过 HTTPS,在上面的示例中是 gitlab.us.example.comgitlab.eu.example.com

{{< alert type=”note” >}}

primarysecondary Geo 站点必须能够通过 HTTPS 进行通信。

{{< /alert >}}

Redis 和 PostgreSQL 的多节点配置

由于为 PostgreSQL 和 Redis 设置此配置涉及额外的复杂性,因此本文档不涵盖此 Geo 多节点文档。

有关使用 Linux 软件包设置多节点 PostgreSQL 集群和 Redis 集群的更多信息,请参阅:

{{< alert type=”note” >}}

可以使用云托管服务来设置 PostgreSQL 和 Redis,但这超出了本文档的范围。

{{< /alert >}}

先决条件:两个独立工作的极狐GitLab多节点站点

一个极狐GitLab站点作为 Geo primary 站点。使用极狐GitLab参考架构文档来设置。您可以为每个 Geo 站点使用不同的参考架构大小。如果您已经有一个在使用的极狐GitLab 实例,可以将其用作 primary 站点。

第二个极狐GitLab站点作为 Geo secondary 站点。同样,使用极狐GitLab参考架构文档来设置。建议登录并测试它。但请注意,作为从 primary 站点复制过程的一部分,其数据将被清除。

配置一个极狐GitLab站点为 Geo primary 站点

以下步骤使一个极狐GitLab站点能够作为 Geo primary 站点。

第一步:配置 primary 前端节点

{{< alert type=”note” >}}

不要使用 geo_primary_role,因为它是为单节点站点设计的。

{{< /alert >}}

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下内容:

    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    
    ##
    ## 禁用自动迁移
    ##
    gitlab_rails['auto_migrate'] = false
    

更改后,重新配置极狐GitLab 以使更改生效。

第二步:定义站点为 primary 站点

  1. 在一个前端节点上执行以下命令:

    sudo gitlab-ctl set-geo-primary-node
    

{{< alert type=”note” >}}

在典型的极狐GitLab 多节点设置期间,PostgreSQL 和 Redis 应该已经在应用程序节点上禁用。从应用程序节点到后端节点上的服务的连接也应该已经配置好。请参阅多节点配置文档以了解 PostgreSQLRedis

{{< /alert >}}

配置另一个极狐GitLab站点为 Geo secondary 站点

一个 secondary 站点类似于其他任何极狐GitLab多节点站点,但有三个主要区别:

  • 主要 PostgreSQL 数据库是 Geo primary 站点的 PostgreSQL 数据库的只读副本。
  • 每个 Geo secondary 站点有一个额外的 PostgreSQL 数据库,称为 “Geo 跟踪数据库”,用于跟踪各种资源的复制和验证状态。
  • 有一个额外的极狐GitLab服务 geo-logcursor

因此,我们逐一设置多节点组件,并包括与典型多节点设置的偏差。然而,我们强烈建议首先配置一个全新的极狐GitLab站点,就像它不是 Geo 设置的一部分一样。这允许验证它是一个正常工作的极狐GitLab站点。只有在确认其正常工作后,才应将其修改为用于 Geo secondary 站点。这有助于将 Geo 设置问题与无关的多节点配置问题分开。

第一步:配置 Geo secondary 站点上的 Redis 和 Gitaly 服务

再次使用非 Geo 多节点文档配置以下服务:

{{< alert type=”note” >}}

NFS 可以用来代替 Gitaly,但不推荐。

{{< /alert >}}

第二步:在 Geo secondary 站点上配置 Geo 跟踪数据库

Geo 跟踪数据库不能在多节点 PostgreSQL 集群中运行,请参阅 为跟踪 PostgreSQL 数据库配置 Patroni 集群

您可以在单个节点上运行 Geo 跟踪数据库,如下所示:

  1. 为极狐GitLab应用程序用来访问跟踪数据库的数据库用户生成所需密码的 MD5 哈希:

    用户名(默认情况下为 gitlab_geo)被合并到哈希中。

    gitlab-ctl pg-password-md5 gitlab_geo
    # Enter password: <your_tracking_db_password_here>
    # Confirm password: <your_tracking_db_password_here>
    # fca0b89a972d69f00eb3ec98a5838484
    

    使用此哈希填写下一步中的 <tracking_database_password_md5_hash>

  2. 在打算运行 Geo 跟踪数据库的机器上,在 /etc/gitlab/gitlab.rb 中添加以下内容:

    ##
    ## 启用 Geo secondary 跟踪数据库
    ##
    geo_postgresql['enable'] = true
    geo_postgresql['listen_address'] = '<ip_address_of_this_host>'
    geo_postgresql['sql_user_password'] = '<tracking_database_password_md5_hash>'
    
    ##
    ## 配置到副本数据库的 PostgreSQL 连接
    ##
    geo_postgresql['md5_auth_cidr_addresses'] = ['<replica_database_ip>/32']
    gitlab_rails['db_host'] = '<replica_database_ip>'
    
    # 防止重新配置尝试在副本数据库上运行迁移
    gitlab_rails['auto_migrate'] = false
    

更改后,重新配置极狐GitLab 以使更改生效。

如果使用外部 PostgreSQL 实例,请参阅 使用外部 PostgreSQL 实例的 Geo

第三步:配置 PostgreSQL 流复制

按照 Geo 数据库复制说明

如果使用外部 PostgreSQL 实例,请参阅 使用外部 PostgreSQL 实例的 Geo

启用流复制后,在完成次要站点配置之前,gitlab-rake db:migrate:status:geo 将失败,特别是在Geo 配置 - 第三步。添加次要站点

第四步:配置 Geo secondary 站点上的前端应用程序节点

{{< alert type=”note” >}}

不要使用 geo_secondary_role,因为它是为单节点站点设计的。

{{< /alert >}}

在上面的最小架构图中,有两台机器运行极狐GitLab应用程序服务。这些服务在配置中被选择性地启用。

按照参考架构中概述的相关步骤配置极狐GitLab Rails 应用程序节点,然后进行以下修改:

  1. 在 Geo secondary 站点中的每个应用程序节点上编辑 /etc/gitlab/gitlab.rb,并添加以下内容:

    ##
    ## 启用极狐GitLab应用程序服务。application_role 启用许多服务。
    ## 或者,您可以选择在不同节点上启用或禁用特定服务,以帮助水平扩展和分离关注点。
    ##
    roles ['application_role']
    
    ## `application_role` 已经启用了此功能。只有在您选择性地启用依赖于 Rails 的单个服务(如 `puma`、`sidekiq`、`geo-logcursor` 等)时才需要此行。
    gitlab_rails['enable'] = true
    
    ##
    ## 启用 Geo Log Cursor 服务
    ##
    geo_logcursor['enable'] = true
    
    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    
    ##
    ## 禁用自动迁移
    ##
    gitlab_rails['auto_migrate'] = false
    
    ##
    ## 配置到跟踪数据库的连接
    ##
    geo_secondary['enable'] = true
    geo_secondary['db_host'] = '<geo_tracking_db_host>'
    geo_secondary['db_password'] = '<geo_tracking_db_password>'
    
    ##
    ## 配置到流复制副本数据库的连接(如果尚未配置)
    ##
    gitlab_rails['db_host'] = '<replica_database_host>'
    gitlab_rails['db_password'] = '<replica_database_password>'
    
    ##
    ## 配置到 Redis 的连接(如果尚未配置)
    ##
    gitlab_rails['redis_host'] = '<redis_host>'
    gitlab_rails['redis_password'] = '<redis_password>'
    
    ##
    ## 如果您使用的是不受 Omnibus 管理的自定义用户,则需要像下面这样指定 UID 和 GID,并确保它们在集群中的节点之间匹配,以避免权限问题
    ##
    user['uid'] = 9000
    user['gid'] = 9000
    web_server['uid'] = 9001
    web_server['gid'] = 9001
    registry['uid'] = 9002
    registry['gid'] = 9002
    

{{< alert type=”note” >}} postgresql['sql_user_password'] = '密钥的md5 摘要'。如果您使用 Linux 软件包设置了 PostgreSQL 集群并设置了 postgresql['sql_user_password'] = '密钥的md5 摘要',请记住 gitlab_rails['db_password']geo_secondary['db_password'] 包含明文密码。这些配置用于让 Rails 节点连接到数据库。

{{< /alert >}}

{{< alert type=”note” >}}

确保当前节点的 IP 列在副本数据库的 postgresql['md5_auth_cidr_addresses'] 设置中,以允许此节点上的 Rails 连接到 PostgreSQL。 {{< /alert >}}

更改后,重新配置极狐GitLab 以使更改生效。

架构概述 拓扑中,以下极狐GitLab服务在 “前端” 节点上启用:

  • geo-logcursor
  • gitlab-pages
  • gitlab-workhorse
  • logrotate
  • nginx
  • registry
  • remote-syslog
  • sidekiq
  • puma

通过在前端应用程序节点上运行 sudo gitlab-ctl status 验证这些服务是否存在。

第五步:为 Geo secondary 站点设置负载均衡器

上面的最小架构图显示每个地理位置都有一个负载均衡器,用于将流量路由到应用程序节点。

有关更多信息,请参阅具有多个节点的极狐GitLab的负载均衡器

第六步:配置 Geo secondary 站点上的后端应用程序节点

上面的最小架构图显示所有应用程序服务一起运行在相同的机器上。然而,对于多个节点,我们强烈建议所有服务分开运行

例如,可以通过对前端应用程序节点进行类似配置,并对其进行一些更改以仅运行 sidekiq 服务,来配置一个 Sidekiq 节点:

  1. 在 Geo secondary 站点中的每个 Sidekiq 节点上编辑 /etc/gitlab/gitlab.rb,并添加以下内容:

    ##
    ## 启用 Sidekiq 服务
    ##
    sidekiq['enable'] = true
    gitlab_rails['enable'] = true
    
    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    
    ##
    ## 禁用自动迁移
    ##
    gitlab_rails['auto_migrate'] = false
    
    ##
    ## 配置到跟踪数据库的连接
    ##
    geo_secondary['enable'] = true
    geo_secondary['db_host'] = '<geo_tracking_db_host>'
    geo_secondary['db_password'] = '<geo_tracking_db_password>'
    
    ##
    ## 配置到流复制副本数据库的连接(如果尚未配置)
    ##
    gitlab_rails['db_host'] = '<replica_database_host>'
    gitlab_rails['db_password'] = '<replica_database_password>'
    
    ##
    ## 配置到 Redis 的连接(如果尚未配置)
    ##
    gitlab_rails['redis_host'] = '<redis_host>'
    gitlab_rails['redis_password'] = '<redis_password>'
    
    ##
    ## 如果您使用的是不受 Omnibus 管理的自定义用户,则需要像下面这样指定 UID 和 GID,并确保它们在集群中的节点之间匹配,以避免权限问题
    ##
    user['uid'] = 9000
    user['gid'] = 9000
    web_server['uid'] = 9001
    web_server['gid'] = 9001
    registry['uid'] = 9002
    registry['gid'] = 9002
    

    您可以类似地配置一个节点只运行 geo-logcursor 服务,使用 geo_logcursor['enable'] = true 并禁用 Sidekiq,使用 sidekiq['enable'] = false

    这些节点不需要连接到负载均衡器。

第七步:复制密钥并在应用程序中添加次要站点

  1. 配置极狐GitLab 以设置 次级 站点。