[REDIS] Redis Persistence
2018-12-10 | REDIS Redis Persistence AOF RDBRedis Persistence
데이터를 메인 메모리(RAM)에 보관하는 레디스는 데이터의 안전한 보관과 백업을 위해 디스크 쓰기 방식을 제공한다 레디스에서는 두가지 디스크 쓰기 방식을 지원한다
- RDB(snapshot)
- 파일은 특정한 간격마다 메모리에 있는 레디스 데이터 전체를 디스크에 쓴다
- 특정 시점 마다 백업을 받을 때 사용
- 바이너리 파일
- AOF(appendonlyfile)
- 명령이 실행될때 마다 기록되는 파일
- 텍스트파일
AOF
- 입력/수정/삭제 명령이 실행될 때 마다 기록됨 (조회 명령은 기록되지 X)
- text파일이므로 편집이 가능하다.
- rewrite 기능이 있음
[복구시나리오] 실수로 FLUSHALL
명령으로 메모리에 있는 데이터 전체를 날렸을 경우
즉시 레디스 서버를 shutdown하고, appendonly.aof 파일에서
FLUSHALL
명령을 제거 한 후 레디스를 다시 시작하면 데이터 손실없이 DB를 살릴 수 있다
appendonly.aof 파일 형식
- AOF는 명령 실행 순서대로 텍스트로 쓰여진다. 편집 가능하다.
*
는 명령 시작을 나타낸다. 숫자는 명령과 인수의 개수이다.$
는 명령이나 인수, 데이터의 바이트 수이다. 한글은 UTF8로 했을 경우 한 글자에 3바이트이다.
*3
$3
SET
$8
user_aaa
$7
Charlie
*2
$4
INCR
$5
del-a
무슨 명령어를 쳤는지 추적해보자.
SET user_aaa Charlie
INCR del-a
레디스 설정 이용한 방식
AOF 파일 사용여부
appendonly yes
- yes : 레디스 서버 시작 시 이 값이 yes 일때만 AOF 파일을 읽어들입니다.
- no : AOF 파일이 있어도 읽어들이지 않습니다.
AOF 파일명 지정
appendfilename "appendonly.aof"
디렉토리는 dir
로 지정된 워킹디렉토리를 따름
AOF에 기록되는 시점 지정
appendfsync everysec
- always : 명령 실행 시 마다 AOF에 기록. 데이터 유실은 거의 없지만 성능이 매우 떨어짐.
- everysec : 1초마다 AOF에 기록. 권장
- no : AOF에 기록하는 시점을 OS가 정함(일반적으로 리눅스의 디스크 기록 간격은 30초). 데이터가 유실될 수 있음..
AOF rewrite 설정
auto-aof-rewrite-percentage 100
- AOF 파일 사이즈가 특정 퍼센트 이상 커지면 rewrite 한다.
- 비교 기준은 레디스 서버가 시작할 시점의 AOF파일 사이즈이다.
- 0으로 설정하면 rewrite를 하지 않는다
auto-aof-rewrite-min-size 64mb
- AOF 파일 사이즈가 64mb 이하면 rewrite를 하지 않습니다.
- 파일이 작을때 rewrite가 자주 발생하는 것을 막아줍니다.
REDIS-CLI을 이용한 방식
rewrite 하기
AOF Rewrite는 BGREWRITEAOF 명령으로 명시적으로도 수행시킬 수 있다
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
RDB
- RDB는 특정 시점의 메모리에 있는 데이터 전체를 바이너리 파일로 저장하는 것이다.
- AOF 파일보다 사이즈가 작다. 따라서 로딩 속도가 AOF 보다 빠르다.
레디스 설정 이용한 방식
저장 시점 정하기
save 900 1 #900초(15분) 동안 1번 이상 key 변경이 발생하면 저장
save 300 10 #300초(5분) 동안 10번 이상 key 변경이 발생하면 저장
save 60 10000 #60초(1분) 동안 10000번 이상 key 변경이 발생하면 저장
- SAVE 조건은 여러 개를 지정할 수 있고, 모두 or 조건이다. 즉 어느 것 하나라도 만족하면 저장한다.
- RDB를 저장하지 않으려면 redis.conf 에서 SAVE를 모두 주석 처리하면 된다
RDB 파일명 지정
dbfilename dump.rdb
디렉토리는 dir
로 지정된 워킹디렉토리를 따름
RDB 저장 실패시 데이터 읽기 여부
RDB 파일 저장이 실패했을 경우 데이터를 받아 들일지 말지를 정하는 파라미터이다
stop-writes-on-bgsave-error yes
- 이 값이 yes 일때, 레디스는 RDB 파일을 디스크에 저장하다 실패하면, 모든 쓰기 요청을 거부한다. 쓰기에 문제가 발생했으니, 빨리 조치를 취하라는 의미다. default는 yes이다.
- 이 값을 no 로 설정하면, 디스크 저장에 실패하더라도, 레디스는 쓰기 요청을 포함한 모든 동작을 정상적으로 처리한다.
- 디스크 쓰기에 실패하는 경우는 여유 공간이 부족하거나, 권한(permission) 부족, 디스크 물리적 오류 등이 있을 수 있다.
- 이 파라미터는 save 이벤트에만 해당한다. BGSAVE 명령을 직접 입력했을 경우에는 해당하지 않는다.
REDIS-CLI을 이용한 방식
RDB 파일 생성
명령으로도 RDB 파일을 생성할 수 있다. BGSAVE 또는 SAVE 이다.
- SAVE
- BSAVE
127.0.0.1:6379> BGSAVE
Background saving started
파일 쓰기 작업은 Child process가 생성되어 background로 실행되므로 쓰기 작업 중에도 레디스 서버는 클라이언트의 명령을 정상적으로 처리할 수 있다
DB 복구
레디스 서버가 시작될 때 데이터 파일을 읽는다.
어떤 데이터 파일을 읽을지는 레디스 설정파일의 appendonlyfile
설정을 따른다
appendonlyfile yes
: aof 파일을 읽음appendonlyfile no
: rdb 파일을 읽음
어느 것을 선택할까
==> AOF(Append Only File)
AOF를 기본으로 하고, RDB를 Option으로 한다. AOF 시간 설정은 everysec로 하고, AOF Rewrite를 사용한다. AOF를 사용해도 성능에 거의 영향을 미치지 않습니다.
reference
http://redisgate.kr/redis/configuration/persistence.php