- 使用备用本地 Redis 实例
- 使捆绑的 Redis 可通过 TCP 访问
- 使用 Linux 软件包设置仅 Redis 服务器
- 使用多个 Redis 实例运行
- Redis Sentinel
- 在故障转移设置中使用 Redis
- 将 Redis 连接数量增加到默认值以上
- 调整 Redis 的 TCP 堆栈
- 从主机名公告 IP
- 将 Redis 缓存实例设置为 LRU
- 使用安全套接字层(SSL)
- SSL 证书
- 重命名命令
- 惰性释放
- 线程化 I/O
- 向 Redis 客户端提供敏感配置而不进行明文存储
- 故障排除
配置 Redis
使用备用本地 Redis 实例
Linux 软件包安装默认包含 Redis。要将极狐GitLab 应用程序指向您自己的本地运行的 Redis 实例:
-
编辑
/etc/gitlab/gitlab.rb
:# Disable the bundled Redis redis['enable'] = false # Redis via TCP gitlab_rails['redis_host'] = '127.0.0.1' gitlab_rails['redis_port'] = 6379 # OR Redis via Unix domain sockets gitlab_rails['redis_socket'] = '/tmp/redis.sock' # defaults to /var/opt/gitlab/redis/redis.socket # Password to Authenticate to alternate local Redis if required gitlab_rails['redis_password'] = '<redis_password>'
-
重新配置极狐GitLab 以使更改生效:
sudo gitlab-ctl reconfigure
使捆绑的 Redis 可通过 TCP 访问
如果您希望通过 TCP 使由 Linux 软件包管理的 Redis 实例可访问,请使用以下设置:
-
编辑
/etc/gitlab/gitlab.rb
:redis['port'] = 6379 redis['bind'] = '127.0.0.1' redis['password'] = 'redis-password-goes-here'
-
保存文件并重新配置极狐GitLab 以使更改生效:
sudo gitlab-ctl reconfigure
使用 Linux 软件包设置仅 Redis 服务器
如果您希望在与极狐GitLab 应用程序不同的服务器上设置 Redis,您可以使用从 Linux 软件包安装的捆绑 Redis。
使用多个 Redis 实例运行
Redis Sentinel
请参阅 https://gitlab.cn/docs/jh/administration/redis/replication_and_failover.html。
在故障转移设置中使用 Redis
请参阅 https://gitlab.cn/docs/jh/administration/redis/replication_and_failover.html。
将 Redis 连接数量增加到默认值以上
默认情况下,Redis 仅接受 10,000 个客户端连接。如果您需要超过 10,000 个连接,可以根据需要设置 maxclients
属性。请注意,调整 maxclients
属性意味着您还需要考虑系统设置的 fs.file-max
(例如 sysctl -w fs.file-max=20000
)。
redis['maxclients'] = 20000
调整 Redis 的 TCP 堆栈
以下设置旨在启用更高性能的 Redis 服务器实例。tcp_timeout
是 Redis 服务器在终止空闲 TCP 连接之前等待的秒数。tcp_keepalive
是一个可调节的设置,用于在没有通信时向客户端发送 TCP ACK。
redis['tcp_timeout'] = "60"
redis['tcp_keepalive'] = "300"
从主机名公告 IP
目前,启用 Redis 中的主机名的唯一方法是设置 redis['announce_ip']
。然而,这需要为每个 Redis 实例唯一设置。announce_ip_from_hostname
是一个布尔值,允许我们打开或关闭此功能。它动态获取主机名,从 hostname -f
命令推断主机名。
redis['announce_ip_from_hostname'] = true
将 Redis 缓存实例设置为 LRU
使用多个 Redis 实例允许您将 Redis 配置为最近最少使用缓存。请注意,您应该只对 Redis 缓存、速率限制和存储库缓存实例执行此操作;Redis 队列、共享状态实例和 tracechunks 实例不应配置为 LRU,因为它们包含的数据(例如 Sidekiq 任务)预计是持久的。
要将内存使用限制为 32GB,您可以使用:
redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5
使用安全套接字层(SSL)
您可以将 Redis 配置为在 SSL 后面运行。
在 SSL 后面运行 Redis 服务器
-
要在 SSL 后面运行 Redis 服务器,您可以在
/etc/gitlab/gitlab.rb
中使用以下设置。请参阅redis.conf.erb
的 TLS/SSL 部分以了解可能的值:redis['tls_port'] redis['tls_cert_file'] redis['tls_key_file']
-
指定所需的值后,重新配置极狐GitLab 以使更改生效:
sudo gitlab-ctl reconfigure
redis-cli
二进制文件不支持直接通过 TLS 连接到 Redis 服务器。如果您的 redis-cli
不支持 --tls
标志,您将不得不使用类似 stunnel
的工具来使用 redis-cli
连接到 Redis 服务器以进行任何调试目的。使极狐GitLab 客户端通过 SSL 连接到 Redis 服务器
要激活极狐GitLab 客户端对 SSL 的支持:
-
在
/etc/gitlab/gitlab.rb
中添加以下行:gitlab_rails['redis_ssl'] = true
-
重新配置极狐GitLab 以使更改生效:
sudo gitlab-ctl reconfigure
SSL 证书
如果您使用自定义 SSL 证书用于 Redis,请确保将它们添加到受信任的证书。
重命名命令
默认情况下,作为安全措施,KEYS
命令被禁用。
如果您想要混淆或禁用此命令或其他命令,请编辑 /etc/gitlab/gitlab.rb
中的 redis['rename_commands']
设置,如下所示:
redis['rename_commands'] = {
'KEYS': '',
'OTHER_COMMAND': 'VALUE'
}
-
OTHER_COMMAND
是您要修改的命令 -
VALUE
应该是以下之一:- 一个新命令名称。
-
''
,完全禁用该命令。
要禁用此功能:
- 在您的
/etc/gitlab/gitlab.rb
文件中设置redis['rename_commands'] = {}
。 - 运行
sudo gitlab-ctl reconfigure
。
惰性释放
Redis 4 引入了惰性释放。这可以在释放大值时提高性能。
此设置默认值为 false
。要启用它,您可以使用:
redis['lazyfree_lazy_eviction'] = true
redis['lazyfree_lazy_expire'] = true
redis['lazyfree_lazy_server_del'] = true
redis['replica_lazy_flush'] = true
线程化 I/O
Redis 6 引入了线程化 I/O。这允许写操作跨多个核心扩展。
此设置默认禁用。要启用它,您可以使用:
redis['io_threads'] = 4
redis['io_threads_do_reads'] = true
客户端超时
默认情况下,用于 Redis 的 Ruby 客户端使用 1 秒的默认值用于连接、读取和写入超时。您可能需要调整这些值以适应本地网络延迟。例如,如果您看到 Connection timed out - user specified timeout
错误,您可能需要提高 connect_timeout
:
gitlab_rails['redis_connect_timeout'] = 3
gitlab_rails['redis_read_timeout'] = 1
gitlab_rails['redis_write_timeout'] = 1
向 Redis 客户端提供敏感配置而不进行明文存储
有关详细信息,请参阅配置文档中的示例。
故障排除
x509: certificate signed by unknown authority
此错误消息表明 SSL 证书尚未正确添加到服务器的受信任证书列表中。要检查这是否是一个问题:
-
检查
/var/log/gitlab/gitlab-workhorse/current
中的 Workhorse 日志。 -
如果您看到类似的消息:
2018-11-14_05:52:16.71123 time="2018-11-14T05:52:16Z" level=info msg="redis: dialing" address="redis-server:6379" scheme=rediss 2018-11-14_05:52:16.74397 time="2018-11-14T05:52:16Z" level=error msg="unknown error" error="keywatcher: x509: certificate signed by unknown authority"
第一行应该显示
rediss
作为方案和 Redis 服务器的地址。第二行表示证书未在此服务器上正确受信任。请参阅上一节。 -
通过这些故障排除步骤验证 SSL 证书是否有效。
NOAUTH 需要身份验证
Redis 服务器可能需要通过 AUTH
消息发送密码,然后才接受命令。NOAUTH 需要身份验证
错误消息表明客户端未发送密码。极狐GitLab 日志可能有助于解决此错误:
-
检查
/var/log/gitlab/gitlab-workhorse/current
中的 Workhorse 日志。 -
如果您看到类似的消息:
2018-11-14_06:18:43.81636 time="2018-11-14T06:18:43Z" level=info msg="redis: dialing" address="redis-server:6379" scheme=rediss 2018-11-14_06:18:43.86929 time="2018-11-14T06:18:43Z" level=error msg="unknown error" error="keywatcher: pubsub receive: NOAUTH Authentication required."
-
检查
/etc/gitlab/gitlab.rb
中指定的 Redis 客户端密码是否正确:gitlab_rails['redis_password'] = 'your-password-here'
-
如果您使用的是 Linux 软件包提供的 Redis 服务器,请检查服务器是否具有相同的密码:
redis['password'] = 'your-password-here'
Redis 连接重置 (ECONNRESET)
如果您在极狐GitLab Rails 日志(/var/log/gitlab-rails/production.log
)中看到 Redis::ConnectionError: Connection lost (ECONNRESET)
,这可能表明服务器正在期望 SSL,但客户端未配置为使用它。
-
检查服务器是否实际上通过 SSL 监听端口。例如:
/opt/gitlab/embedded/bin/openssl s_client -connect redis-server:6379
-
检查
/var/opt/gitlab/gitlab-rails/etc/resque.yml
。您应该看到类似的内容:production: url: rediss://:mypassword@redis-server:6379/
-
如果出现
redis://
而不是rediss://
,可能是redis_ssl
参数未正确配置或未运行重新配置步骤。
通过 CLI 连接到 Redis
在连接到 Redis 进行故障排除时,您可以使用:
-
通过 Unix 域套接字连接到 Redis:
sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
-
通过 TCP 连接到 Redis:
sudo /opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379
-
需要时,使用密码进行 Redis 身份验证:
sudo /opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379 -a <password>