레디 스 지속성기구 구비

레디 스 같은 높은 동시 응용 프로그램 시나리오의 고성능, 영구 저장소, 적응 이점, "키 - 값"형 분산 데이터베이스 시스템 NoSQL의 데이터를 지향한다. 그것은 늦게 시작했지만 개발은 매우 빠른이지만. 

최근 레디 스 저자가 블로그에 쓴, 그는 토론에 대한 모든 레디 스를보고, 레디 스의 지속적인 오해가 가장 큰 것입니다 , 그래서 레디 스 체계적인를 수행 지속성에 그는 긴 기사를 쓴 토론.

이 논문은 주로 세 가지 측면을 포함한다 : 레디 스의 지속성은, 성능과 안정성뿐만 아니라 데이터베이스 비교의 다른 유형을 작동하는 방법입니다 . : 기사의 내용은 다음과 같다 

A, 레디 스 그것이 어떻게 작동 하는가 지속성?  

  지속성은 무엇인가? 간단히 장치를 끄 데이터로 데이터가 손실되지 않습니다 후, 즉 하드 디스크의 우리의 일반적인 이해이다, 즉, 넣어.

처음에 우리는 다섯 개 가지 프로세스가 따르고, 일을하고 있었는지 결국 수행 데이터베이스 쓰기를 보면

 

  • 클라이언트는 서버 쓰기 (메모리 클라이언트의 데이터)에 전송한다.
  • 데이터베이스 서버 쓰기 요청 (서버 측 메모리에 데이터)의 데이터를 수신한다.
  • 서버는 데이터가 디스크 (시스템 메모리 버퍼의 데이터)를 기록하고, 기록 시스템 호출을 호출한다.
  • 시스템을 작동하는 디스크 컨트롤러로 버퍼 (디스크 캐시에 데이터) 데이터를 전송한다.
  • 디스크 컨트롤러 (데이터가 실제로 디스크에 빠진다) 물리적 디스크 미디어에 데이터를 기록합니다.

 

실패 분석은 

대략 상위 5 개 프로세스를 작성 의 위의 다섯 개 가지 프로세스가 실패의 다양한 수준에서 보면 결합하자

 

  • 데이터베이스 시스템 오류, 이번에는 시스템 커널은 여전히 ​​손상되지 않은 경우. 운영 체제가 디스크의 데이터가 결국 떨어질 것이라는 점을 보장하기 위해, 뒤에 몇 단계를 완료하기 위해 수행하기 때문에 그래서 우리는 3 단계의 이행을 마무리 한이 시간, 데이터는 안전합니다.
  • 시스템의 전원을 끈 경우,이 시간 상기 모든 캐시의 다섯 사용할 수 없게됩니다, 데이터베이스 및 운영 체제가 작동이 중지됩니다. 따라서, 데이터를 확인하기 위해 5 단계의 완료 후에 데이터는 정전 이후에 손실되지 않은 경우에만 .

 

위의 5 단계를 이해함으로써, 우리는 다음과 같은 몇 가지 질문을 찾을

  • 얼마나 데이터베이스는 쓰기 커널 버퍼에 데이터를 기록 번만 호출?
  • 얼마나 시스템 커널 데이터 버퍼는 디스크 컨트롤러에 기록 될 것인가?
  • 디스크 컨트롤러와 어떤 시간에이 데이터는 물리적 매체에 캐시에 기록됩니다?

 

  첫 번째 질문의 경우, 데이터베이스 수준은 일반적으로 모든 권한은 것이다.

  그리고 두 번째 질문은, 운영 시스템은 기본 정책을 가지고 있지만, 우리는 또한 POSIX API fsync를 명령 힘에 의해 일련의 디스크 컨트롤러의 핵심 영역에서 데이터를 기록 할 수있는 운영 체제를 제공 할 수 있습니다.

  데이터베이스가 도달 할 수 없었던 경우,하지만 사실, 대부분의 경우에 디스크 캐시가 출발 또는 전용 캐시를 열려있는 세 번째 질문의 경우, 디스크에 직접 기록하지 않는, 읽기 캐시입니다 .

  권장 연습은 디스크 장치는 배터리 백업을 할 때 캐시를 쓸 때 켜집니다

데이터 손상 

  데이터 손상 소위는, 데이터가 무엇보다도 우리는 데이터가 실제로 디스크까지에 기록되어 있는지 확인하는 방법에 대한 이야기입니다 복구 할 수 있지만, 데이터가 손상되지 않습니다 디스크에 기록 될 수 있습니다 의미하지 않는다. 예를 들어, 우리는 사고가 안전을 완료 쓰기 작업이 발생할 수 있습니다 때 요청, 두 개의 서로 다른 쓰기 작업이 될 것이다 작성할 수 있지만, 다른 하나는 수행되지 않았습니다. 불합리한 데이터베이스의 데이터 파일 구조 조직이 데이터 될 수있는 경우 완전히 복구 할 수없는 상황이 발생합니다. 

