Redis 설정은 어떻게 초기화되는가?

d3fau1t·2022년 7월 26일
0

뻘짓

목록 보기
5/9

Redis 설정파일에 관한 내용

Redis 시스템을 구성하던 중 설정값에 대한 고민을 하였는데..
그 과정에서 설정값은 어떻게 구성되고 어떤 값을 사용해야할지 찾아보면서 redis의 코드까지 분석해보는 시간을 가졌습니다.

관련 내용을 기록한 포스트입니다.

기본 설정값?

CentOS 7 설치 후 redis-7.0.4 버전을 설치하였을때 생성되는 설정파일은 여기서 확인할 수 있습니다.

설치 당시 대부분의 설정값은 주석처리되어있었고, 입력하지 않아도 레디스 서버가 실행될 때 기본값으로 초기화되는 것으로 예상했는데 예상외로 기본생성된 파일에 주석처리 되어있지 않은 설정값들이 꽤 많았습니다.

이러한 이유로 Centos7에서 yum으로 설치되는 redis는 시스템에 의존적인 설정값을 사용하는가? 라는 생각을 가지게되었습니다.

결론부터 말하자면 한가지 항목을 제외하고 초기에 생성된 설정파일에서 주석처리 되어있지 않은 설정값들도 기본값이었습니다.

기본 설정값 관련 내용 이후에 다루고있습니다.

정말로 그런지 확인하기위해 CentOS 7 컨테이너에 Redis를 설치하면서 생성된 설정값을 복사한 뒤, 제거했습니다.

이후 설정값이 없는상태로 서버를 구동했고 CONFIG GET {CONFIG_NAME} 으로 복사해둔 설정값과 하나씩 대조해봤는데 모두 기본값이었습니다.

설정값이 없는데 그 설정정보는 어떻게 초기화하는거고, 어디서 찾아오는지 궁금해졌습니다.

설정값이 없을 때 Redis가 설정값을 초기화하는 방법

redis 서버가 구동되는 시점부터 순서대로 따라가보려고합니다.

아래 작성될 내용들은 프로젝트 셋업 당시에 선택했던 redis-7.0.4 버전의 코드를 참조한 것입니다.

c로 작성된 redis 서버의 프로세스는 main() 부터 시작합니다.

서버가 초기화되는 과정에서 initServerConfig()를 호출하여 설정정보를 받아와 서버의 설정을 초기화하는데 해당 기능의 원형은 #L1845에 있습니다.

서버 설정을 초기화하고 ACL, TLS등의 설정을 하는 것 같은데.. 필요한경우 열어보면 좋을 것 같다

따라가보면 initConfigValues()를 만나게되는데, 이 함수의 원형을 보면 registerConfigValue() 함수를 호출하여 static_configs에 설정 값을 덮어 씌웁니다.



redis-server 내부에서 사용하는 static_configs 영역에 redis의 모든 설정값을 초기화하도록 작성되어있습니다.

설정값이 있을 때 Redis가 설정값을 초기화하는 방법

이전과정까지 마친 이후, 다시 main()으로 돌아와서 #L6897을 확인해보면 redis-server 실행시 argument vector로 넘긴 설정파일명이 있는지 체크하는 로직이 있고, 그 아래엔 다른 argument들을 처리하는 로직이 있습니다.

이후 #L6963에서 loadServerConfig()를 호출하여 서버 설정정보를 덮어씌웁니다.

그 안에 있는 함수 원형들을 따라가보면 설정파일을 열어 유효성 검사를 한 뒤, config에 데이터를 넣어놓고 #L708에서 loadServerConigFromString() 함수를 호출하고있는데 설정파일에 include, rename-command, user 등의 예약된 커맨드와 함께 기록된 설정정보를 처리하기도 합니다.

redisServer 구조체를 server라는 이름으로 global하게 사용하고 있음

기본 생성된 설정값과 다르게 설정되어있는 항목을 추적해보았습니다

기본 생성된 설정값

# 서버사용용도, hard-limit, soft-limit, 단위시간
# ex) replica 256mb 64mb 60
#
# hard-limit, 256mb보다 더 많은 요청이 들어오면 연결 종료시키고 로깅함
# soft-limit, 60초당 64mb보다 더 많은 요청이 들어오면 연결 종료시키고 로깅함
# 여기서 사용하는 mb는 MegaBytes 이다.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

설정파일을 모두 제거하고 그냥 실행했을 때 기본 설정된 값 확인

client-output-buffer-limit는 지정한 양보다 더 많은 클라이언트 요청이 올 경우 연결을 끊어버리는 설정입니다.
지금은 replica 키워드를 사용하는 것 같은데 서버가 기본설정해주는 값은 slave로 되어있는점이 특이해보였고.. 어떻게 된 것인지 알아보기로 했습니다.

대부분의 설정값은 static_configs로부터

static_configs에서 client-output-buffer-limit를 생성하는 부분을 찾아보면
config.c #2689 -> updateClientOutputBufferLimit() 을 호출하여 기본값을 설정하는 것을 확인할 수 있는데.. 만약 설정파일에서 다른 값이 들어온다면 덮어씌워줘야하니 rewriteConfigClientOutputBufferLimitOption()을 호출하여 설정파일에 기록된 내용을 사용합니다.

config.c 의 #L1478에서 clientBufferLimitsDefaults를 참조하여 기본값을 넣는 부분도 있고..
#L1493에선 예상대로 slave일 경우 replica로 치환하여 사용하도록 작성된 부분도 보입니다.

예전버전이 적용된 시스템에선 아직 slave를 사용하고있으니 slave를 없애지않고 replica를 혼용해서 사용하는 것 같다는 생각이 듭니다.

결론

Redis 설치 후 기본생성되는 redis.conf 파일은 모두 기본값으로 구성되는걸 알게되었고..

설정 관련내용으로 여러가지 검색해보긴 했어도 실제로 어떻게 작동하는지 알아보는것은 한계가 있었는데.. 코드를 들여다보니 명확해지는 부분도 있었고 의도치않게 원하던 내용도 찾을 수 있었습니다.

나중에 버전 업데이트시 설정관련 내용을 확인하려면 어딜 먼저 봐야할지 알게된 것이 중요한 포인트였다고 생각됩니다 ㅎㅎ

profile
웹 백엔드 합니다.

0개의 댓글