반응형

 이번 챕터에서는 실제로 redis를 사용해서 영속성을 셋팅을 진행하도록 합니다. 

필요 사항

 필자의 윈도우 환경에서 docker를 사용하여 레디스를 구동하기 때문에 아래의 목록이 필요합니다.

  • window 10 머신
  • docker Desktop for Window

 자세한 설치방법은 블로그의 링크 글을참조해주세요

 

Docker에서 레디스 실행하기 

// redis 이미지 다운 받기
docker pull redis

// redis 컨테이너를 생성 및 실행합니다. 
docker run -p 6379:6379 -d -v C:\DockerShare\Redis\conf\redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

 docker가 설치된 환경에서 위의 명령어를 실행 시켜서 redis 이미지를 다운 받고 실행 시킬 수 있습니다. 

 첫번째 줄인 docker pull의 경우 저장소에서 이미지를 다운 받는 명령어입니다. 

 두번째 줄인 docker run의 경우 지정된 이미지를 새로운 컨테이너로 실행시키는 명령어입니다. 

  1.  -p 옵션( 호스트포트:컨테이너포트 )은 호스트의 포트와 컨테이너의 포트을 연결 시킵니다.
  2.  -d 옵션은 컨테이너를 백그라운드로 실행 시킵니다.
  3.  -v 옵션은 호스트의 파일과 컨테이너 파일과 연동합니다. 

 저의 경우에는 C:\DockerShare\Redis\conf 폴더에 redis.conf 파일을 다운받아서 셋팅하였고

 컨테이너의 /usr/local/etc/redis 폴더에 연동했습니다. 

레디스 conf 파일 설정하기 

conf파일 다운받기

 해당 경로에서 https://redis.io/topics/config 레디스 conf 파일을 받을 수 있습니다.

 설치 할 레디스 버전의 conf를 다운 받아서 설정합니다. 저의 경우에는 6.0버전을 다운 받았습니다. 

영속성 설정 방법

 conf파일에서 AOF 영속성 설정과 RDB 영속성을 설정합니다. 

rdb 설정

 테스트를 위해서 1초안에 최소한 1번의 변경이 있다면 rdb를 저장하도록 설정하였습니다. 

aof설정

 aof가 기록되도록 appendonly 옵션을 yes로 변경합니다. 

aof fsync 설정

 appendfsync 설정은 기본 설정인 매초마다 fsync 동작하도록 everysec로 설정합니다. 

 AOF와 RDB가 쌓이도록 설정이 완료 되었습니다.

외부에서 접속 할 수 있도록 설정

 레디스를 외부에서 접속 할 수 있도록 설정하기 위해서 bind를 찾아서 127.0.0.1로 되어 있는 부분을 

 0.0.0.0으로 변경해줍니다. 

 만약에 비밀번호 설정이 필요하다면 requirepass를 찾아서 설정해줍니다. 

 

tty를 통한 레디스 컨테이너에 접속 방법

 테스트를 위한 설정이 완료된 레디스를 실행 한 다음 해당 컨테이너에 접속하는 방법을 설명합니다. 

docker ps

실행 중인 컨테이너

 docker ps 명령어를 통해서 수행 중인 컨테이너의 정보를 확인 할 수 있습니다. 

docker exec -it myredis /bin/bash
또는 
docker exec -it 56380f82fa44 /bin/bash

 실행 중인 레디스의 컨테이너에 접속하려면 docker exec 명령어를 통해서 컨테이너의 ID나 이름을 입력한후 

 /bin/bash를 수행해서 접속 할 수 있습니다. 

 접속을 하면 /data 폴더로 설정되어 있는데 이곳에 appendonly.aof 파일이 생성되어 있는 것을 확인 할 수 있습니다.

 redis-cli을 사용해서 key 변경 작업 요청이 들어오면 rdb파일이 생성되는 것을 확인 할 수 있습니다. 

aof 파일과 rdb파일

 

레디스 클라이언트를 통해서 레디스에 접속 방법

 이제 수행중인 레디스 서버에 레디스 클라이언트를 통해서 접속하는 방법을 설명합니다. 

docker run --network host -it --rm redis redis-cli -p 6379

 docker를 통해서 redis 이미지에서 레디스 클라이언트를 수행해서 접속합니다. 

 --network는 컨테이너에 접속에 사용할 네트워크를 지정합니다. docker network ls를 통해서 확인 가능합니다. 

 --it를 통해서 pseudo-tty로 접속해서 실행합니다. 

 --rm 컨테이너가 종료되면 자동으로 삭제합니다. 

 

테스트 실행

Key 변경 명령어 입력했을 때 영속성 파일의 변화

 레디스 클라이언트를 통해서 아래의 명령을 수행합니다. 

// money에 10000의 값을 입력합니다. 
set money 10000

 AOF 파일과 RDB 파일이 변경된 것을 확인 할 수 있습니다.

 RDB는 사람이 명시적으로 확인 할 수 없기 때문에 appendonly.aof 파일이 어떻게 쌓였는지만 확인 해봅니다.

