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

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

 

myoskin