极狐GitLab 正式推出面向 GitLab 老旧版本(12.x、13.x、14.x、15.x 等)免费用户的专业升级服务,点击查看详情

返回列表 发布新帖

GitLab GEO 配置01 - 基本介绍和安装配置

866 0
发表于 2024-4-7 10:08:34 | 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×

本帖最后由 ALEX 于 2024-4-10 10:56 编辑

1. GitLab Geo概述

有时候从一个距离很远的GitLab实例,拉取一个非常大的仓库,由于网络的原因,会花费很长的时间。极狐GitLab Geo 功能可以给用户提供一个 近距离的、只读的GitLab实例克隆,大大减少部分用户拉取仓库的时间,帮助加快开发进度。

Geo实例还可以作为实时热备,实现分钟级甚至秒级(取决于负载和带宽)的增量数据同步,用于灾难恢复。

Geo使用场景:

Geo能够提供:

  • 一个镜像的 从节点(Secondary node)
  • 完全继承 主节点(Primary node)的用户权限
  • 与主节点相同的UI

Geo带来哪些好处:

  • 拉取大的仓库,耗时有可能从 分钟级降到 秒级
  • 在两个节点之间分摊只读流量
  • 灾难恢复时或者有计划的、快速的切换到从节点

Geo工作原理:

场景示意图: Geo

  • 原始节点,也称主节点(Primary node),只能有一个
  • 镜像的只读节点,也称从节点(Secondary node),从节点可以有N个
  • 从节点通过API获取主节点的用户数据,通过HTTPS+JWT同步仓库,LFS对象和附件
  • 用户可以直接Push代码到从节点,从节点以代理身份将请求提交给主节点
  • 使用Geo有部分限制,详细参考:Geo限制

架构图: Geo架构图

  • 对数据库的写入,只发生在主节点。从节点通过Postgresql流复制,实时收到数据库的更新
  • 从节点会有两个PostgreSQL数据库:一个只读数据库,用来同步主节点。另外一个跟踪数据库(Tracking Database),用来记录哪些数据被同步
  • 如果主节点启用了LDAP集成,建议LDAP服务器也配置主备模式,以应对灾难恢复的场景

运行要求:

  • OpenSSH 6.9+ (用于配置从数据库快速查找授权ssh keys。CentOS 7.4+, Ubuntu 16.04+ 默认支持)
  • PostgreSQL 11/12 (PG 13暂不支持)
  • Git 2.9+
  • Git-lfs 2.4.2+(用户端)
  • 所有节点原则上应该使用相同版本的极狐GitLab

端口要求:

  • 主从节点之间 双向放开80和443端口。
  • 主节点向从节点开放5432端口。

2. Geo安装配置

部署环境:

  • 主节点:1.13.24.86 (已安装极狐Gitlab)
  • 从节点:43.131.246.172

2.1 安装Geo从节点

在从节点上,安装极狐GitLab,版本必须与主节点保持一致。EE与JH在版本一致的情况下,也可以做Geo,只不过需要做些额外的工作。 安装完成后,建议不要在从节点上创建用户或有其他操作,从节点数据库会在同步之前被清理掉。

2.2 主节点添加许可证(Premium+)

  • 在主节点上,安装license,要求 Premium(专业版)版本以上,解锁Geo功能。从节点不需要上传许可证,许可证信息会通过Postgresql数据库进行同步。

  • 如果忘记上传许可证,或者许可证无效,则会在配置Geo的过程中出现以下提示:

    GitLab Geo is not supported with this license. Please contact the sales team: https://about.gitlab.com/sales.

2.3 配置数据库复制

  • 如果你的Omnibus实例用的是默认的内置PostgreSQL数据库,请继续下面操作。
  • 如果你的Omnibus使用的是外部PostgreSQL数据库,请参照Geo with external PostgreSQL instances进行配置。