다음은 일반적으로 세 가지 전략은 데이터 파일에 손상이 경우 복원 할 수 없습니다 방지하기 위해, 데이터를 구성 할 수있다

    • 제 1 처리는, 거친 인 조직 데이터의 형태로 데이터의 복구를 보장하지 않는다. 데이터 파일 복구 손상된 후 대신, 데이터 배열 된 백업 데이터 동기화에 의해 백업. 실제로 MongoDB의 복제 세트를 구성하여 작업 로그를 열지 않고도 경우입니다.
    • 또 우리가 운영 로그로 데이터를 복구 할 수 있도록, 로그에서 작동하는 위의 기준에 추가하는 각 작업의 어떤 운영의 행동을 기억하는 것입니다. 작업 로그이 추가되어 있기 때문에, 방법을 쓰기 위해, 그래서 상황이 회복 할 수없는 작업 로그가 표시되지 않습니다. 또한 MongoDB의 작업 로그와 같은 경우를 열었다.
    • 안전한 방법은 이전 데이터없이 데이터베이스를 수정하는 것입니다,하지만 데이터가 나타 났을 경우를 결코 회복되지 할 수 없도록 데이터 자체가, 로그가되도록, 쓰기 작업을 완료 할 수있는 또 다른 방법으로. 사실 CouchDB를이 방법의 훌륭한 예입니다.

 

두, 레디 스는 RDB 지속성과 지속성 AOF를 제공합니다

장점과 RDB의 메커니즘을 적용

  RDB 지속성은 디스크에 기록 된 데이터 세트 스냅 메모리에 지정된 시간 간격을 의미한다.

  기본 지속성인가,이 방법은 이진 파일에 기록 된 스냅 샷과 같은 메모리 데이터가 기본 파일 이름이 dump.rdb 것입니다.

자동 구성 설정에 의해 지속적 방식의 스냅 샷을 만들 수 있습니다. 우리가 m 키가 자동으로 n 초에서 스냅 샷을 만들기 위해 수정 된 것보다 레디 스 더 구성 할 경우, 다음은 기본의 스냅 샷 구성을 저장할 수있다

   save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000 

RDB 파일 저장 프로세스

  • 레디 스 이제 자녀와 부모, 포크를 호출합니다.
  • 메모리의 내용이 임시 파일에 기록됩니다에 대한 클라이언트 요청을 계속 처리 할 수있는 부모 프로세스가 자식 프로세스는 책임이있다. 복제 메커니즘 때문에 (쓰기에 복사) 부모 프로세스가 오히려 공유하는 페이지를 작성하는 것보다, 수정하려는 페이지의 복사본을 생성합니다 쓰기 요청의 운영 체제의 부모 프로세스를 처리 할 수있는 부모와 자식 주 동일한 물리적 페이지의 운영 체제 물품. 따라서, 자식 프로세스의 주소 공간에있는 데이터는 전체 데이터베이스 포크 순간의 스냅 샷입니다.
  • 자식 프로세스가 스냅 샷이 완료되면 임시 파일을 작성하는 경우, 임시 스냅 샷 파일과 원본 파일을 교체 한 다음 자식 프로세스가 종료됩니다.

클라이언트는 또한 명령 통지 또는 bgsave 레디 스 지속성의 스냅 샷을 저장할 수 있습니다. 레디 스 클라이언트의 모든 요청을 처리 할 수있는 메인 스레드이기 때문에, 메인 쓰레드에 저장된 스냅 샷 작업을 저장,이 방법은 모든 클라이언트 요청을 차단합니다. 그것은 사용하지 않는 것이 좋습니다.

주목해야 할 또 다른 점은 영구적 인 메모리 데이터의 스냅 샷이 완전히 한 번 디스크뿐만 아니라 증분 동기화 더티 데이터를 기록 할 때마다 것입니다. 데이터가 큰, 다음, 더 쓰기 작업을하는 경우, 필연적으로 성능에 심각한 영향을 미칠 수있는, 운영 IO 디스크가 많이 발생합니다.

