본문 바로가기
Experience/Error FIx

Redis-Container

by jaeaemin 2023. 5. 8.

 

웹 서버 컨테이너와 레디스 컨테이너 사이 연동은 되지만, 컨테이너가 내려 간 경우 스냅샷이 정상적으로 수행되지 않아 메모리 내의 redis의 데이터가 사라진 문제 

 

 

1. 문제 상황

 

도커 컴포즈를 사용해서 웹 서버 환경과 redis 서버 환경을 동시에 도커로 띄워서 서로 연동하여서 사용중인 상황입니다.

redis에서 사용하는 .rdb 파일 위치를 호스트 서버 내의 디렉터리에 마운트 해서 사용하려고 할 때, 서버를 종료 했을 때 redis 내의 데이터가 지워지는 문제가 발생했습니다. 

 

 

사용한 도커 컴포즈 파일의 예시 

services:
  redis:
    image: redis:3.0.6
    container_name: redis-server 
    ports:
      - '6379:6379'
    volumes:
      - redis-volume:/data
    command: redis-server --requirepass 1234
   
   
    ...
    
    
volumes:
    redis-volume:
    driver: local
    driver_opts:
      	type: 'none'
      	o: 'bind'
     	device: '/data/redis'

 

 

 

2. 문제 해결 방법 

 

먼저, 2가지 문제점의 가능성이 있는데 첫 번째는 스냅샷을 수행하는 명령이 redis 자체에서 동작하지 않는 문제가 있을 수 있고 아니면 redis에서 스냅샷은 수행하지만 도커 볼륨 마운트가 잘못 되어서 문제가 발생할 수 있다고 판단했습니다.

후자의 경우에는 도커 내에서나 도커와 볼륨 마운트 사이 접근 권한 문제가 있나 고민했었지만, 살펴본 경우 소유자 권한이나 접근 제어도 잘 설정이 되어있는 것을 확인 했습니다.

 

 

그래서 redis의 스냅샷이 생성에 중점을 두고 에러를 확인햇습니다.

 

먼저 docker 이미지는 레디스 공식 이미지를 사용하고 있고, 컨테이너에 접속하여 몇 가지 검사를 시도했습니다.

 

redis-cli -a 1234 MONIOR

 

다음의 명령어를 통해서 redis-cli에 접속해서 redis에서 수행되는 작업들에 대한 로그를 확인해본 결과 redis는 정상적으로 동작하는 것이 확인 되었습니다.

 

redis-cli MONITOR | grep -E "BGSAVE|SAVE"

 

이 후 grep을 통해서 백그라운드 또는 포그라운드로 데이터를 메모리에서 disk로 저장하는 부분이 수행되는지에 대해서 조사해보니, 아무런 정보도 출력되지 않았습니다.

 

따라서 redis 내부적으로 이미지를 사용하는 경우 disk에 쓰는 스냅샷 작업이 이루어지지 않는다고 판단했습니다.

기본적으로 스냅샷 작업이 느린 주기더라도 수행될 것이라고 생각했는데 그러지 않아서 데이터의 저장이 되지 않았습니다. 

 

redis 이미지를 따로 만들었다면 conf 파일을 수정해서 설정하겠지만, 이미 만들어진 redis 이미지를 사용하기 때문에 redis 이미지를 통해 서버를 시작할 때 아래와 같은 설정 플래그를 통해서 스냅샷 설정 주기를 설정할 수 있었습니다. 

 

 

 

수정 사항

 

command: redis-server --requirepass 1234 --save 300 10

 

 

반응형

'Experience > Error FIx' 카테고리의 다른 글

Influx DB 의 캐시 메모리 오류 해결  (0) 2023.05.03