马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 ALEX 于 2024-4-10 10:56 编辑
1. GitLab Geo概述
有时候从一个距离很远的GitLab实例,拉取一个非常大的仓库,由于网络的原因,会花费很长的时间。极狐GitLab Geo 功能可以给用户提供一个 近距离的、只读 的GitLab实例克隆,大大减少部分用户拉取仓库的时间,帮助加快开发进度。
Geo实例还可以作为实时热备,实现分钟级甚至秒级(取决于负载和带宽)的增量数据同步,用于灾难恢复。
Geo使用场景:
Geo能够提供:
- 一个镜像的
从节点 (Secondary node)
- 完全继承
主节点 (Primary node)的用户权限
- 与主节点相同的UI
Geo带来哪些好处:
- 拉取大的仓库,耗时有可能从
分钟级 降到 秒级
- 在两个节点之间分摊只读流量
- 灾难恢复时或者有计划的、快速的切换到从节点
Geo工作原理:
场景示意图:
- 原始节点,也称主节点(Primary node),只能有一个
- 镜像的只读节点,也称从节点(Secondary node),从节点可以有N个
- 从节点通过API获取主节点的用户数据,通过HTTPS+JWT同步仓库,LFS对象和附件
- 用户可以直接Push代码到从节点,从节点以代理身份将请求提交给主节点
- 使用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 配置数据库复制
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.
-
停止 puma 和 sidekiq 服务
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 ,刷新配置。
|