우월

  • 이런 식으로하면, 다음 전체 레디 스 데이터베이스 백업 때문에 매우 편리 하나의 파일 만 포함됩니다. 예를 들어, 일부 데이터를 보관하려고 일일하지 않을 수 있습니다.
  • 쉬운 백업, 우리는 쉽게 다른 저장 매체에 RDB로 파일을 이동할 수 있습니다
  • RDB 속도 대용량 데이터를 복구 AOF의 회복 속도보다 빠르게 설정한다.
  • RDB 레디 스 성능을 극대화 할 수 있습니다 : 당신은 RDB는 다음 자식 프로세스가 모든 후속 보존 작업, 모든 디스크를 수행하지 않고 부모 프로세스를 처리 할 파일을 저장할 때 할 수있는 부모 프로세스가 포크 자식 프로세스 인 I / O 작업 .

불우 아동

  • 당신은 서버가 실패 할 때 데이터 손실을 방지하기 위해 시도해야 할 경우, RDB는 아닙니다. 레디 스 사용자가 설정 할 수 있지만 여러 지점을 (세이브 포인트) RDB 파일은 전체 데이터 세트의 상태를 저장해야하기 때문에 RDB의 주파수는, 그러나, 파일을 저장 제어하기 저장, 그래서 그것은 쉬운 작업이 아니다. 그래서 당신은 RDB 파일 전에 5 분 이상 시간을 절약 할 수 있습니다. 다운 타임이 발생하면이 경우, 당신은 데이터의 몇 분을 잃을 수 있습니다.
  • RDB는 시간을 절약 할 때마다, 레디 스 실제 지속적인 작업에 자식 프로세스에 의해) (자식 프로세스를 포크해야합니다. 대규모 데이터 세트를 비교할 때, 포크 (), 매우 시간이 소모 될 특정 밀리 초 내에 클라이언트 처리를 중지하도록 서버를 일으킬 수 있으며, 데이터 세트가 매우 큰이며, CPU 시간이 매우 빡빡 경우,이 심지어 시간 회장 중지 될 수 있습니다 전체 초까지. AOF 있지만 또한 재 작성) (포크에 필요하지만, 아무리 AOF이 실행 간격 길이를 재 작성하는 방법, 내구성이 데이터의 손실이 될하지 않습니다.

AOF 파일 저장 과정

레디 스는 쓰기 기능에 의해 수신 된 각각의 쓰기 명령 (기본값은 appendonly.aof입니다) 파일에 추가됩니다.

레디 스를 다시 실행 파일 쓰기 명령으로 저장 다시 시작하면 메모리에 전체 데이터베이스를 다시 작성합니다. OS가 커널에서 할 쓰기 캐시를 수정하기 때문에 물론, 즉시 디스크에 기록되지 않을 수 있습니다. 지속성 등 AOF 방법도 여전히 가능은 일부 수정을 잃게합니다. 그러나 우리는 우리가 fsync를 타이밍 기능을 통해 디스크에 기록 OS를 강제 할 프로파일 레디 스에 의해 알 수 있습니다. 다음과 같은 세 가지 방법이 있습니다 (기본값 : fsync를 한 번 초당)

appendonly yes              //启用aof持久化方式
# appendfsync always      //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 # appendfsync no //完全依赖os,性能最好,持久化没保证

AOF 방법은 또 다른 문제를 가져왔다. 영구 파일은 커지고 될 것입니다. 예를 들어, 우리는 증분 테스트 명령 100 번 호출, 파일은 사실, (99)가 불필요하며, 100 개 개의 명령을 저장해야합니다. 상태가 실제로 100 충분 일련의 시험에 파일을 저장하기 때문에 데이터베이스를 복원합니다.

지속성 AOF 파일을 압축합니다. 레디 스 명령 bgrewriteaof 제공합니다. 레디 스이 명령은 스냅 샷 임시 파일에 저장하는 방식으로 명령을 메모리에있는 데이터와 유사한 방식으로 사용하고, 마지막으로 원본 파일을 대체합니다받을 수 있습니다. 다음과 같은 특정한 과정은

  • 레디 스 포크를 호출하고, 그의 아들은 이제 두 개의 프로세스가 있습니다
  • 자식 프로세스 데이터베이스 스냅 샷 메모리에 따르면, 임시 파일 쓰기 명령에 데이터베이스 상태를 다시
  • 부모 프로세스는 원래 AOF 파일에 쓰기 쓰기 명령에 추가하여, 클라이언트 요청을 계속 처리합니다. 캐시는 수신 쓰기 명령하는 동안. 이것은 자식 프로세스가 다시 작성하는 경우는 실패하지 않고 문제를 보장합니다.
  • 스냅 샷의 내용을 작성하는 자식 프로세스가 명령 모드에서 임시 파일에 기록 된 경우, 자식 프로세스는 부모 프로세스 신호를 보낸다. 그런 다음 부모 캐시 쓰기 명령은 또한 임시 파일에 기록됩니다.
  • 이제 부모 프로세스는 나중에 새로운 파일이 추가됩니다 AOF하기 시작, 이전 AOF 파일을 대체 이름을 수신 명령을 작성하는 임시 파일을 사용할 수 있습니다.

AOF 파일 작업을 다시 작성하는 것입니다 알고 있어야하고, 기존의 AOF 파일을 읽을 않았지만, 메모리에 전체 데이터베이스의 내용을 새 파일 AOF의 명령을 재 작성하고,이 스냅 샷은 다소 유사하다.

우월

  • AOF는 레디 스 지속성이 매우 내구성이 될 것이다 사용 (훨씬 더 내구성) : 당신은 어떤 fsync를 서로 다른 fsync를 전략을 설정할 수, 초당 한 번씩, 또는 모든 명령 실행을 쓰기 FSYNC fsync를. , AOF 기본 정책은 한 번 초당 fsync를 들어,이 구성에서, 레디 스 여전히 좋은 성능을 유지할 수 있으며, 다운 타임이 발생하더라도, 그것은 단지 (fsync를가 백그라운드 스레드에서 수행 될 데이터의 일초를 잃게됩니다 메인 스레드는) 명령 요청을 처리하기위한 노력을 계속할 수 있습니다.

  • AOF 파일은 로그 파일 만 작업 (만 로그를 추가) 추가, 그래서 파일이 AOF는 디스크에 쓰기로 (어떤 이유로 로그 명령이 완료 쓰지 않습니다 포함 된 경우에도, 추구 작성할 필요가 없습니다 아래로 전체 서면 절반 방법 등), 레디 스는-체크 AOF 도구는 쉽게이 문제를 해결할 수 있습니다.
    레디 스 AOF 자동 AOF의 배경 재 작성에 너무 큰 파일 크기가 될 수 있습니다 때 : AOF 새 파일 명령을 덮어 쓰기하는 것은 현재 컬렉션을 복원하는 데 필요한 데이터의 최소 세트가 포함 후. 전체 작업 때문에 새로운 레디 스 AOF 파일을 만드는 과정에서 절대적으로 안전합니다 재 작성 명령이 손실되지 않습니다 기존 AOF 파일을 다시 작성하더라도 다운 타임 동안, 내부에 기존의 파일 AOF에 추가 할 것 . 새로운 AOF 파일이 생성되면, 레디 스 새로운 파일 AOF의 AOF 파일에 기존의 전환과 새로운 AOF 파일 추가 작업을 시작합니다.

  • AOF 파일의 내용, 사람들을 읽고 분석 (구문 분석) 신청을 매우 쉽게도 매우 간단하므로 AOF는 모든 데이터베이스, 형식 레디 스 프로토콜을 저장할 수있는 쓰기 작업을 수행 쓰기 작업을 질서 정연하게 파일을 저장합니다. 수출 (수출) AOF 파일은 매우 간단하다 : 예를 들어, 당신이 조심 FLUSHALL가 레디 스를 명령을 실행하지만, 한 AOF 파일을 덮어 쓰기되지 않았기 때문에, 너무 오래 서버가 정지로, 파일의 FLUSHALL 명령 AOF 끝을 제거하고 다시 시작하지 않은 경우, 당신은 FLUSHALL 실행하기 전에 상태로 설정 데이터를 복원 할 수 있습니다.

불우 아동

  • 동일한 데이터 세트의 경우, 파일은 일반적으로 볼륨 RDB 파일보다 더 큰 볼륨을 AOF.

  • fsync를 전략 사용에 따르면, AOF 속도는 RDB보다 더 느려질 수 있습니다. 일반적으로, 두 번째 성능 당 fsync를 여전히 매우 높고, 가까운 fsync를도 높은 부하에서 고속으로 AOF 속도와 RDB 수 있습니다. 그러나 거대한 쓰기로드를 처리 할 때, RDB는 최대 지연 시간 (대기 시간)을 제공 할 수있는 것이 더 확실한이다.

  • 당신은 저장했을 당시로에 설정 한 데이터를 복구 할 수 없습니다 다시로드 할 때 AOF 파일로 이어지는 때문에 개별 명령의 : AOF는 과거에 이러한 버그가 있었다. (. 예를 들어, 명령 BRPOPLPUSH을 차단 한 번 같은 버그가 발생)이 상황에 대한 테스트 스위트의 테스트에 추가되었습니다가 자동으로 임의의 복잡한 데이터 세트를 생성하고, 다시로드하여 모든 데이터를 보장 것을 위해 정상. 이 버그는 AOF 파일에 공통 아니라, 콘트라스트가 있지만, RDB는 버그가 거의 불가능하다.

선택

당신이 비교 PostgreSQL의 데이터 보안을 달성하고자하는 경우 일반적으로, 당신은 모두 지속적으로 기능을 사용해야합니다.

당신이 당신의 데이터에 대해 매우 우려하고있다,하지만 여전히 몇 분 이내에 데이터의 손실을 견딜 수 있다면, 당신은 RDB 지속성을 사용할 수 있습니다.

내 개인 환경 설정 AOF 남아있는 경우

 

1. 스냅 샷 생성 :
기본적으로, 데이터 세트의 스냅 샷 덤프 파일을 dump.rdb하는 레디 스됩니다. : 또한, 우리는 또한 주파수 레디 스 서버 구성 파일 덤프 스냅 샷에 의해 수정 될 수 6379.conf 파일을 연 후, 우리는 저장 검색, 다음과 같은 구성을 볼 수 있습니다
, 저장 # 900 초 (15 분) 후 1 (900) 적어도 하나의 키 변경하는 경우, 덤프 메모리 스냅 샷.
변경 키 (10), 덤프 메모리 스냅 샷이 이상하면 300 초 (5 분) 후 300 10 #을 저장합니다.
60 초 (1 분) 후 60 10000 #을 저장 적어도 10,000 주요 변경 사항, 덤프 메모리 스냅 샷 경우.

2. 덤프 스냅 샷 메커니즘 :
. 1) 레디 스는 자식 프로세스를 포크합니다.
2) 하위 프로세스 스냅 샷 데이터는 임시 파일 RDB에 기록됩니다.
3). 자식 프로세스는 데이터 쓰기 작업, 임시 파일을 완료 한 후 이전 파일을 교체 할 때.