2.3.1 配置主节点

  • 修改 /etc/gitlab/gitlab.rb,为主节点定义一个独特的名称:

    gitlab_rails['geo_node_name'] = 'cn'
  • 运行 gitlab-ctl reconfigure,使上述配置生效。

  • 指定当前节点为主节点:

    gitlab-ctl set-geo-primary-node

    输出:

    Saving primary Geo node with name cn.alexju.cn and URL https://cn.alexju.cn/ ...
    https://cn.alexju.cn/ is now the primary Geo node
  • 设置PostgreSQL数据库用户gitlab以及复制用户gitlab_replicator的密码并生成MD5 hash值:

    gitlab-ctl pg-password-md5 gitlab
    # Enter password: 
    # Confirm password: 
    # a21bac242e46e2e2

    编辑 /etc/gitlab/gitlab.rb,其中 gitlab_rails['db_password']为数据库明文密码:

    postgresql['sql_user_password'] = 'a21bac242e46e2e2'
    gitlab_rails['db_password'] = ''

    默认内置的复制用户gitlab_replicator, 也需要设置密码。根据版本和数据库是否外置,分为三种情况:

    • 情形一:14.5以下的版本通过命令设置密码

      gitlab-ctl set-replication-password
    • 情形二:14.5及以上版本需要在配置文件中指定

      gitlab-ctl pg-password-md5 gitlab_replicator
      # Enter password: <your_password_here>
      # Confirm password: <your_password_here>
      # 950233c0dfc2f39c64cf30457c3b7f1e

      编辑 /etc/gitlab/gitlab.rb

      postgresql['sql_replication_password'] = '<md5_hash_of_your_password>'
    • 情形三:如果你使用的 外置PostgreSQL数据库,你还需要单独创建复制用户,然后设置密码。

      --- 创建用户 'replicator'
      CREATE USER gitlab_replicator;
      
      --- 配置密码和权限
      ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<replication_password>';

      之后根据版本决定是否配置到配置文件中(版本>=14.5)。

  • 配置PostgreSQL监听地址 编辑 /etc/gitlab/gitlab.rb

    #启用Geo标志
    roles ['geo_primary_role']
    #配置PG监听的公网地址或者VPC内部地址
    postgresql['listen_address'] = '0.0.0.0'  
    postgresql['md5_auth_cidr_addresses'] = ['127.0.0.1/32', '1.13.24.86/32', '43.131.246.172/32']
    #配置从节点的DB复制槽数量
    postgresql['max_replication_slots'] = 5
    #临时禁止数据库自动迁移,直到PG完成重启并监听内部地址
    gitlab_rails['auto_migrate'] = false

    其中,关于监听地址listen_address的设置:

    如果需要使用 0.0.0.0`作为listen_address,需要在postgresql['md5_auth_cidr_addresses'] 设置中添加127.0.0.1/32,以允许Rails通过127.0.0.1 `连接。

  • 运行 gitlab-ctl reconfigure,使GitLab配置生效

  • 运行 gitlab-ctl restart postgresql,使PostgreSQL配置生效

  • 编辑 /etc/gitlab/gitlab.rb,将false改为true:

    gitlab_rails['auto_migrate'] = true
  • 运行 gitlab-ctl reconfigure,使GitLab配置生效

  • 主节点配置文件demo示例(版本>=14.5)

    external_url 'https://cn.alexju.cn'
    letsencrypt['enable'] = false
    
    gitlab_rails['geo_node_name'] = 'primary'
    gitlab_rails['db_password'] = 'gitlab.12345'
    postgresql['sql_user_password'] = '1377fe1a0d8840128827b3dd170654d0'
    postgresql['sql_replication_password'] = 'ec7a4da8f980589e7ce2f3acde60d00f'
    roles(['geo_primary_role'])
    postgresql['listen_address'] = '0.0.0.0'
    postgresql['md5_auth_cidr_addresses'] = ['127.0.0.1/32', '1.13.24.86/32', '43.131.246.172/32']
    postgresql['max_replication_slots'] = 5
    gitlab_rails['auto_migrate'] = true
    
    # merge request external storaged diffs
    gitlab_rails['external_diffs_enabled'] = true
    gitlab_rails['external_diffs_storage_path'] = "/opt/storage/external-diffs"
    gitlab_rails['external_diffs_when'] = 'outdated'
    
    # registry
    registry["enable"] = true
    registry_external_url "https://gitlab.gitlab-devops.com:5050"
    registry['notifications'] = [
      {
        'name' => 'geo_event',
        'url' => 'https://gitlab.gitlab-devops.com/api/v4/container_registry_event/events',
        'timeout' => '500ms',
        'threshold' => 5,
        'backoff' => '1s',
        'headers' => {
          'Authorization' => ['rXLK0PPBfACQKJZ5qEkK0ZYnq7u7o337']
        }
      }
    ]

