참조 : redis의 rdb 

http://knight76.tistory.com/entry/redis-RDB



AOF 사용으로 변경하면(appendonly yes), 레디스가 변경 커맨드를  받을 때마다, AOF 파일에 커맨드를 추가(append)한다. 레디스에서 AOF를 사용하는 것으로 변경한 후, 레디스를 재시작하면, 레디스는 AOF의 나열된 모든 커맨드를 순서대로 실행하여 복구할 수 있다. AOF는 RDB 스냅샷의 대안이다.


RDB 파일은 바이너리 파일인 반면, AOF는 읽을 수 있는 로그 파일이며, 손상이 발생하면 식별이 어려운 점이 있다. AOF 파일을 에디터로 쉽게 열어볼 수도 있고, 내부의 구조를 이해할 수 있다. 


redis.conf를 수정해서 appendonly yes로 변경하고, redis서버를 재시작한다.



$ redis-cli -p 6379 set a 1

OK

$ redis-cli -p 6379 set b 2

OK

$ redis-cli -p 6379 get a

"1"

$ redis-cli -p 6379 get b

"2"

$ cat appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1

*3

$3

set

$1

b

$1

2



redis에 손상된 AOF 파일을 확인하고 쉽게 고칠 수 있는 redis-check-aof라는 툴이 있다. 

$ ls -al src/redis-check-aof

redis-check-aof


appendonly.aof 파일에서 다음 라인을 수정하고 redis-check-aof 툴을 사용한다.


$ vi appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1

*3

$3

set

$1

b

$1 --> $로 수정

2



파일을 수정후 체크하면 다음과 같이 not valid가 뜬다.


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

0x              49: Expected \r\n, got: 320d

AOF analyzed: size=76, ok_up_to=50, diff=26

AOF is not valid



수정을 하고 싶다면 다음과 같이 --fix 옵션을 추가한다.


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

0x              49: Expected \r\n, got: 320d

AOF analyzed: size=76, ok_up_to=50, diff=26

This will shrink the AOF from 76 bytes, with 26 bytes, to 50 bytes

Continue? [y/N]: y

Successfully truncated AOF




파일을 살펴보면, 문제가 된 커맨드는 aof 파일에서 삭제되었다.


$ cat appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1





redis-check-aof 툴의 단점은 성능이 떨어지고, 추가 디스크 공간이 필요하다.


AOF는 여러 옵션을 통해 자동으로 또는 BGREWRITEAOF 커맨드를 통해 수동으로 AOF의 좀 더 작은 버전으로 최적화될 수 있다. 다.


AOF 관련 설정이다.


  • appendonly: AOF를 사용(yes) 또는 사용 금지(no)를 설정한다. 디폴트는 no이다.
  • appendfilename: AOF 파일 이름이다.
  • appendfsync: 레디스는 주요 프로세스에서 fsync()를 수행하기 위해 백그라운드 쓰레드를 사용한다. 
    • no: fsync()를 실행하지 않는다.
    • always: 모든 쓰기 작업마다 fsync()를 실행한다. 
    • everysec: 매 초마다 fsync()를 실행한다.
  • no-appendfsync-on-rewrite: 사용 가능한 값은 yes와 no이다.  기본 값은 no이다. appendfsync 정책을 everysec 또는 always로 설정하고 백그라운드 저장 또는 AOF 로그를 저장하고 있는 상태에서, 레디스의 fsync() 시스템 호출이 길어진다면, 많은 디스크 I/O로 레디스가 블럭될 것이다
  • auto-aof-rewrite-percentage: 해당 옵션의 사용 가능한 값은 0에서 100까지의 값을 가진다. 기본 값은 100이다. AOF 크기가 명세한 퍼센트까지 도달하면, 암묵적으로 BGREWRITEAOF 커맨드를 실행하여, 자동으로 로그 파일을 rewrite한다. 
  • auto-aof-rewrite-min-size: 해당 옵션은 rewrite된 AOF의 최소 크기이다. 기본 값은 67,108,864 바이트이다. 명세한 auto-aof-rewrite-percentage 값을 초과하면, 명세한 최소 크기가 도달 할 때까지 AOF rewrite를 안하게 한다.
  • aof-load-truncated: 해당 옵션의 사용 가능한 값은 yes와 no이다. 크래쉬가 발생할 경우, AOF가 일부만 남을 수 있는데, 해당 옵션은 에러 시 시작 또는 종료시 레디스가 truncated AOF를 로드할 것인지 명세한다. 해당 옵션의 값이 yes이면, 레디스는 잘려진 파일(truncated file)을 로드하고 에러 메시지를 출력한다. 해당 옵션의 값이 no이면, 레디스는 에러로 종료할 것이고, 짤린 파일을 로드하지 않을 것이다.
  • dir: AOF(또는 RDB 파일)의 디렉토리 위치를 명세한다.



 

모든 커맨드를 실행해야 하는 AOF보다 RDB가 빠르다. 또한 레디스 설정에서 RDB와 AOF 둘 다 설정하면 AOF가 우선순위가 높다. 내구성을 완벽하게 지원해야 한다면, AOF와 RDB 둘 다 설정하는 것이 좋다. 



'Redis' 카테고리의 다른 글

[redis] 낙관적 잠금(optimistic lock)  (0) 2016.02.29
[redis] 3.0에 있는 redis cluster 실행해보기  (0) 2016.02.15
[redis] twemproxy 설치 / 예제  (0) 2016.02.10
[redis] RDB  (1) 2016.02.09
[펌] redis의 persistence에 대한 내용  (0) 2016.02.09
Posted by '김용환'
,