5.4.3 AOF 파일 :
이미 말했듯이 여러 번, RDB 스냅 샷 시간 초과 덤프 메커니즘은 좋은 데이터 지속성을 보장 할 수 없습니다. 우리의 응용 프로그램이 실제로이 점에 대해 매우 우려하고 있다면, 우리는 AOF 메커니즘 레디 스의 사용을 고려할 수 있습니다. 레디 스 서버의 기본 메커니즘은 AOF 필요하면 RDB는, 구성 파일을 다음과 같은 항목을 수정해야 할 것입니다 :
appendonly 변화 없음을 appendonly 네
지금부터, 명령이에 레디 스 데이터 수정을받을 때마다 그 후, 그것은 AOF 파일에 추가됩니다. 레디 스에서 다시 시작, 당신은 메모리에 최신 데이터를 구축하는 정보 AOF 파일을로드해야합니다.

5.4.5 AOF 구성 :
존재 레디 스 프로파일 동기식으로 세 가지 종류가있다 :
파일이 AOF에 기록 될 때 appendfsync는 항상 #마다 데이터 수정이 발생합니다.
appendfsync 초당 한 번 everysec # 동기화, 전략은 AOF의 기본 전략이다.
더 # 결코 동기화를 appendfsync 없습니다. 효율적인하지만 데이터가 유지되지 않습니다.