2.3.2 配置从节点

  • 在从节点上安装相同版本的极狐GitLab,并完成首次初始化reconfigure.

  • 停止 pumasidekiq服务

    gitlab-ctl stop puma
    gitlab-ctl stop sidekiq
  • 检查与主节点PostgreSQL数据库连通性

    gitlab-rake gitlab:tcp_check[1.13.24.86,5432]

    输出:

    TCP connection from 43.131.246.172:45696 to 1.13.24.86:5432 succeeded

    使用telnet 检查5432也可以。

    如果这步失败,请检查IP地址(注意区分内、外网地址)、防火墙规则或云服务器的安全组规则。

  • 安装 server.crt 将主节点的证书 ~gitlab-psql/data/server.crt拷贝到从节点,并在从节点执行安装:

    scp [email]root@1.13.24.86[/email]:~gitlab-psql/data/server.crt /etc/gitlab/ssl
    
    install \
      -D \
      -o gitlab-psql \
      -g gitlab-psql \
      -m 0400 \
      -T /etc/gitlab/ssl/server.crt ~gitlab-psql/.postgresql/root.crt

    证书复制完成后,建议使用md5sum检查两边证书的一致性,注意主从节点的证书位置有区别。

  • 测试数据库TLS加密通信

    使用 gitlab-psql用户测试与主节点的数据库连通性,主节点的默认数据库为 gitlabhq_production

    sudo \
      -u gitlab-psql /opt/gitlab/embedded/bin/psql \
      --list \
      -U gitlab_replicator \
      -d "dbname=gitlabhq_production sslmode=verify-ca" \
      -W \
      -h 1.13.24.86

    输出 List of databases

                                          List of databases
            Name         |    Owner    | Encoding | Collate | Ctype |        Access privileges      
    ---------------------+-------------+----------+---------+-------+---------------------------------
    gitlabhq_production | gitlab      | UTF8     | C       | C     | 
    postgres            | gitlab-psql | UTF8     | C       | C     | 
    template0           | gitlab-psql | UTF8     | C       | C     | =c/"gitlab-psql"               +
                        |             |          |         |       | "gitlab-psql"=CTc/"gitlab-psql"
    template1           | gitlab-psql | UTF8     | C       | C     | "gitlab-psql"=CTc/"gitlab-psql"+
                        |             |          |         |       | =c/"gitlab-psql"
    (4 rows)
  • 配置gitlab.rb文件

    roles ['geo_secondary_role']
    postgresql['listen_address'] = '0.0.0.0'
    postgresql['md5_auth_cidr_addresses'] = ['127.0.0.1/32', '43.131.246.172/32']
    #sql_replication_password是主节点复制用户的hash密码
    postgresql['sql_replication_password'] = '<md5_hash_of_your_password>'
    #sql_user_password是之前主节点数据库用户gitlab的hash密码
    postgresql['sql_user_password'] = 'a21bac242e46e2e2'
    #db_password为主节点数据库用户gitlab的明文密码
    gitlab_rails['db_password'] = ''

    其中,关于监听地址listen_address的设置:

    如果需要使用 0.0.0.0`作为listen_address,需要在postgresql['md5_auth_cidr_addresses'] 设置中添加127.0.0.1/32,以允许Rails通过127.0.0.1 `连接。

  • 运行 gitlab-ctl reconfigure,使GitLab配置生效

  • 运行 gitlab-ctl restart postgresql,使PostgreSQL配置生效

  • 从节点配置文件demo示例(版本>=14.5)

    external_url "https://gitlab.gitlab-devops.com"
    letsencrypt['enable'] = false
    
    postgresql['listen_address'] = '0.0.0.0'
    postgresql['md5_auth_cidr_addresses'] = ['127.0.0.1/32']
    gitlab_rails['db_password'] = 'gitlab.12345'
    postgresql['sql_user_password'] = '1377fe1a0d8840128827b3dd170654d0'
    postgresql['sql_replication_password'] = 'ec7a4da8f980589e7ce2f3acde60d00f'
    roles(['geo_secondary_role'])
    gitlab_rails['geo_node_name'] = 'secondary'
    
    # registry
    registry["enable"] = true
    registry_external_url "https://gitlab.gitlab-devops.com:5050"
    gitlab_rails['geo_registry_replication_enabled'] = true
    gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://gitlab.gitlab-devops.com:5050'

