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'
    
  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를 참조하세요.

장애 조치(failover) 설정에서 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

기본 10,000개 이상의 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 인스턴스는 지속되어야 하는 데이터(예: Sidekiq 작업)를 포함하고 있으므로 이를 LRU로 구성해서는 안 됩니다.

메모리 사용을 32GB로 제한하려면 다음을 사용할 수 있습니다:

redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5

SSL(안전한 소켓 계층) 사용

Redis를 SSL 뒤에 실행하려면 다음 설정을 /etc/gitlab/gitlab.rb에 사용할 수 있습니다. 가능한 값에 대해 자세히 알아보려면 redis.conf.erb의 TLS/SSL 섹션을 참조하세요.

  1. SSL 뒤에 Redis 서버 실행

    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 서버에 연결하도록 만들기

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

  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

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 서버의 scheme이 표시되어야 합니다. 두 번째 줄은 인증서가 이 서버에서 제대로 신뢰되지 않음을 나타냅니다. 이전 섹션을 참조하십시오.

  3. SSL 인증서가 제대로 작동하는지 다음 문제 해결 단계를 통해 확인합니다.

NOAUTH Authentication required

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: 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. rediss:// 대신 redis://가 있는 경우, 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>