Redis 구성

Tier: Free, Premium, Ultimate
Offering: Self-managed

대체 로컬 Redis 인스턴스 사용하기

Linux 패키지 설치에는 기본적으로 Redis가 포함되어 있습니다. GitLab 애플리케이션을 본인의 로컬 Redis 인스턴스로 유도하려면:

  1. /etc/gitlab/gitlab.rb를 편집합니다:

    # 번들된 Redis 비활성화
    redis['enable'] = false
    
    # TCP를 통한 Redis
    gitlab_rails['redis_host'] = '127.0.0.1'
    gitlab_rails['redis_port'] = 6379
    
    # 또는 Unix 도메인 소켓을 통한 Redis
    gitlab_rails['redis_socket'] = '/tmp/redis.sock' # 기본값은 /var/opt/gitlab/redis/redis.socket
    
    # 필요 시 대체 로컬 Redis 인증 비밀번호
    gitlab_rails['redis_password'] = '<redis_password>'
    
  2. 변경 사항이 적용되도록 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

번들된 Redis를 TCP를 통해 접근 가능하게 만들기

Linux 패키지가 관리하는 Redis 인스턴스를 TCP를 통해 접근 가능하게 하려면 다음 설정을 사용하세요:

  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://docs.gitlab.com/ee/administration/redis/replication_and_failover.html#running-multiple-redis-clusters를 참조하세요.

Redis Sentinel

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html를 참조하세요.

장애 조치 설정에서 Redis 사용하기

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html를 참조하세요.

Google Cloud Memorystore 사용하기

Google Cloud Memorystore는 Redis CLIENT 명령을 지원하지 않습니다.
기본적으로 Sidekiq는 디버깅 목적으로 CLIENT를 설정하려고 시도합니다. 이는 다음 구성 설정을 통해 비활성화할 수 있습니다:

gitlab_rails['redis_enable_client'] = false

기본값보다 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은 이를 켜거나 끌 수 있는 boolean입니다. 이 값은 hostname -f 명령어로부터 호스트네임을 동적으로 검색합니다.

redis['announce_ip_from_hostname'] = true

Redis 캐시 인스턴스를 LRU로 설정하기

여러 Redis 인스턴스를 사용하면 Redis를 최소 최근 사용 캐시로 구성할 수 있습니다. 주의: 이 설정은 Redis 캐시, 속도 제한, 그리고 저장소 캐시 인스턴스에 대해서만 적용해야 하며, Redis 큐, 공유 상태 인스턴스 및 트레이스 청크 인스턴스는 결코 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
    

알림: 일부 redis-cli 바이너리는 TLS를 통해 Redis 서버에 직접 연결하는 기능을 지원하지 않습니다.

redis-cli--tls 플래그를 지원하지 않는 경우, 디버깅 목적으로 redis-cli를 사용하여 Redis 서버에 연결하기 위해 stunnel와 같은 도구를 사용해야 합니다.

GitLab 클라이언트를 SSL을 통해 Redis 서버에 연결하기

GitLab 클라이언트의 SSL 지원을 활성화하려면:

  1. /etc/gitlab/gitlab.rb에 다음 줄을 추가합니다:

    gitlab_rails['redis_ssl'] = true
    
  2. 변경 사항이 적용되도록 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

SSL 인증서

Redis에 대한 사용자 지정 SSL 인증서를 사용하는 경우, 이를 신뢰할 수 있는 인증서에 추가해야 합니다.

이름이 변경된 명령어

기본적으로 KEYS 명령어는 보안 조치로 비활성화되어 있습니다.

이 명령어를 숨기거나 비활성화하려면, /etc/gitlab/gitlab.rbredis['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

클라이언트 타임아웃

기본적으로, Ruby Redis 클라이언트는 연결, 읽기 및 쓰기 타임아웃에 대해 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"
    

    첫 번째 줄은 Redis 서버의 주소와 함께 rediss를 스킴으로 표시해야 합니다. 두 번째 줄은 이 서버에서 인증서가 제대로 신뢰되지 않음을 나타냅니다. 이전 섹션을 참조하세요.

  3. 이 문제 해결 단계를 통해 SSL 인증서가 작동하는지 확인하세요.

NOAUTH 인증 필요

Redis 서버는 명령이 수신되기 전에 AUTH 메시지를 통해 전달된 비밀번호가 필요할 수 있습니다. NOAUTH Authentication required 오류 메시지는 클라이언트가 비밀번호를 보내지 않고 있음을 나타냅니다. 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: 연결 손실 (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. rediss:// 대신 redis://가 있다면, redis_ssl 매개변수가 제대로 구성되지 않았거나 재구성 단계가 진행되지 않았을 수 있습니다.

CLI를 통해 Redis에 연결하기

문제 해결을 위해 Redis에 연결할 때 다음을 사용할 수 있습니다:

  • 유닉스 도메인 소켓을 통한 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>