Help us learn about your current experience with the documentation. Take the survey.

多节点 Geo 配置

  • Tier: Premium, Ultimate
  • Offering: GitLab Self-Managed

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

本指南适用于具有多个应用节点(Sidekiq 或 GitLab Rails)的安装。对于使用外部 PostgreSQL 的单节点安装,请遵循为两个单节点站点设置 Geo(使用外部 PostgreSQL 服务),如果你使用其他外部服务,请相应调整你的配置。

架构概览

在多节点配置中运行 Geo 的架构,包含主站和后端服务

图表来源 - 仅限 GitLab 团队成员

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

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

primarysecondary Geo 站点必须能够通过 HTTPS 相互通信。

多节点的 Redis 和 PostgreSQL

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

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

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

先决条件:两个独立运行的 GitLab 多节点站点

一个 GitLab 站点作为 Geo primary 站点。使用 GitLab 参考架构文档 进行设置。你可以为每个 Geo 站点使用不同大小的参考架构。如果你已经有一个正在使用的 GitLab 实例,它可以作为 primary 站点。

第二个 GitLab 站点作为 Geo secondary 站点。同样,使用 GitLab 参考架构文档 进行设置。登录并测试它是个好主意。但是请注意,在从 primary 站点复制的过程中,其数据会被清除。

将 GitLab 站点配置为 Geo primary 站点

以下步骤使 GitLab 站点能够作为 Geo primary 站点运行。

步骤 1:配置 primary 前端节点

不要使用 geo_primary_role,因为它适用于单节点站点。

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

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

完成这些更改后,重新配置 GitLab 以使更改生效。

步骤 2:将站点定义为 primary 站点

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

    sudo gitlab-ctl set-geo-primary-node

在典型的 GitLab 多节点设置过程中,PostgreSQL 和 Redis 应该已经在应用节点上被禁用。应用节点到后端节点服务的连接也应该已经配置。请参阅多节点配置文档中的 PostgreSQLRedis 部分。

将另一个 GitLab 站点配置为 Geo secondary 站点

secondary 站点与其他 GitLab 多节点站点类似,但有三个主要区别:

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

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

步骤 1:在 Geo secondary 站点上配置 Redis 和 Gitaly 服务

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

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

步骤 2:在 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
  3. 选择退出自动 PostgreSQL 升级以避免在升级 GitLab 时发生意外停机。请注意已知的 使用 Geo 升级 PostgreSQL 时的注意事项。特别是对于较大的环境,PostgreSQL 升级必须有计划地执行。因此,从现在开始,确保 PostgreSQL 升级是常规维护活动的一部分。

完成这些更改后,重新配置 GitLab 以使更改生效。

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

步骤 3:配置 PostgreSQL 流式复制

遵循 Geo 数据库复制说明

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

启用流式复制后,在secondary 站点配置完成之前,特别是Geo 配置 - 步骤 3. 添加 secondary 站点gitlab-rake db:migrate:status:geo 会失败。

步骤 4:配置 Geo secondary 站点上的前端应用节点

不要使用 geo_secondary_role,因为它适用于单节点站点。

在最小的架构图中,有两台机器运行 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://docs.gitlab.com/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

postgresql['sql_user_password'] = 'md5 digest of secret' 如果你使用 Linux 包设置了 PostgreSQL 集群并设置了 postgresql['sql_user_password'] = 'md5 digest of secret',请记住 gitlab_rails['db_password']geo_secondary['db_password'] 包含明文密码。这些配置用于让 Rails 节点连接到数据库。

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

完成这些更改后,重新配置 GitLab 以使更改生效。

架构概览拓扑中,“前端"节点上启用了以下 GitLab 服务:

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

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

步骤 5:为 Geo secondary 站点设置 LoadBalancer

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

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

步骤 6:配置 Geo secondary 站点上的后端应用节点

最小的架构图显示所有应用服务都在同一台机器上运行。但是,对于多节点,我们强烈建议单独运行所有服务

例如,Sidekiq 节点可以配置得类似于前面记录的前端应用节点,做一些更改以只运行 sidekiq 服务:

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

    ##
    ## 启用 Sidekiq 服务
    ##
    sidekiq['enable'] = true
    gitlab_rails['enable'] = true
    
    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://docs.gitlab.com/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

    这些节点不需要附加到负载均衡器。

步骤 7:复制密钥并在应用中添加 secondary 站点

  1. 配置 GitLab 以设置 primarysecondary 站点。