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를 통해 접근 가능하게 만들기

리눅스 패키지로 관리되는 Redis 인스턴스를 TCP를 통해 접근 가능하게 하려면 다음 설정을 사용합니다:

  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    redis['port'] = 6379
    redis['bind'] = '127.0.0.1'
    redis['password'] = '여기에 레디스 비밀번호 입력'
    
  2. 파일을 저장하고 변경 사항이 적용되려면 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    

Linux 패키지를 사용하여 Redis 전용 서버 설정하기

GitLab 애플리케이션이 설치된 서버와 별도로 Redis를 설정하고 싶다면, 릴리즈된 Redis를 Linux 패키지 설치에서 사용할 수 있습니다.

여러 Redis 인스턴스와 함께 실행하기

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html#running-multiple-redis-clusters을(를) 참조하세요.

Redis 센티넬

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

기본값 이상의 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 Cache 인스턴스를 LRU로 설정하기

여러 Redis 인스턴스를 사용하면 Redis를 가장 최근에 사용된 캐시로 구성할 수 있습니다. Redis 캐시, 속도 제한, 및 저장소 캐시 인스턴스에만 이렇게 설정해야 합니다. Redis 큐, 공유 상태 인스턴스 및 tracechunks 인스턴스는 데이터(예: Sidekiq 작업)가 지속적으로 예상되므로 LRU로 구성해서는 안 됩니다.

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

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

보안 소켓 계층(SSL) 사용하기

Redis를 SSL 뒤에서 실행하려면 다음 설정을 사용합니다.

SSL 뒤에서 Redis 서버 실행하기

Redis 서버를 SSL 뒤에서 실행하려면 /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 서버에 redis-cli를 통해 연결해야 합니다.

GitLab 클라이언트가 SSL을 통해 Redis 서버에 연결하도록 만들기

GitLab 클라이언트가 SSL을 지원하도록 하려면 다음 줄을 /etc/gitlab/gitlab.rb에 추가합니다:

   gitlab_rails['redis_ssl'] = true

변경 사항이 적용되려면 GitLab을 다시 구성합니다:

   sudo gitlab-ctl reconfigure

SSL 인증서

사용자 정의 SSL 인증서를 Redis에 사용 중이라면 trusted certificates에 추가해야 합니다.

이름 바뀐 명령어

기본적으로 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의 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 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'] = '여기에_비밀번호_입력'
    
  4. Linux 패키지로 제공된 Redis 서버를 사용 중이라면, 서버에도 동일한 비밀번호가 있는지 확인하세요:

    redis['password'] = '여기에_비밀번호_입력'
    

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_ssl 매개변수가 제대로 구성되지 않았거나 reconfigure 단계가 실행되지 않았을 수 있습니다.

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 <비밀번호>