2.3.3 数据库复制和同步

  请确保下列操作在 从节点上执行,该操作将删除所有 从节点的数据。

  • 修改从节点配置(14.9.x起需要修改,旧版本跳过)

    cd /var/opt/gitlab/postgresql/data/
    sed -i 's/verify-full/verify-ca/g' gitlab-geo.conf
    gitlab-ctl restart postgresql
    gitlab-ctl tail postgresql
  • 复制数据库 给从节点指定一个独特的名称slot-name, 该名称只允许包含 小写字母、数字和下划线。运行时最好指定 --backup-timeout,默认是30mins,避免流复制超时。

    gitlab-ctl replicate-geo-database --slot-name=us --host=1.13.24.86 --sslmode=verify-ca --backup-timeout=7200

    输出:

    No user created projects. Database not active
    
    WARNING: Make sure this script is run from the secondary server
    
     You are about to delete your local PostgreSQL database, and replicate the primary database. 
     The primary geo node is `1.13.24.86` 
    
     Are you sure you want to continue (replicate/no)? 
    Confirmation: replicate
    Enter the password for [email]gitlab_replicator@1.13.24.86[/email]: 
     Executing GitLab backup task to prevent accidental data loss
     Stopping PostgreSQL and all GitLab services
     Checking for replication slot us
     Creating replication slot us
     Backing up postgresql.conf
     Moving old data directory to '/var/opt/gitlab/postgresql/data.1620826017'
     Starting base backup as the replicator user (gitlab_replicator)
    pg_basebackup: initiating base backup, waiting for checkpoint to complete
    pg_basebackup: checkpoint completed
    pg_basebackup: write-ahead log start point: 0/C000028 on timeline 1
    pg_basebackup: starting background WAL receiver
        0/79784 kB (0%), 0/1 tablespace (...lab/postgresql/data/backup_label)
    65879/79784 kB (82%), 0/1 tablespace (...postgresql/data/base/16401/28114)
    79794/79794 kB (100%), 0/1 tablespace (...ostgresql/data/global/pg_control)
    79794/79794 kB (100%), 1/1 tablespace                                     
    pg_basebackup: write-ahead log end point: 0/C000138
    pg_basebackup: waiting for background process to finish streaming ...
    pg_basebackup: syncing data to disk ...
    pg_basebackup: base backup completed
     Restoring postgresql.conf
     PostgreSQL 12 or newer. Writing settings to postgresql.conf and creating standby.signal
     Setting ownership permissions in PostgreSQL data directory
     Starting PostgreSQL and all GitLab services

    至此,数据库复制完成。

    执行 gitlab-ctl reconfigure,刷新配置。

回复

使用道具 举报

意见建议

Email:forum@gitlab.cn
  • 关注公众号
  • 添加专业顾问
Copyright © 2001-2024 极狐GitLab论坛 版权所有 All Rights Reserved. 鄂ICP备2021008419号-1|鄂公网安备42018502006137号
关灯 快速发帖
扫一扫添加专业顾问
返回顶部
快速回复 返回顶部 返回列表