Redis

반응형

docker-compose with Redis Container 환경 구성

들어가며,
회사에서 업무로 Redis를 Global Cache 용도로 사용 하고 있습니다. Cache 전략은 다양한 패턴이 있는데, 그 중 현재는 Cache Aside 전략으로 DB 조회 전 Cache에 동일한 Key에 해당하는 데이터가 있는지 조회 후 결과를 리턴해주는 용도로 사용 중입니다. 가장 일반적인 Cache 용도라고 보실 수 있습니다. Cache 전략에 관한 자세한 내용은 다음에 한번 다뤄 보도록 하고, 오늘은 docker-compose를 활용하여 로컬 환경에 Redis Container를 구성하는 방법에 대한 실습 과정을 공유해보겠습니다.

docker-compose file 구성

Redis docker image 6.2.8
Redis Cluster 구성
redis.conf 설정

Container properties를 먼저 보겠습니다.

  • 각 클러스터와의 연결을 위해 ports 추가,
  • Redis 환경 구성을 위해 설정한 redis.conf 파일 경로를 volumes에 추가.
  • 컨테이너 기동시 설정된 conf 파일을 로드하기 위한 Command 명령어 추가.

redis.conf 파일은 redis.io 사이트에서 설치하시는 image 버전에 맞게 다운로드 받으실 수 있습니다.
다운 받은 conf 파일에 기본적으로 port 설정과 보안, 클러스터 그리고 백업 정책 등을 아래와 같이 변경하였습니다. 이 부분에서 삽질을 많이 했네요ㅜㅜ
보안 설정의 경우 추후 Spring Boot application과 연동을 위해서는 반드시 적절한 정책으로 설정을 하셔야 합니다. Default로 설정할 경우 Redis Container는 정상적으로 생성되고 redis-cli Command를 사용하여 Redis command 테스트는 가능하지만 실제 Spring Boot application과 연동하여 개발 용도로는 사용할 수 없기 때문입니다.. 주저리주저리..했네요

redis-master:
      image: redis:6.2.8
      container_name: redis-6379
      restart: always
      ports:
        - 6379:6379
        - 6380:6380
        - 6381:6381
      volumes:
        - ./data/redis/6379:/data
        - ./data/redis.conf:/usr/local/etc/redis/redis.conf
      command: redis-server /usr/local/etc/redis/redis.conf

Redis Container 구성을 위해 yml 파일에 설정한 properties 입니다.
아래 설정한 내용은 Github에 프로젝트로 생성하였으니 Clone 하셔서 활용하셔도 좋을 거 같습니다.

version: '3'

services:
    redis-master:
      image: redis:6.2.8
      container_name: redis-6379
      restart: always
      ports:
        - 6379:6379
        - 6380:6380
        - 6381:6381
      volumes:
        - ./data/redis/6379:/data
        - ./data/redis.conf:/usr/local/etc/redis/redis.conf
      command: redis-server /usr/local/etc/redis/redis.conf

    redis-slave1:
      image: redis:6.2.8
      container_name: redis-6380
      network_mode: "service:redis-master"
      restart: always
      volumes:
        - ./data/redis/6380:/data
        - ./data/redis6380.conf:/usr/local/etc/redis/redis.conf
      command: redis-server /usr/local/etc/redis/redis.conf

    redis-slave2:
      image: redis:6.2.8
      container_name: redis-6381
      network_mode: "service:redis-master"
      restart: always
      volumes:
        - ./data/redis/6381:/data
        - ./data/redis6381.conf:/usr/local/etc/redis/redis.conf
      command: redis-server /usr/local/etc/redis/redis.conf

    redis-cluster-entry:
      image: redis:6.2.8
      container_name: redis-cluster-entry
      network_mode: "service:redis-master"
      command: redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 --cluster-yes
      depends_on:
        - redis-master
        - redis-slave1
        - redis-slave2

update 중....

반응형
반응형

AOF File 손상에 대한 오류 해결 방법

The Problem

Redis를 docker-compose를 통해 Container 구성 후 정상적으로 동작했었는데, 재부팅 등.. Container가 정상적으로 종료되지 않는 상황에서 간혹 위와 같은 오류에 직면하게 되었다.

먼저 AOF 란? 무엇이고 왜 Bad file format....reading 이 발생했는지 그 원인을 알아보자.
현재 내가 설정한 redis.conf 구성 환경은 다음과 같다.

appendonly yes
appendfilename "appendonly.aof"
....생략

Redis는 데이터를 메모리에 저장하는 임시 저장소 구조로 Redis Container가 Stop or Restart 되면 저장된 데이터는 휘발된다. 따라서 데이터 손실을 해결하기 위해 내부적으로 백업 메커니즘을 제공하는데 크게 RDB와 Append-only File(AOF)을 제공한다. 두 가지 방식을 동시에 ON 할 수도 있는데 나의 경우도 위와 같이 redis.conf에 appenonly를 활성화 해놓은 상태다. AOF의 경우 실시간으로 요청받는 Command를 파일에 지속적으로 추가하는 방식으로, 간혹 Redis Container가 비정상으로 종료되어 파일에 기록이 잘 못되거나 손상될 경우 Redis 재기동시 백업 데이터를 복구하면서 Bad file format reading the append only file 예외가 발생할 수 있습니다.
Redis는 손상된 AOF file을 확인하고 수정할 수 있는 redis-check-aof라는 툴을 제공합니다.

먼저 아래와 같이 docker-container에 접속해서 appendonly.aof 파일을 확인해 봅니다.

docker container 접속

$ docker exec -it redis-6397 bash

appendonly.aof 파일 내용 확인 및 --fix 옵션 사용

docker volume에서 지정한 data 디렉터리로 이동 후 --fix 옵션을 지정하여 명령어를 실행하면, 아래와 같이 prompt 모드가 노출됩니다. 그리고 수정을 위해 y를 선택하면 정상적으로 successfully truncated 메시지가 노출되면 처리가 완료된 것을 확인할 수 있고,
다시 cat 명령어로 appendonly file을 열어보면 위 내용에서 1672910415643 이후 라인이 삭제된 것을 볼 수 있습니다.

상황에 따라 수정할 라인을 알 수 있을 경우 vi 에디터로 직접 수정 후 file의 valid 상태를 점검하는 용도로 사용하실 수 있습니다. redis-check-aof 툴의 경우 성능상의 단점과 디스크 공간을 필요로 한다고 합니다. 이 부분은 조금 더 상세하게 확인이 필요하고 실제 production 환경에서 사용 시 반드시 체크 후 진행이 필요합니다.

$ /src/redis-check-aof appendonly.aof

위 과정을 수행 후 docker-compose up을 수행하면 아래와 같이 정상적으로 Redis 컨테이너가 기동 됩니다.

오늘은 Redis AOF file 손상 시 복구 및 해결 방법에 대하여 실습해 봤습니다.

[참고자료]

[Sysadmin Blog](https://sysadminblog.online/general/docker-redis-bad-file-format-reading-the-append-only-file/)
[redis.io](https://redis.io/docs/management/persistence/#what-should-i-do-if-my-aof-gets-corrupted)

반응형

+ Recent posts

반응형