본문 바로가기
Big Data

[Redis] BGREWRITEAOF

by 유주원 2012. 10. 22.

AOF 동작을 실행한다. 지속성으로 파일에 로그를 남기는 방식. redis를 다시 시작할 때 남겨진 로그를 다시 구동시킴으로써 최신의 데이터를 유지할 수 있다.

일단 AOF라는 것이 무엇인지 알기 위해선 Redis 저장 방식을 알아야 한다.

Redis Persistence
- Redis는 데이터 Persistence를 제공하기 위해 RDB와 AOF 방식을 사용한다.
- RDB는 dateset을 특정 시점에서 저장하도록 시행하는 방식이며, AOF는 서버로부터 계속해서 log를 남기고, 서버가 시작할 시, log에 남긴 명령어를 다시 시작하는 방법이다. 로그에 남겨진 명령어는 Redis Protocol과 동일한 포멧으로 남겨진다.
- RDB는 설정 파일에서 SNAPSHOTTING 부분과 관련이 있으며, 저장 파일은 .rdb 형식이다. 또한 command 중 bgsave나 save를 실행하여 파일을 쓰게 할 수 있다.
- AOF는 설정 파일에서 APPEND ONLY MODE 부분과 관련이 있으며, 저장 파일은 .aof 형식이다. 또한 command 중 BGREWRITEAOF를 실행하면 파일을 쓰게 할 수 있다.

RDB의 장점
- RDB는 백업하고 복원하는데 아주 쉬운 구조를 가지고 있다. 예를 들어 24시간 동안 매 시간마다 RDB를 남기거나, 30일 동안 일 단위로 RDB로 남길 수 있다. 이러한 점은 쉽게 다양한 데이터를 복원할 수 있다는 장점이 있다.
- RDB는 즉시 디스크 IO 혹은 그와 비슷한 작업을 처리하지 않기 때문에 Redis 성능을 극대화할 수 
있다.

- RDB는 AOF와 비교하여 재시작시 더 빠르다. (AOF는 재시작시 로그 명령어를 따로 처리해야 하기 
때문에 상대적으로 느림)

RDB의 단점
- 백업이 일어나는 시점 이전에 서버가 종료될 시 데이터가 손실된다.
- 백업 시 자식 프로세스를 생성하기 위하여 fork()를 쓰는데, 데이터가 클 시 cpu 부하가 많이 발생할 수 있다. AOF 역시 fork()를 필요로 하지만 얼마나 종종 log를 남기는가에 따라 조율이 가능하다.

RDB 처리 방법
- Redis는 fork()로 자식 프로세스를 생성한다.
- 자식 프로세스는 임시 rdb 파일에 data를 쓴다.
- 자식 프로세스가 쓰기를 마치면, 임시 rdb 파일로 옛날 rdb 파일을 덮어 쓴다.

AOF 의 장점
- 정책에 따라 변경될 수 있지만 기본적으로 매 초마다 수행된다면, 서버가 다운되더라도 데이터 손실에 부담이 적다.
- AOF log 데이터가 disk-full 또는 기타 다른 이유로 반밖에 쓰여지지 않았다 하더라도 redis-check-aof tool이 쉽게 복원시켜 줄 것이다.

AOF 의 단점
- RDB와 비교하여 동일한 데이터 셋이라 하더라도 훨씬 파일 사이즈가 크다.
- RDB보다 느릴 수 있다.

그럼 어떻게 사용해야 할까???
- 만약 많은 양의 데이터를 처리해야 하지만, 몇 분 정도의 데이터 손실을 이해할 수 있다면, RDB를 쓰는 것을 장려한다.
- 많은 사람들이 AOF를 단독으로 사용하는데, 이는 장려하지 않는다.

Snapshotting
- 기본적으로 Redis는 dump.rdb에 snapshot으로 저장을 한다. 아래 예제 configuration을 통해 저장하는 방법에 대해 기술한 것이다.

save 60 1000                 // 60초 동안 1000건 이상의 keys가 변경되었다면 Shapshotting 해라

Append-only file
- AOF 설정을 사용하기 위한 방법을 나타낸다.

appendonly yes   // yes는 AOF를 사용한다는 의미임.

- apendfsync 옵션으로 always나 everysec를 사용 중인 상태에서 "Log rewriting"이나 "bgsave"를 하게 되면 서로 disk IO에 방해가 될 수 있다.
- 이를 방지하기 위한 옵션이 no-appendfsync-on-rewrite인데 yes로 설정하면 "Log rewriting"이나 "bgsave"를 할 경우 aof 파일 쓰기를 하지 않는다.