- 대체 로컬 Redis 인스턴스 사용
- 번들된 Redis를 TCP를 통해 접근 가능하게 만들기
- Linux 패키지를 사용하여 Redis 전용 서버 설정하기
- 여러 Redis 인스턴스와 함께 실행하기
- Redis 센티넬
- 장애 조치(failover) 설정에서 Redis 사용하기
- Google Cloud Memorystore 사용하기
- 기본값 이상의 Redis 연결 수 증가하기
- Redis용 TCP 스택 튜닝하기
- 호스트 이름에서 IP 발표하기
- Redis Cache 인스턴스를 LRU로 설정하기
- 보안 소켓 계층(SSL) 사용하기
- SSL 인증서
- 이름 바뀐 명령어
- 지연 해제
- 쓰레드 I/O
- 민감한 구성 제공을 위한 Redis 클라이언트에 평문 저장 방지
- 문제 해결
Redis 구성하기
대체 로컬 Redis 인스턴스 사용
Linux 패키지 설치에는 기본적으로 Redis가 포함되어 있습니다. GitLab 애플리케이션을 사용자 고유의 로컬 실행 중인 Redis 인스턴스로 지시하려면:
-
/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>'
-
변경 사항이 적용되려면 GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
번들된 Redis를 TCP를 통해 접근 가능하게 만들기
리눅스 패키지로 관리되는 Redis 인스턴스를 TCP를 통해 접근 가능하게 하려면 다음 설정을 사용합니다:
-
/etc/gitlab/gitlab.rb
파일을 편집합니다:redis['port'] = 6379 redis['bind'] = '127.0.0.1' redis['password'] = '여기에 레디스 비밀번호 입력'
-
파일을 저장하고 변경 사항이 적용되려면 GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
Linux 패키지를 사용하여 Redis 전용 서버 설정하기
GitLab 애플리케이션이 설치된 서버와 별도로 Redis를 설정하고 싶다면, 릴리즈된 Redis를 Linux 패키지 설치에서 사용할 수 있습니다.
여러 Redis 인스턴스와 함께 실행하기
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.rb
의 redis['rename_commands']
설정을 다음과 같이 편집하세요:
redis['rename_commands'] = {
'KEYS': '',
'OTHER_COMMAND': 'VALUE'
}
-
OTHER_COMMAND
는 수정하려는 명령어입니다. -
VALUE
는 다음 중 하나여야 합니다:- 새 명령어 이름.
-
''
, 명령을 완전히 비활성화합니다.
이 기능을 비활성화하려면:
-
/etc/gitlab/gitlab.rb
파일에서redis['rename_commands'] = {}
로 설정하세요. -
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 인증서가 서버의 신뢰할 수 있는 인증서 목록에 제대로 추가되지 않았음을 시사합니다. 이것이 문제인지 확인하려면:
-
/var/log/gitlab/gitlab-workhorse/current
에서 Workhorse 로그를 확인하세요. -
다음과 같이 보이는 메시지가 있는지 확인하세요:
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 서버의 주소를 보여주어야 합니다. 두 번째 줄은 인증서가 이 서버에서 제대로 신뢰되지 않는다는 것을 나타냅니다. 앞의 섹션을 참조하세요. -
SSL 인증서가 작동하는지 다음 해결 단계를 통해 확인하세요.
NOAUTH 인증이 필요함
Redis 서버는 명령어를 수락하기 전에 AUTH
메시지를 통해 비밀번호를 요구할 수 있습니다. NOAUTH Authentication required
오류 메시지는 클라이언트가 비밀번호를 보내지 않았음을 시사합니다. GitLab 로그를 확인하여 이 오류를 해결할 수 있습니다:
-
/var/log/gitlab/gitlab-workhorse/current
에서 Workhorse 로그를 확인하세요. -
다음과 같이 보이는 메시지가 있는지 확인하세요:
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."
-
/etc/gitlab/gitlab.rb
에서 지정된 Redis 클라이언트 비밀번호가 올바른지 확인하세요:gitlab_rails['redis_password'] = '여기에_비밀번호_입력'
-
Linux 패키지로 제공된 Redis 서버를 사용 중이라면, 서버에도 동일한 비밀번호가 있는지 확인하세요:
redis['password'] = '여기에_비밀번호_입력'
Redis 연결 재설정 (ECONNRESET)
GitLab Rails 로그(/var/log/gitlab-rails/production.log
)에서 Redis::ConnectionError: Connection lost (ECONNRESET)
을 확인한다면, 서버가 SSL을 기대하지만 클라이언트가 사용하도록 설정되지 않았을 수 있습니다.
-
서버가 실제로 SSL로 포트를 수신 대기하고 있는지 확인하세요. 예를 들어:
/opt/gitlab/embedded/bin/openssl s_client -connect redis-server:6379
-
/var/opt/gitlab/gitlab-rails/etc/resque.yml
을 확인하세요. 다음과 같이 보여야 합니다:production: url: rediss://:mypassword@redis-server:6379/
-
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 <비밀번호>