{{< details >}}
- Tier: 基础版,专业版,旗舰版
- Offering: 私有化部署
{{< /details >}}
如果您在云提供商上托管极狐GitLab,您可以选择使用托管服务来管理 Redis。例如,AWS 提供运行 Redis 的 ElastiCache。
或者,您可以选择自己管理一个独立于 Linux 软件包的 Redis 实例。
要求
提供您自己的 Redis 实例的要求如下:
- 在要求页面中找到所需的最低 Redis 版本。
- 支持独立 Redis 或 Redis 高可用性与 Sentinel。不支持 Redis 集群。
- 云提供商的托管 Redis(例如 AWS ElastiCache)工作正常。如果这些服务支持高可用性,请确保它不是 Redis 集群类型。
记录 Redis 节点的 IP 地址或主机名、端口和密码(如果需要)。
云提供商中的 Redis 托管服务
- 根据要求设置 Redis。
-
在您的
/etc/gitlab/gitlab.rb
文件中为外部 Redis 服务配置极狐GitLab 应用服务器的适当连接详细信息:当使用单个 Redis 实例时:
redis['enable'] = false gitlab_rails['redis_host'] = '<redis_instance_url>' gitlab_rails['redis_port'] = '<redis_instance_port>' # 如果在 Redis 节点上配置了 Redis 身份验证,则需要 gitlab_rails['redis_password'] = '<redis_password>' # 如果实例使用 Redis SSL 设置为 true gitlab_rails['redis_ssl'] = true
当使用单独的 Redis 缓存和持久实例时:
redis['enable'] = false # 默认 Redis 连接 gitlab_rails['redis_host'] = '<redis_persistent_instance_url>' gitlab_rails['redis_port'] = '<redis_persistent_instance_port>' gitlab_rails['redis_password'] = '<redis_persistent_password>' # 如果实例使用 Redis SSL 设置为 true gitlab_rails['redis_ssl'] = true # Redis 缓存连接 # 如果使用 SSL,请将 `redis://` 替换为 `rediss://` gitlab_rails['redis_cache_instance'] = 'redis://:<redis_cache_password>@<redis_cache_instance_url>:<redis_cache_instance_port>'
-
重新配置以使更改生效:
sudo gitlab-ctl reconfigure
设置驱逐策略
运行单个 Redis 实例时,驱逐策略应设置为 noeviction
。
如果您运行的是单独的 Redis 缓存和持久实例,缓存应配置为最近最少使用缓存 (LRU) 使用 allkeys-lru
,而持久应设置为 noeviction
。
配置取决于云提供商或服务,但通常以下设置和值配置一个缓存:
-
maxmemory-policy
=allkeys-lru
-
maxmemory-samples
=5
使用您自己的 Redis 服务器进行 Redis 复制和故障转移
这是为您自己安装 Redis 而非使用捆绑的 Linux 软件包配置可扩展 Redis 设置的文档,尽管使用 Linux 软件包是强烈推荐的,因为我们专门为极狐GitLab优化它们,并负责升级 Redis 到最新支持的版本。
还请注意,您可以根据高级 Redis 设置选择覆盖所有对 /home/git/gitlab/config/resque.yml
的引用,如配置文件文档中所述。
我们要强调的是阅读 Linux 软件包 Redis HA 的复制和故障转移文档的重要性,因为它为 Redis 的配置提供了一些宝贵的信息。继续阅读本指南之前,请先阅读它。
在设置新的 Redis 实例之前,以下是一些要求:
- 本指南中的所有 Redis 服务器必须配置为使用 TCP 连接而不是套接字。要配置 Redis 使用 TCP 连接,您需要在 Redis 配置文件中定义
bind
和port
。您可以绑定到所有接口 (0.0.0.0
) 或指定所需接口的 IP(例如,内部网络中的一个)。 - 自 Redis 3.2 起,您必须定义一个密码以接收外部连接 (
requirepass
)。 - 如果您使用 Redis 与 Sentinel,您还需要在同一实例中为副本密码定义 (
masterauth
) 定义相同的密码。
此外,请阅读使用 Linux 软件包进行 Redis 复制和故障转移中描述的先决条件。
第一步:配置主 Redis 实例
假设 Redis 主实例的 IP 是 10.0.0.1
:
- 安装 Redis。
-
编辑
/etc/redis/redis.conf
:## 定义一个 `bind` 地址,指向其他机器可以访问的本地 IP。如果您确实需要绑定到外部可访问的 IP,请确保添加额外的防火墙规则以防止未经授权的访问: bind 10.0.0.1 ## 定义一个 `port` 强制 redis 监听 TCP,以便其他机器可以连接到它(默认端口为 `6379`)。 port 6379 ## 设置密码认证(在所有节点中使用相同的密码)。 ## 当设置 Redis 与 Sentinel 一起使用时,密码应为 `requirepass` 和 `masterauth` 相同。 requirepass redis-password-goes-here masterauth redis-password-goes-here
- 重启 Redis 服务以使更改生效。
第二步:配置副本 Redis 实例
假设 Redis 副本实例的 IP 是 10.0.0.2
:
- 安装 Redis。
-
编辑
/etc/redis/redis.conf
:## 定义一个 `bind` 地址,指向其他机器可以访问的本地 IP。如果您确实需要绑定到外部可访问的 IP,请确保添加额外的防火墙规则以防止未经授权的访问: bind 10.0.0.2 ## 定义一个 `port` 强制 redis 监听 TCP,以便其他机器可以连接到它(默认端口为 `6379`)。 port 6379 ## 设置密码认证(在所有节点中使用相同的密码)。 ## 当设置 Redis 与 Sentinel 一起使用时,密码应为 `requirepass` 和 `masterauth` 相同。 requirepass redis-password-goes-here masterauth redis-password-goes-here ## 定义 `replicaof` 指向 Redis 主实例的 IP 和端口。 replicaof 10.0.0.1 6379
- 重启 Redis 服务以使更改生效。
- 针对所有其他副本节点重复这些步骤。
第三步:配置 Redis Sentinel 实例
Sentinel 是一种特殊类型的 Redis 服务器。它继承了您可以在 redis.conf
中定义的大多数基本配置选项,特定选项以 sentinel
前缀开头。
假设 Redis Sentinel 安装在与 Redis 主机相同的实例上,IP 为 10.0.0.1
(某些设置可能与主机重叠):
- 安装 Redis Sentinel。
-
编辑
/etc/redis/sentinel.conf
:## 定义一个 `bind` 地址,指向其他机器可以访问的本地 IP。如果您确实需要绑定到外部可访问的 IP,请确保添加额外的防火墙规则以防止未经授权的访问: bind 10.0.0.1 ## 定义一个 `port` 强制 Sentinel 监听 TCP,以便其他机器可以连接到它(默认端口为 `6379`)。 port 26379 ## 设置密码认证(在所有节点中使用相同的密码)。 ## 当设置 Redis 与 Sentinel 一起使用时,密码应为 `requirepass` 和 `masterauth` 相同。 requirepass redis-password-goes-here masterauth redis-password-goes-here ## 使用 `sentinel auth-pass` 定义您为 Redis 主节点和副本实例定义的相同共享密码。 sentinel auth-pass gitlab-redis redis-password-goes-here ## 使用 `sentinel monitor` 定义 Redis 主节点的 IP 和端口,以及启动故障转移所需的法定人数。 sentinel monitor gitlab-redis 10.0.0.1 6379 2 ## 使用 `sentinel down-after-milliseconds` 定义不响应的服务器被视为关闭的时间(以毫秒为单位)。 sentinel down-after-milliseconds gitlab-redis 10000 ## 为 `sentinel failover_timeout` 定义一个值(以毫秒为单位)。这具有多种含义: ## ## * 在给定 Sentinel 已经尝试对同一主机进行故障转移后,重新启动故障转移所需的时间是故障转移超时的两倍。 ## ## * 对于根据 Sentinel 当前配置复制到错误主机的副本,强制它与正确的主机进行复制所需的时间正好是故障转移超时(从 Sentinel 检测到错误配置开始计时)。 ## ## * 取消已经进行中的故障转移所需的时间,但尚未产生任何配置更改(REPLICAOF NO ONE 尚未被提升的副本确认)。 ## ## * 故障转移正在进行中等待所有副本重新配置为新主机副本的最长时间。然而,即使在此时间之后,Sentinels 仍会重新配置副本,但不会按指定的并行同步进度进行。 sentinel failover_timeout 30000
- 重启 Redis 服务以使更改生效。
- 针对所有其他 Sentinel 节点重复这些步骤。
第四步:配置极狐GitLab 应用
您可以随时在新的或现有安装中启用或禁用 Sentinel 支持。从极狐GitLab 应用的角度来看,它所需的只是 Sentinel 节点的正确凭证。
虽然它不需要所有 Sentinel 节点的列表,但在出现故障时,它需要访问至少一个列出的节点。
以下步骤应在理想情况下没有 Redis 或 Sentinel 的极狐GitLab 应用服务器上执行:
-
编辑
/home/git/gitlab/config/resque.yml
,按照resque.yml.example
中的示例,取消注释 Sentinel 行,并指向正确的服务器凭证:# resque.yaml production: url: redis://:redi-password-goes-here@gitlab-redis/ sentinels: - host: 10.0.0.1 port: 26379 # 指向 sentinel,而不是 redis 端口 - host: 10.0.0.2 port: 26379 # 指向 sentinel,而不是 redis 端口 - host: 10.0.0.3 port: 26379 # 指向 sentinel,而不是 redis 端口
-
重启极狐GitLab以使更改生效。
使用 1 个主节点、2 个副本和 3 个哨兵的最小配置示例
在此示例中,我们认为所有服务器都具有 IP 在 10.0.0.x
范围内的内部网络接口,并且它们可以使用这些 IP 互相连接。
在实际使用中,您还需要设置防火墙规则以防止其他机器的未经授权访问,并阻止来自外部的流量。
对于此示例,哨兵 1 配置在与 Redis 主节点相同的机器上,哨兵 2 在与 副本 1相同的机器上,哨兵 3 在与 副本 2相同的机器上。
以下是每台机器和分配的 IP 的列表和说明:
-
10.0.0.1
: Redis 主节点 + 哨兵 1 -
10.0.0.2
: Redis 副本 1 + 哨兵 2 -
10.0.0.3
: Redis 副本 2 + 哨兵 3 -
10.0.0.4
: 极狐GitLab 应用
在初始配置之后,如果由哨兵节点启动故障转移,Redis 节点将被重新配置,主节点会永久更改(包括在 redis.conf
中),从一个节点更改为另一个节点,直到再次启动新的故障转移。
对于 sentinel.conf
也是如此,在初始执行后,当任何新的哨兵节点开始监控 主节点或故障转移提升不同的 主节点时,它会被覆盖。
Redis 主节点和哨兵 1 的示例配置
-
在
/etc/redis/redis.conf
中:bind 10.0.0.1 port 6379 requirepass redis-password-goes-here masterauth redis-password-goes-here
-
在
/etc/redis/sentinel.conf
中:bind 10.0.0.1 port 26379 sentinel auth-pass gitlab-redis redis-password-goes-here sentinel monitor gitlab-redis 10.0.0.1 6379 2 sentinel down-after-milliseconds gitlab-redis 10000 sentinel failover_timeout 30000
-
重启 Redis 服务以使更改生效。
Redis 副本 1 和哨兵 2 的示例配置
-
在
/etc/redis/redis.conf
中:bind 10.0.0.2 port 6379 requirepass redis-password-goes-here masterauth redis-password-goes-here replicaof 10.0.0.1 6379
-
在
/etc/redis/sentinel.conf
中:bind 10.0.0.2 port 26379 sentinel auth-pass gitlab-redis redis-password-goes-here sentinel monitor gitlab-redis 10.0.0.1 6379 2 sentinel down-after-milliseconds gitlab-redis 10000 sentinel failover_timeout 30000
-
重启 Redis 服务以使更改生效。
Redis 副本 2 和哨兵 3 的示例配置
-
在
/etc/redis/redis.conf
中:bind 10.0.0.3 port 6379 requirepass redis-password-goes-here masterauth redis-password-goes-here replicaof 10.0.0.1 6379
-
在
/etc/redis/sentinel.conf
中:bind 10.0.0.3 port 26379 sentinel auth-pass gitlab-redis redis-password-goes-here sentinel monitor gitlab-redis 10.0.0.1 6379 2 sentinel down-after-milliseconds gitlab-redis 10000 sentinel failover_timeout 30000
-
重启 Redis 服务以使更改生效。
极狐GitLab 应用的示例配置
-
编辑
/home/git/gitlab/config/resque.yml
:production: url: redis://:redis-password-goes-here@gitlab-redis/ sentinels: - host: 10.0.0.1 port: 26379 # 指向 sentinel,而不是 redis 端口 - host: 10.0.0.2 port: 26379 # 指向 sentinel,而不是 redis 端口 - host: 10.0.0.3 port: 26379 # 指向 sentinel,而不是 redis 端口
-
重启极狐GitLab以使更改生效。
故障排除
请参阅Redis 故障排除指南。