配置 Redis

使用备用本地 Redis 实例

Linux 软件包安装默认包含 Redis。要将极狐GitLab 应用程序指向您自己的本地运行的 Redis 实例:

  1. 编辑 /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>'
    
  2. 重新配置极狐GitLab 以使更改生效:

    sudo gitlab-ctl reconfigure
    

使捆绑的 Redis 可通过 TCP 访问

如果您希望通过 TCP 使由 Linux 软件包管理的 Redis 实例可访问,请使用以下设置:

  1. 编辑 /etc/gitlab/gitlab.rb:

    redis['port'] = 6379
    redis['bind'] = '127.0.0.1'
    redis['password'] = 'redis-password-goes-here'
    
  2. 保存文件并重新配置极狐GitLab 以使更改生效:

    sudo gitlab-ctl reconfigure
    

使用 Linux 软件包设置仅 Redis 服务器

如果您希望在与极狐GitLab 应用程序不同的服务器上设置 Redis,您可以使用从 Linux 软件包安装的捆绑 Redis

使用多个 Redis 实例运行

请参阅 https://gitlab.cn/docs/jh/administration/redis/replication_and_failover.html#running-multiple-redis-clusters

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 服务器

  1. 要在 SSL 后面运行 Redis 服务器,您可以在 /etc/gitlab/gitlab.rb 中使用以下设置。请参阅 redis.conf.erb 的 TLS/SSL 部分以了解可能的值:

    redis['tls_port']
    redis['tls_cert_file']
    redis['tls_key_file']
    
  2. 指定所需的值后,重新配置极狐GitLab 以使更改生效:

    sudo gitlab-ctl reconfigure
    
note 某些 redis-cli 二进制文件不支持直接通过 TLS 连接到 Redis 服务器。如果您的 redis-cli 不支持 --tls 标志,您将不得不使用类似 stunnel 的工具来使用 redis-cli 连接到 Redis 服务器以进行任何调试目的。

使极狐GitLab 客户端通过 SSL 连接到 Redis 服务器

要激活极狐GitLab 客户端对 SSL 的支持:

  1. /etc/gitlab/gitlab.rb 中添加以下行:

    gitlab_rails['redis_ssl'] = true
    
  2. 重新配置极狐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 应该是以下之一:
    1. 一个新命令名称。
    2. '',完全禁用该命令。

要禁用此功能:

  1. 在您的 /etc/gitlab/gitlab.rb 文件中设置 redis['rename_commands'] = {}
  2. 运行 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 证书尚未正确添加到服务器的受信任证书列表中。要检查这是否是一个问题:

  1. 检查 /var/log/gitlab/gitlab-workhorse/current 中的 Workhorse 日志。

  2. 如果您看到类似的消息:

    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 服务器的地址。第二行表示证书未在此服务器上正确受信任。请参阅上一节

  3. 通过这些故障排除步骤验证 SSL 证书是否有效。

NOAUTH 需要身份验证

Redis 服务器可能需要通过 AUTH 消息发送密码,然后才接受命令。NOAUTH 需要身份验证 错误消息表明客户端未发送密码。极狐GitLab 日志可能有助于解决此错误:

  1. 检查 /var/log/gitlab/gitlab-workhorse/current 中的 Workhorse 日志。

  2. 如果您看到类似的消息:

    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."
    
  3. 检查 /etc/gitlab/gitlab.rb 中指定的 Redis 客户端密码是否正确:

    gitlab_rails['redis_password'] = 'your-password-here'
    
  4. 如果您使用的是 Linux 软件包提供的 Redis 服务器,请检查服务器是否具有相同的密码:

    redis['password'] = 'your-password-here'
    

Redis 连接重置 (ECONNRESET)

如果您在极狐GitLab Rails 日志(/var/log/gitlab-rails/production.log)中看到 Redis::ConnectionError: Connection lost (ECONNRESET),这可能表明服务器正在期望 SSL,但客户端未配置为使用它。

  1. 检查服务器是否实际上通过 SSL 监听端口。例如:

    /opt/gitlab/embedded/bin/openssl s_client -connect redis-server:6379
    
  2. 检查 /var/opt/gitlab/gitlab-rails/etc/resque.yml。您应该看到类似的内容:

    production:
      url: rediss://:mypassword@redis-server:6379/
    
  3. 如果出现 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>