본문 바로가기
프로젝트 기록/기타

[Redis AOF] AOF 설정한 Redis Docker Container 실행하기

by clean01 2024. 12. 10.

Redis는 아무 설정을 하지 않으면 RDB 방식을 따라 데이터가 디스크로 백업된다.

 

레디스의 데이터 백업 방식에 대한 내용은 아래 포스팅을 참고해주세요.

https://onfonf.tistory.com/108

 

[Redis] Redis 데이터의 영구 저장(RDB, AOF)

Redis PersistencyRedis는 인메모리 DB이지만, 데이터를 디스크에 영구 저장 할 수 있는 특징이 있다.그래서 Redis가 restart되더라도 디스크에 저장해놓은 데이터를 다시 읽어서 메모리에 로딩하기 때문

onfonf.tistory.com

 

그러면 AOF(Append Only File) 방식으로 데이터를 백업하려면 어떻게 해야할까?

이 글은 Dockerfile을 만들어서 AOF 방식으로 데이터를 백업하는 redis 컨테이너를 띄우는 과정을 담은 포스팅이다.

 

Dockerfile, docker-compose.yml 파일 작성

우선 chatgpt를 이용해서 Dockerfile과 이를 편하게 실행하기 위해 docker-compose.yml 파일을 작성해봤다.

 

 

Dockerfile

# Base image
FROM redis:latest

# Copy custom Redis configuration
COPY redis.conf /usr/local/etc/redis/redis.conf

# Command to run Redis with the custom configuration
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

 

AOF를 설정해주기 위한 redis.conf는 아래와 같다.

 

redis.conf

appendonly yes
appendfsync everysec

 

 

docker-compose.yml

version: '3.9'

services:
  redis:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data # Persistent data storage
    restart: always

volumes:
  redis-data:

 

Dockerfile을 빌드해서 컨테이너로 실행하고, redis의 볼륨을 컨테이너 내부의 /data로 잡아주는 yml 파일이다.

 

container 실행

 

위와 같이 Dockerfile, docker-compose.yml, redis.conf 세 파일을 같은 경로에 넣어주고 docker-compose up -d 명령어로 컨테이너를 실행해주었다.

 

컨테이너 내부로 접속

 

Docker Redis의 공식 이미지는 기본적으로 /data 디렉토리를 데이터 디렉토리로 사용한다고 한다.

컨테이너 내부로 접속하면 경로도 기본적으로 /data 경로로 이동되어 있다.

 

그 안에는 "appendonlydir"라는 디렉토리가 생성돼있었다.

 

그리고 그 안에는 

- appendonly.aof.1.base.rdb

- appendonly.aof.1.incr.aof

- appendonly.aof.manifest

 

이렇게 3개의 파일이 생성돼있었는데, 로그는 appendonly.aof.1.incr.aof 파일에 적히는 것 같다..

그런데 원래는 aof 설정을 하면 /data 디렉토리에 appendonly.aof 이렇게 하나의 로그파일이 생길 것이라고 생각했는데 왜 이런 구조로 생겼는지는 모르겠다...

고 생각했는데 공식 문서에 그 정답이 있었다.

Redis 7.0.0 버전부터는 AOF 파일이 한 디렉토리에 안에 여러 파일로 분할되어 저장되는 것 같다.

이 파일들을 다른 곳에 백업해두면 나중에 재해복구가 가능한데, 이때는 AOF 재작성을 비활성화 해야한다는 것도 알게되었다.

 

디스크에 제대로 저장되는지 확인

테스트를 위해서 "test:1"이라는 키값으로 데이터를 하나 저장한 뒤

 

컨테이너를 restart 시켜봤다.

컨테이너를 restart 시켜도 값이 제대로 남아 있는 것을 확인할 수 있었다.

 

이번엔 "test:2"라는 키값을 하나 더 추가하고, rm -f 명령어로 컨테이너를 강제로 지운 뒤 다시 실행시켜봤다.

 

 

실행 후에 appendonly.aof.1.incr.aof 파일을 확인하면 set 명령어에 대한 로그도 잘 적혀있고,

값도 유실되지 않은 것을 확인할 수 있었다.

 

AOF 방식으로 백업하는 Redis Container를 실행해보았는데, 레디스가 갑자기 종료되는 상황을 대비해서 이전 자료를 백업하려면 이 파일을 어디가 백업하는 쉘 스크립트를 짜야되지 않나..? 싶다,,,

Reference

https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

 

Redis persistence

How Redis writes data to disk

redis.io

 

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%81%EA%B5%AC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%98%81%EC%86%8D%EC%84%B1

 

[REDIS] 📚 캐시 데이터 영구 저장하는 방법 (RDB / AOF)

Redis 데이터의 영속성 (Redis Persistence) Redis는 In-memory DB 임에도 불구하고, 메모리 데이터를 disk에 저장할 수 있는 특징이 있다. 그래서 서버가 꺼진 후 restart되더라도, disk에 저장해놓은 데이타를

inpa.tistory.com