AOF파일기록

 레디스의 입력된 명령어의 기록이 프로토콜 형태로 남아 있는 것을 확인 할 수 있습니다.

 2개의 명령어가 기록되어 있는 것을 확인 할 수 있습니다.

// 첫번째 명령어
SELECT 0
// 두번째 명령어
SET money 10000

간단한 RESP 프로토콜에 대한 설명입니다.

  • 대량 문자열의 경우 첫바이트가 "$" 입니다.
  • 배열의 경우 첫바이트가 "*" 입니다.
  • 정수의 경우 첫바이트가 ":" 입니다.
  • 에러의 경우 첫바이트가 "-" 입니다.
  • 간단한 문자열의 경우 첫바이트가 "+" 입니다.

 레디스 프로토콜에 자세한 내용을 확인 하시려면 링크 를 참조 해 주세요

하나의 Key에 여러개의 변경 명령어 입력시 영속성 파일의 변화

// 해당 명령을 10회 실행합니다. 
incr money

set money 10110

 위의 예제처럼 이제 money 키에 다양한 변경 명령어를 입력합니다. 

money에 하나의 set 명령만 수행되었을 때

 

money에 여러개의 변경 명령이 수행된 경우

 이때 AOF와 RDB 파일의 크기 변화를 확인해보면 RDB는 크기의 변화가 없고 AOF파일은 크기가 증가한 것을 

 확인 할 수 있습니다.

 이것으로 확인 할 수 있는건 RDB는 해당 키의 최종 변화 상태만을 저장하고 AOF는 키들의 모든 변화에 대한 기록을

 저장한다는 것을 확인 할 수 있습니다. 

cat appendonly.aof

  해당 명령어를 수행해보면 지금까지 입력한 키 변경에 대한 모든 명령어를 레디스의 프로토콜을 통해서

 기록되는 것을 확인 할 수 있습니다. 

cat dump.rdb

 해당 명령어를 수행해보면 rdb파일은 위의 그림처럼 알수 없는 값들로 표현되는 것을 확인 할 수 있습니다. 

 

AOF의 rewrite 작업 테스트 

 AOF파일의 경우 KEY들에 대한 변동 사항을 모두 기록하기 때문에 매우 커질수 있습니다. 

// 레디스 클라이언트를 통해서 money 키의 값을 10만회 증가 시킵니다.
/usr/local/bin/redis-cli -r 100000 incr money

10만회 증가시켰을 경우 aof파일의 크기

 예를들어 money 키의 값을 10만회 증가시켜보면 rdb에 비해서 엄청나게 크게 증가된 aof파일을 볼 수 있습니다. 

 실제로 증가한 AOF파일이 표현하는 값은 money라는 키의 값 하나만 저장되어 있을 뿐입니다. 

 라이브 서비스 중에 이렇게 AOF파일이 무한히 커진다면 서비스에 문제가 될 수 있기 때문에

 레디스는 rewrite 기능을 제공합니다.

// 백그라운드로 REWRITE를 AOF파일에 실행하는 명령어
BGREWRITEAOF

 위의 명령을 레디스에 전송하면 명시적으로 REWRITE를 실행합니다. 

redis-cli rewrite 수행

 그러면 레디스는 fork를 통해서 백그라운드로 rewrite를 수행합니다. 

rewrite를 수행후

 rewrite를 수행하고 나면 RDB파일과 동일한 사이즈로 변경되고 cat으로 AOF파일을 확인해보면 

 RDB파일 구조와 비슷하게 변경됩니다.

 그렇다면 이 상태에서 추가적으로 키 변경 명령을 입력하면 어떻게 될까요?

 incr 명령을 수행 해 보면 해당 명령이 그 뒤에 순차적으로 RESP 프로토콜 형태로 쌓이는 것을 확인 할 수 있습니다. 

rewrite후 incr 명령 수행

 

명시적인 명령뿐만 아니라 conf파일 설정을 통해서 자동으로 AOF파일을 rewrite 되도록 설정할 수 있습니다. 

자동 rewrite 설정 

설정값 기  능
auto-aof-rewrite-min-size 최소한 설정된 값이상으로 커져야지 자동 rewrite를 수행합니다.
auto-aof-rewrite-percentage 레디스는 가장 마지막에 rewrite를 수행한 AOF파일의 크기를 저장하고 
그 크기를 현재의 AOF파일 크기와 비교해서 auto-aof-rewrite-percentage로 
지정된 percentage 만큼 증가하면 자동으로 rewrite를 수행합니다. 

 예제의 그림파일에서는 자동 AOF파일의 크기가 최소한 64MB 이상일 때만 수행됩니다. 

 rewrite가 수행되었다면 이전의 파일보다 100% 증가 한 경우 rewrite가 수행됩니다.(이때도 최소 크기보다 크다면)

 auto-aof-rewrite-percentage을 0으로 지정하면 자동 다시 쓰기가 비활성화 됩니다. 

반응형

'NOSQL > Redis' 카테고리의 다른 글

[Redis] Redis Replication(복제)  (0) 2020.06.16
[Redis] Redis Persistence(영속성)  (0) 2020.06.04
[Redis] Window 환경에서 레디스 구성하기  (0) 2020.03.28

+ Recent posts