[redis] RDB

Redis 2016. 2. 9. 09:55



RDB는 특정 시점에 저장된 레디스 인스턴스 바이너리이다. RDB 파일의 내부 구조는 레디스 메모리(in-memory) 구조와 매우 비슷하다. RDB 압축 파일을 만들기 위해 LZF 압축을 사용할 수 있다. LZF 압축은 압축 시 아주 작은 메모리 요구사항을 가진 빠른 압축 알고리즘이다. 따라서, 레디스와 효율적으로 동작한다. 


특정 시간, 즉 매 시간, 매 일, 매 주, 매 달마다 RDB 파일을 저장할 수 있기 때문에, RDB의 백업과 복구를 할 수 있다. 


SAVE 커맨드는 RDB 파일을 즉시 생성하지만, 스냅샷(snapshot) 과정에서 레디스 서버를 블럭시키기 때문에 조심히 써야 한다. 대신 BGSAVE 커맨드(백그라운드 저장)를 사용해야 한다. BGSAVE 커맨드는 SAVE 커맨드의 기능과 동일하지만, 자식 프로세스로 실행하기 때문에 레디스를 블럭시키지 않는다.


백그라운드 저장 시 성능 저하를 피하기 위해 redis-server는  자식 프로세스(fork)를 생성한다. 그래서, redis-server 프로세스는 어떠한 디스크 I/O 작업을 수행하지 않는다. redis-server가 쓰기를 받고 있다면, 자식 프로세스는 변경된 메모리 페이지를 복사한다. 복사된 메모리로 인해 총 사용 메모리가 증가될 수 있다(레디스는 copy-on-write를 사용한다.)


http://knight76.tistory.com/entry/%ED%8E%8C-copy-on-write-%EB%B0%9C%EB%B2%88%EC%97%AD


기본 레디스 설정 파일은 레디스 소스 코드 디렉토리에 있으며, 백그라운드 저장을 수행하는 save 지시자를 통해 디스크에 데이터를 저장할 수 있는 3 가지 스냅샷 규칙을 가진다.


여전히 최신 버전인 3.0.2에서도 snashotting 설정은 다음과 같이 존재한다. 


################################ SNAPSHOTTING  ################################

#

# Save the DB on disk:

#

#   save <seconds> <changes>

#

#   Will save the DB if both the given number of seconds and the given

#   number of write operations against the DB occurred.

#

#   In the example below the behaviour will be to save:

#   after 900 sec (15 min) if at least 1 key changed

#   after 300 sec (5 min) if at least 10 keys changed

#   after 60 sec if at least 10000 keys changed

#

#   Note: you can disable saving completely by commenting out all "save" lines.

#

#   It is also possible to remove all the previously configured save

#   points by adding a save directive with a single empty string argument

#   like in the following example:

#

#   save ""


save 900 1

save 300 10

save 60 10000



# The filename where to dump the DB

dbfilename dump.rdb



첫 번째 초(second) 안에 쓰기 작업한 Y 개(amount)가 레디스 인스턴스에서 발생하면, .rdb 파일을 생성한다. 

- save  900 1 - 적어도 하나의 쓰기 작업이 실행되면, 매 900 초마다 디스크에 .rdb 파일에 저장한다.

save  300 10 - 적어도 10 개의 쓰기 작업이 실행되면, 매 300 초마다 디스크에 .rdb 파일을 저장한다.

- save 60 10000 0 적어도 10,000 개의 쓰기 작업이 실행되면, 매 60 초마다 디스크에 .rdb 파일을 저장한다.


스냅샷의 개별 실행 간격이 30 초 미만이 되지 않도록 하는 것을 save 지시자를 사용 할 것을 추천한다. 이 이유는 리눅스 디폴트 설정과 관련되어 있다.


http://knight76.tistory.com/entry/%ED%8E%8C-redis%EC%9D%98-persistence%EC%97%90-%EB%8C%80%ED%95%9C-%EB%82%B4%EC%9A%A9


RDB 파일 이름은 dbfilename 지시자 기반이며, 기본 설정은 dump.rdb이다.



스냅샷 설정을 하지 않으면 디스크에 전혀 저장하지 않는다는 것을 의미한다. 

하지만, 디폴트 설정이 스냅샷 설정(save)로 되어 있어서 RDB 저장을 한다. redis 클라이언트로 본 설정은 다음과 같다.


127.0.0.1:6379> config get save

1) "save"

2) "3600 1 300 100 60 10000"



스냅샷 설정을 하지 않으려면, redis.conf 파일에 모든 save 지시자를 삭제하거나 주석을 달고, 레디스 서버를 재시작해야 한다. 커맨드 라인 옵션 또는 CONFIG SET 커맨드로 스냅샷을 하지 않도록 설정할 수 있다.


127.0.0.1:6379> config set save ""
OK
127.0.0.1:6379> config get save
1) "save"
2) ""




주요 레디스 프로세스가 특정 이유로 멈추는 일이 발생하면, 데이터베이스에 최근에 작성된 데이터를 잃어버릴 수 있다. 즉 개런티를 하지 않는다.

http://oldblog.antirez.com/post/redis-persistence-demystified.html


RDB는 스냅샷을 생성하는 시간마다 레디스 주요 프로세스는 디스크에 데이터를 저장하기 위해 자식 프로세스를 생성하기 위해 fork()를 실행한다. 밀리세컨드(ms) 또는 몇 초(second) 동안 레디스 인스턴스가 서비스 중인 클라이언트를 멈추게 할 수 있다.


RDB 관련 지시자에 대한 설명이다.


- stop-writes-on-bgsave-error: 해당 옵션의 사용 가능한 값은 yes나 no이다. 마지막 백그라운드 저장이 실패되면, 해당 옵션은 레디스가 쓰기 작업을 받는 것에 대해 멈출 지 결정한다. 백그라운드 저장이 성공한 후에, 레디스는 다시 쓰기 작업을 받는다.

- rdbcompression: 해당 옵션의 사용 가능한 값은 yes나 no이다. 해당 옵션을 yes로 설정하면, 레디스는 .rdb 파일에 대해 LZF 압축을 사용한다. 기본 값은 yes이다.

- rdbchecksum: 해당 옵션의 사용 가능한 값은 yes나 no이다. yes라 설정하면 레디스는 .rdb 파일의 마지막에 체크섬(checksum)을 저장하고, .rdb 파일을 로딩하기 전에 체크섬을 수행한다. RDB 체크섬이 .rdb 파일에 저장된 체크섬과 일치하지 않으면, 레디스를 시작하지 않는다. 기본 값은 yes이다.

- dbfilename: 해당 옵션은 .rdb파일을 명세한다. 기본값은 dump.rdb이다.

- save : 해당 옵션은 초와 변경 수 기반으로 스냅샷 주기를 설정한다. 해당 옵션을 여러 번 명세할 수 있다. 여러 시간대를 명세할 수 있다. 기본 값은 ‘save 3600 1’, ‘save 300 100’, ‘save 60 10000’이다.

- dir :해당 옵션은 AOF와 RDB 파일의 디렉토리 위치를 명세한다.




Posted by '김용환'
,