문제
도커로 레디스를 띄울 때, 기존 데이터나 설정을 유지하고 싶었다.
해결
도커로 레디스를 띄울 때, 볼륨을 통해 저장 공간을 공유하고, redis.conf 라는 레디스 설정 파일도 공유하여 레디스 컨테이너를 띄울 때 데이터를 유지하도록 해결했다.
과정
우선 EC2 Ubuntu24.04 버전에 도커를 띄운 상황에서 설명하겠다.
sudo docker volume create redis-data
우선 redis-data 라고 하는 볼륨을 만들어준다.
$ sudo docker volume inspect redis-data
[
{
"CreatedAt": "2024-08-05T20:43:25+09:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/redis-data/_data",
"Name": "redis-data",
"Options": null,
"Scope": "local"
}
]
docker volume inspect <볼륨명> 을 통해 생성 시간, 저장 위치를 비롯한 볼륨 정보를 볼 수 있다.
cd ~
mkdir redis-dir
cd ./redis-dir
sudo vi redis.conf
또한 ~/redis-dir 에 레디스 전용 디렉토리를 하나 만들고, 여기에 redis.conf 파일을 만들어 두기로 했다.
# redis.conf
# i 를 눌러서 입력 모드로 전환 후, 아래처럼 입력.
bind 0.0.0.0 # 외부 접근 가능
port 6379 # 포트는 6379
requirepass 1234 # 접속 시 인증 필요. auth 1234 하면 인증 처리
maxmemory 1gb # 최대 논리 메모리는 1GB
maxmemory-policy allkeys-lru # 논리 메모리 초과 시 LRU(가장 오래된 데이터 삭제) 선택
appendonly yes # AOF 활성화 (모든 쓰기 로그 저장) -> 실행 시 RDB가 아닌 AOF 파일 읽어 복구
# 다 입력 후, ESC를 눌러서 명령 모드로 돌아온 후 :wq 로 저장 후 나가기.
vi로 들어온 redis.conf 파일이다.
i를 눌러서 입력 모드로 전환 후, bind 0.0.0.0 부터 appendonly yes 까지 적고 ESC를 눌러 명령 모드로 돌아온 후, :wq를 입력하고 엔터를 눌러서 저장하고 빠져나온다.
레디스 띄우기
sudo docker run -d \
-p 6379:6379 \
-v ~/redis-dir/redis.conf:/etc/redis/redis.conf \
-v redis-data:/data \
--name redis-ex \
redis:latest redis-server /etc/redis/redis.conf
그리고 도커로 레디스를 실행해준다.
-p는 포트포워딩,
첫 번째 -v는 -v <redis.conf 저장 위치>:<컨테이너에 저장할 위치>
두 번째 -v는 -v <볼륨이름>:<컨테이너에 저장할 위치>
마지막 줄은 redis:latest 이미지를 사용하는데, redis-server /etc/redis/redis.conf 로 redis.conf를 설정파일로 실행할 수 있다.
...
캡쳐한줄 알았는데 안 하고 지워버렸다.
우선 redis-data 볼륨에는 레디스의 /data 디렉토리와 연동되어 저장되는데, 이 디렉토리에는 레디스의 ~.rdv, ~.aof, manifest 파일이 있다. (정확히는 옵션 기본값인 appendonlydir 디렉토리 안에.)
이 rdb, aof 파일로 레디스가 재시작될 때 복원을 진행하여 새로운 레디스 컨테이너를 띄워도 기존의 데이터를 유지할 수 있다.
레디스 스택 띄우기
sudo docker run -d \
-p 6379:6379 \
-p 8001:8001 \
--name redis \
-v ~/redis-dir/redis-stack.conf:/redis-stack.conf \
-v redis-data:/data \
redis/redis-stack
레디스 스택을 사용하는 경우에는 /etc/redis/redis.conf와 달리 바로 /redis-stack.conf 를 하면 된다.
레디스 볼륨에 저장되는 데이터
ubuntu:/var/lib/docker/volumes/redis-data/_data$ ls
appendonlydir dump.rdb
아까 위에서 redis-data 볼륨의 위치를 inspect 명령어로 확인한 것을 토대로 이동해봤다.
appendonlydir 디렉토리와 dump.rdb가 있다.
dump.rdb는 레디스가 동작 중 스냅샷 개념으로 현재 메모리 정보를 저장해두는 파일이다.
ubuntu:/var/lib/docker/volumes/redis-data/_data/appendonlydir$ ls
appendonly.aof.1.base.rdb appendonly.aof.1.incr.aof appendonly.aof.manifest
appendonlydir은 aof 백업 방식을 택할 때 디렉토리명 옵션 기본값으로, 이 안에 백업용 rdb, aof, manifest 파일이 저장된다.
ubuntu:/var/lib/docker/volumes/redis-data/_data/appendonlydir$ sudo cat appendonly.aof.manifest
file appendonly.aof.1.base.rdb seq 1 type b
file appendonly.aof.1.incr.aof seq 1 type i
appendonly.aof.manufest 파일에는 매번 백업 시마다 백업되는 .rdb, .aof 파일의 버전을 저장해둔다. 백업본 재작성마다 숫자가 올라간다.
ubuntu:/var/lib/docker/volumes/redis-data/_data/appendonlydir$ sudo cat appendonly.aof.1.incr.aof
*2
$6
SELECT
$1
0
*3
$3
set
$1
a
$1
b
*2
$6
SELECT
$1
0
*3
$3
set
$1
c
$1
d
.rdb는 바이너리파일이라 읽기도 어렵지만 .aof 파일은 repl로 저장이 되어 알아볼 수 있다.
만약 flushall 로 모든 데이터가 날아갔대도, 쓰기작업마다 순차적으로 기록되는 .aof 파일의 마지막에 있는 flushall 명령어를 지우고 레디스를 다시 실행하면 복구가 가능하다.
'TIL ✍️' 카테고리의 다른 글
24/08/08(목) 95번째 TIL : Spring Data Redis 및 Redis-cli 문자열 인코딩 방식 (2) | 2024.08.09 |
---|---|
24/08/07(수) 94번째 TIL : EurekaServerConfig 빈 중복 해결하기 (0) | 2024.08.07 |
24/08/05(월) 92번째 TIL : 레디스 인증 설정 (0) | 2024.08.05 |
24/08/02(금) 91번째 TIL : EC2 Ubuntu 포트포워딩 (0) | 2024.08.02 |
24/08/01(목) 90번째 TIL : AWS Amazon VPC CIDR 범위 (1) | 2024.08.01 |