5.4.6 어떻게 해결하는 손상된 파일은 AOF :
기존 파일이 추가 사본을 AOF을 손상되었습니다 1).
2) "레디 스 - 체크 AOF --fix <실행 파일 이름>" 손상된 파일 AOF을 복구 명령을 사용합니다.
3) AOF와 다시 시작 레디 스 서버는 파일을 복구.

. 5.4.7 레디 스 데이터 백업 :
레디 스 레디 스 데이터 파일, 우리는 온라인 백업 사본의 방법으로 실행 할 수있다. 가 생성되면 RDB 파일이 수정되지 않기 때문입니다. 임시 파일에 가장 최근의 데이터를 덤프 할 때마다 레디 스 다음 기능을 원자 임시 파일의 이름을 변경하여 원래 데이터 파일 이름으로 이름이 변경됩니다. 그래서 우리는 언제든지 복사 데이터 파일에 안전하고 일관성이 있음을 말할 수있다. 이러한 관점에서, 우리는 cron 작업에게 길을 만들어 데이터 파일을 정기적으로 백업 레디 스 수 있으며, 보안 디스크 미디어에 백업 파일을 복사합니다.

5.5 즉시 쓰기

코드를 복사
코드를 복사
// 저장 이제 동기화 절약 
    공공 정적 무효 syncSave은 () 예외 {던졌습니다 
        ; Jedis Jedis 새로운 새 = ( "127.0.0.1", 6379)을 jedis 
        위해 (나는 1000을 <; I = 0 int로 내가 ++) { 
            jedis.set를 ( " 키 "+ 나는,"여보세요 "+ I) 
            에서 System.out.println는 (") "레디 스의 열쇠"+ 난 + "데이터를 설정, 
            에 Thread.sleep (2); 
        } 
        실행을 저장 // 서버에서 생성 데이터베이스 파일 dump.rdb의 
        jedis.save (); 
        jedis.close (); 
        에서 System.out.println ( "완료 쓰기"); 
    }
코드를 복사
코드를 복사

결과 :

방법은 동기 여기에 저장, 더 쓰기 다시 완료 코드 전에 수행하지 않습니다.

5.6 비동기 쓰기

코드를 복사
코드를 복사
    // 비동기 저장 
    {예외를 throw) (공공 정적 무효 asyncSave을 
        , Jedis Jedis 새로운 새 = ( "127.0.0.1", 6379)을 jedis 
        (나는 1000 <나는에게 = 0 int로 내가 ++)를 위해 { 
            jedis.set를 ( "키"+ 나는, "여보세요"+ I) 
            에서 System.out.println는 () + I + "레디 스 데이터" "키를 설정", 
            (가)에 Thread.sleep (2); 
        } 
        // 비동기 저장은 서버에서 덤프를 생성 .rdb 데이터베이스 파일 
        jedis.bgsave (); 
        jedis.close (); 
        에서 System.out.println ( "완료 쓰기"); 
    }
코드를 복사
코드를 복사

데이터의 양이 매우 큰 경우, 콘텐츠를 많이 저장하려는, 내용이 적어도 저장 방법을 사용할 수있는 경우, bgsave를 사용하는 것이 좋습니다. 사용자 블로그에서 다양한 방법을 비교.

 

(1), 레디 스 지속성 전략 : RDB 스냅 샷  

레디 스 현재 데이터의 스냅 샷 지원은 데이터 파일에 대한 지속성 메커니즘으로 저장됩니다 . 데이터베이스는 지속적으로 쓰기에게 그것의 스냅 샷을 생성하는 방법이다. 복사 포크와 레디 스 쓰기 메커니즘을 명령한다. 스냅 샷을 생성 할 때, 현재의 프로세스가 자식 프로세스의 모든 데이터를 통해 자식 프로세스 후 루프 포크 것, 데이터는 RDB 파일로 기록된다. 

우리는 레디 스에 의해 생성 된 타이밍 RDB 스냅 샷을 구성 할 수있는 것은 십분 100 이하 스냅 샷을 쓸 때, 예를 들어, 당신은 1 시간에 스냅 샷에 기록 된 1000있을 때 구성 할 수있는, 당신은 할 수 구성 할 수 명령을 저장 복수의 규칙으로 실시. 이 규칙은 레디 스 구성 파일에 정의되어 있습니다, 당신은 또한 레디 스 레디 스를 구성 SET 명령을 통해 실행 규칙을 설정할 수 있습니다, 필요 레디 스를 다시 시작 없습니다. 

새로운 RDB 파일을 생성 할 때 RDB 파일 레디 스이 때문에, 기록 동작은 새로운 프로세스에서 수행된다, 파손되지 않고, 레디 스 자식 프로세스가 제 원자로 후 임시 파일에 데이터를 쓸 것이고 생성 시스템 호출의 임시 파일이 너무 언제든지 실패 RDB 파일로 이름이 변경되고, 이름 바꾸기 RDB 파일의 레디 스는 항상 사용할 수 있습니다. 

한편, RDB 파일 레디 스 레디 스 마스터 - 슬레이브 동기화는 링의 내부에서 실행된다. 

그러나, 우리는 명확하게 볼 수 있습니다, RDB는 데이터베이스가 문제가되면, 다음 완전히 새로운되지 않은 우리의 RDB 데이터의 파일 저장, 단점을 가지고 , 마지막 정류장에서 생성 된 RDB 파일이이 기간의 데이터를 레디 스하기를 모두 잃었다. 일부 기업에서는이 가격이 높은 RDB 열려 있지 않기 때문에 우리는 또한, RDB가 지속 될이 서비스를 사용하는 방법을 권장, 허용 할 수 있습니다. AOF 로그 : 레디 스가 또 다른 중요한 지속성 메커니즘을 소개 있도록 그러나 응용 프로그램의 몇 가지 추가 높은 데이터 보안 요구 사항에 대한 데이터 손실을 허용 할 수없는 응용 프로그램은, RDB는 아무것도 할 수 없습니다. 

2 번째 레디 스 지속성 전략 : AOF 로그 

AOF는이 로그 파일 추가하려면 기록, 로그의 전체 이름은 우리가 말할 수있는 이름에서 전용 파일을 추가합니다. 차이점은 일반적인 데이터베이스,이다 의 내용은 표준 레디 스 명령 중 하나입니다, 인식 파일의 AOF 일반 텍스트입니다 . 예를 들어, 우리는 시작 명령 AOF 기능 매개 변수에 열리도록 설정 다음과 같은 실험 Redis2.6 버전을 수행 :

./redis-server --appendonly 예

  우리는 다음 명령을 실행합니다 :

redis 127.0.0.1:6379>  set  key1 Hello
OK
redis 127.0.0.1:6379> append key1  " World!"
(integer) 12
redis 127.0.0.1:6379> del key1
(integer) 1
redis 127.0.0.1:6379> del non_existing_key
(integer) 0

  그리고 우리가 AOF 로그 파일을보고, 다음을 얻을 것이다 :

$ cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$4
key1
$5
Hello
*3
$6
append
$4
key1
$7
  World!
*2
$3
del
$4
key1

  당신은 쓰기 작업을 로그로 해당 명령을 생성 볼 수 있습니다. 레디 스 현재 데이터 집합을 변경하지 않고이 명령을 판단하기 때문에 그 마지막으로 델 명령을 주목할 필요가있다, 그것은, 로그 AOF에 기록되지 않았습니다 . 쓰기 명령이 쓸모 기록 할 필요가 없습니다. 또한 AOF 로그는 완전히 그래서 로그에 방지하기 위해, 부동 소수점 연산하는 다른 시스템에서 다를 수 있기 때문에 크로노 그래프 AOF 로그는, 일련의 기록에 기록 된 INCRBYFLOAT 같은 명령으로 로그를 생성하는 클라이언트의 요청에 따라되지 않는다 상기 세트에 의한 기록 동작의 그래서 여기에만 결과를 다른 시스템에 다른 데이터 세트를 생성한다. 

AOF는 다시 

당신은 모든 단일 쓰기 명령은 로그, 파일이 AOF 큰 것되지 않습니다 생성 당신이 생각할 수 있는가? 대답은 '예, AOF 문서는 점점 커질 것입니다 레디 스도의 재 작성 AOF라는 기능을 제공하므로 . 그 기능은, 새로운 AOF가 동일한 값에 대한 연산의 횟수로 기록 될 수 있고, 다소 오래된 문서로서보다 한번만 동작의 기록 정보 파일 AOF 문서를 다시 생성한다. RDB와 그 생성 과정은 비슷하지만, 새로운 AOF 임시 파일을 데이터를 통해 직접 프로세스를 포크 물품. 새 파일을 작성하는 과정에서, 모든 서면 또는 또한 메모리 버퍼에 기록하는 동안, 로그 된 AOF 원본 파일을 작성합니다. 작업이 완료 재 완료되면, 모든 버퍼는 로그 시간 임시 파일에 기록됩니다. 그런 다음 이전 AOF AOF 파일을 대체 할 새 문서를 원자 이름 바꾸기 명령을 호출합니다. 

두, 레디 스 지속성 성능은 믿을 수 있습니까?  

우리는 위의 과정에서 볼 수있는, RDB는 IO 작업의 순서입니다 성능이 매우 높다. RDB 데이터베이스 파일 복구하는 동시에 동안, 읽기 데이터 시퀀스 메모리에로드됩니다. 그래서 임의 디스크 읽기 오류가 발생하지 않습니다. 

AOF는 목적은 디스크에 로그를 운영하는 것입니다, 그래서 그것은 또한 우리가 쓰기 작업 위의 다섯 개 가지 프로세스가 발생했음을 말할 것이다, 쓰기 파일 작업입니다. 그래서 또한 얼마나 많은 AOF 운영 안전을 쓰기 만? 사실,이 설정할 수 있습니다 AOF 호출을 작성 후 작성하는 레디 스에서, 때 appendfsync 옵션에 의해 제어되는 디스크에 기록 할 수 fsync를 호출하는 다음과 같은 세 가지 설정 appendfsync, 보안 강도가 강한되었습니다 .  

1, appendfsync없이 

짧은 시간에 appendfsync 설정하면, 레디 스 그래서이 모든 운영 체제의 디버깅에 완전히 의존, 디스크에 AOF 로그 동기화를 fsync를 호출하는 주도권을 쥐고하지 않습니다. 대부분의 리눅스 운영 체제의 경우, 데이터 버퍼가 디스크에 기록, 매 30 초 fsync를을 수행한다

2 appendfsync everysec 

설정 시간이 appendfsync everysec 때, 레디 스 기본적 번씩 두 번째 전화를 할 fsync를 상기 데이터 버퍼가 디스크에 기록된다. 그러나이 시간은 1 초 이상 전화 fsync를 할 때. 레디 스는 지연의 채택 된 전략을 fsync를 두 번째를 기다립니다. fsync를들은 후,이 시간 fsync를 그것이 얼마나 오래 상관없이 수행 약 2 초에서 수행된다. 이 시간 fsync를, 그래서 현재의 쓰기 작업이 차단 될 때 파일 기술자가 차단됩니다 때문이다. 

이 때문에, 결론은 : 대부분의 경우, 레디 스는 매초마다 fsync를 수행 될 것이다. 최악의 경우 2 초는 fsync를 작업을 수행합니다

이 작업은 디스크에, 한 번 쓰기 로그 여러 데이터 쓰기 작업의 조합, 커밋 대부분의 데이터베이스 시스템 그룹에 언급되어있다. 

3, 항상 appednfsync 

설정 appendfsync 항상 때, 모든 쓰기 작업은 다음 데이터는 성능에 영향을 줄 수 있도록, 모든 시간 이후, fsync를의 구현 물론, 가장 안전하다, 한 번 fsync를 호출합니다. 

파이프 라이닝의 차이점은 무엇입니까?  

특정 클라이언트 프로세스는 파이프 라인의 동작에 대해 N 회 명령을 전송 한 후 N 결과를 함께 반환 반환 명령을 기다린다. pipilining를 사용하여 각 명령의 반환 값의 확인을 포기하는 것을 의미한다. 이 경우, 이후, N은 동일한 실행에서 실행되는 명령이다. 설정이 appendfsync everysec 할 때 N은 1 이상의 초 2 초 명령을 수행 할 수 있기 때문에, 약간의 편차가있을 수있다. 그러나 우리는 최대 시간을 실행 시간과 N 명령을 초과하지 않을 것을 보장 할 수 있습니다. 

셋째, 데이터베이스 등의 비교 

데이터 보안 운영 체제 레벨 이상, 우리는 거의 같은 달성, 사실, 서로 다른 데이터베이스를 많이 이야기했다. 즉, 최종 결론은,이다 레디 스 개방 AOF의 경우, 독립형 데이터 보안이 성숙 SQL 데이터베이스들보다 약하다

수입의 측면에서 데이터의 비교 

이러한 데이터를 사용 무엇 지속성 물론, 그것은 다시 시작한 후 데이터 복구를위한 것입니다. 레디 스는 RDB AOF, 또는 그냥 데이터 복구 조치를 보장하기 위해 여부, 인 - 메모리 데이터베이스입니다. 그래서 레디 스는 RDB와 AOF 회복의 사용, RDB 또는 AOF 파일, 메모리에 다시로드를 읽습니다. MySQL은 메모리에 데이터를로드 할 필요 없었을 것이기 때문에 MySQL 데이터베이스 및 다른 시작 시간은, 대통령의 많은 상대적입니다. 

그러나 상대적으로 말하기, 핫 데이터를 액세스 할 때 시작 MySQL은, 이후 서비스의 제공이 점차적으로 메모리에로드됩니다, 우리는 일반적으로 워밍업을 부르지 만, 워밍업의 완료 전에, 그 성능이 너무 높은되지 않습니다. 레디 스의 장점은 메모리에 한 번로드 데이터 인, 일회용 난기. 너무 오래 레디 스 시작이 완료되면, 다음 서비스의 속도는 매우 빠릅니다. 

그리고 RDB의 사용에 AOF를 사용하기 시작, 시작 시간은 약간의 차이가 있습니다. RDB의 시작 시간이 두 가지 이유로, 첫째, RDB, 여러 작업이 AOF으로 데이터 로그를 기록해야하는 등의 가능성이되지 않습니다 데이터의 각 부분에 대해 하나의 기록 파일이있다, 짧아집니다. 그러니 그냥 라인에 각 한 번 데이터를 기록. 또 다른 이유는 저장 포맷과 메모리에 데이터 인코딩 형식 레디 스 RDB 파일 추가적인 코딩 된 데이터는 동일하다. 는 CPU 소비에 부하 AOF 로그보다 훨씬 적습니다.

 

bcombetter 재생 레디 스에서 제공 지속성 메커니즘 (RDB 및 AOF)

추천

출처www.cnblogs.com/it-xiaozhi/p/10955849.html