Redis 구성

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

대체 로컬 Redis 인스턴스 사용

리눅스 패키지 설치에는 기본적으로 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'
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    

Linux 패키지를 통한 Redis 전용 서버 설정

GitLab 애플리케이션과는 별도의 서버에 Redis를 설정하려면 리눅스 패키지 설치에서 번들된 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

기본값을 초과하는 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를 가장 최근에 사용된(LRU) 캐시로 구성할 수 있습니다. Redis 캐시, 속도 제한 및 저장소 캐시 인스턴스에만 이 설정을 적용해야 합니다. Redis 대기열, 공유 상태 인스턴스 및 추적(chunk) 인스턴스는 지속적으로 유지되어야 하는 데이터(예: Sidekiq 작업)가 포함되어 있기 때문에 LRU로 구성해서는 안 됩니다.

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

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

Secure Sockets Layer (SSL) 사용

Redis를 SSL 뒤에 실행하도록 구성할 수 있습니다.

SSL 뒤로 Redis 서버 실행

  1. Redis 서버를 SSL 뒤에서 실행하려면 /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 플래그를 지원하지 않는 경우 디버깅 목적으로 stunnel과 같은 것을 사용해야 할 수 있습니다. stunnel로 SSL로 보호된 Redis에 연결하기를 참조하세요.

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 연결 재설정 (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에 연결할 때 다음을 사용할 수 있습니다:

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