>  기사  >  데이터 베이스  >  Redis의 RDB 지속성에 대한 분석 예

Redis의 RDB 지속성에 대한 분석 예

PHPz
PHPz앞으로
2023-05-28 18:11:17934검색

1. RDB 소개

RDB는 Redis에서 지속성을 위해 사용하는 방법으로 현재 메모리에 있는 데이터 세트의 스냅샷, 즉 스냅샷 스냅샷(데이터베이스의 모든 키-값 쌍 데이터)을 기록합니다. . 복구 중에 스냅샷 파일은 메모리로 직접 읽혀집니다.

2. 트리거링 방법

  RDB에는 자동 트리거링과 수동 트리거링의 두 가지 트리거링 방법이 있습니다.

①, 자동 트리거

 redis.conf 구성 파일의 SNAPSHOTTING 아래에 이번 글에서 소개했습니다.

  Redis의 RDB 지속성에 대한 분석 예

  1, save: Redis를 트리거하는 RDB 지속성 조건, 즉 메모리에 있는 데이터를 하드 디스크에 저장할 시점을 구성하는 데 사용됩니다. 예를 들어 "m n 저장"입니다. m초 내에 데이터 세트가 n번 수정되면 bgsave가 자동으로 실행됨을 나타냅니다. (이 명령은 아래에서 소개하고 RDB 지속성을 수동으로 실행하는 명령)

 기본 구성은 다음과 같습니다.

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

  물론입니다. , Redis의 캐싱 기능만 사용하는 경우 no 지속성이 필요한 경우 모든 저장 라인을 주석 처리하여 저장을 비활성화할 수 있습니다. "" 저장을 사용하여

 ②, stop-writes-on-bgsave-error를 비활성화할 수 있습니다. 기본값은 yes입니다. RDB가 활성화되고 데이터의 마지막 백그라운드 저장이 실패한 경우 Redis가 데이터 수신을 중지하는지 여부입니다. 이렇게 하면 사용자는 데이터가 디스크에 올바르게 유지되지 않았다는 사실을 알게 되며, 그렇지 않으면 누구도 재난이 발생했다는 사실을 알아차리지 못할 것입니다. Redis가 다시 시작되면 데이터 수신을 다시 시작할 수 있습니다

  3, rdbcompression;기본값은 yes입니다. 디스크에 저장된 스냅샷의 경우 저장을 위해 압축할지 여부를 설정할 수 있습니다. 그렇다면 redis는 압축을 위해 LZF 알고리즘을 사용합니다. 압축을 위해 CPU를 소비하지 않으려면 이 기능을 끄기로 설정할 수 있지만 디스크에 저장되는 스냅샷은 더 커집니다.

 4, rdbchecksum: 기본값은 yes입니다. 스냅샷을 저장한 후 redis가 데이터 확인을 위해 CRC64 알고리즘을 사용하도록 할 수도 있지만 이로 인해 성능 소모가 약 10% 증가하게 됩니다. 최대 성능 향상을 얻으려면 이 기능을 끄면 됩니다.

  ⑤, dbfilename: 스냅샷의 파일 이름을 설정합니다. 기본값은 dump.rdb

 입니다. ⑥, dir: 스냅샷 파일의 저장 경로를 설정합니다. 이 구성 항목은 파일이 아닌 디렉터리여야 합니다. 이름. 기본값은 현재 구성 파일과 동일한 디렉터리에 저장하는 것입니다.

 즉, 구성 파일에 구성된 저장 방법을 통해 실제 작업이 구성 형식을 충족하면 RDB 지속성이 수행되고 현재 메모리 스냅샷이 dir로 구성된 디렉터리에 저장됩니다. 구성된 dbfilename에 의해 결정됩니다.

②. 수동 트리거

RDB 지속성을 위해 Redis를 수동으로 트리거하는 명령은 두 가지가 있습니다.

1. save

이 명령은 save 명령을 실행하는 동안 Redis가 다른 명령을 처리할 수 없도록 합니다. 완료될 때까지 RDB 프로세스를 수행합니다.

 분명히 이 명령은 상대적으로 큰 메모리를 가진 인스턴스에 대해 장기적인 차단을 유발하는데, 이는 치명적인 결함입니다. Redis는 이 문제를 해결하기 위해 두 번째 방법을 제공합니다.

 2.bgsave

 이 명령을 실행하면 Redis는 백그라운드에서 스냅샷 작업을 비동기적으로 수행하며 스냅샷은 클라이언트 요청에도 응답할 수 있습니다. Redis 프로세스가 하위 프로세스를 생성하기 위해 포크 작업을 수행하면 하위 프로세스는 RDB 지속성 프로세스를 실행하고 완료 후 자동으로 종료됩니다. 차단은 포크 단계에서만 발생하며 일반적으로 수명이 매우 짧습니다.

 기본적으로 Redis 내부의 모든 RDB 작업은 bgsave 명령을 사용합니다.

 ps: flashall 명령을 실행하면 dump.rdb 파일도 생성되지만 비어 있고 의미가 없습니다.

3. 데이터 복원

백업 파일(dump.rdb)을 redis 설치 디렉터리로 이동하고 그냥 서비스를 시작하면 redis가 자동으로 파일 데이터를 메모리에 로드합니다. Redis 서버는 로드 작업이 완료될 때까지 RDB 파일을 로드하는 동안 차단됩니다.

 redis의 설치 디렉터리를 얻으려면 config get dir 명령을 사용할 수 있습니다

 Redis의 RDB 지속성에 대한 분석 예

4. RDB 지속성 중지

 어떤 경우에는 Redis의 캐싱 기능만 사용하고 싶은데 그렇지 않습니다. Redis의 지속성 기능을 사용하면 이때 RDB 지속성을 중지하는 것이 좋습니다. 위에서 언급한 대로 구성 파일 redis.conf의 모든 저장 라인을 주석 처리하거나 빈 문자열을 사용하여 직접 비활성화하여 저장 기능을 비활성화할 수 있습니다: save ""

  다음 명령을 전달할 수도 있습니다:

1

redis-cli config set save " "

5. RDB의 장점과 단점

  ① 장점

Redis의 데이터 세트는 특정 시점에 RDB 파일로 저장됩니다. 이 파일은 매우 컴팩트합니다. 이 파일은 백업 및 재해 복구에 이상적입니다.

 2. RDB 파일을 생성할 때 redis 메인 프로세스는 모든 저장 작업을 처리하기 위해 하위 프로세스를 포크()합니다. 메인 프로세스는 디스크 IO 작업을 수행할 필요가 없습니다.

  3.RDB는 대용량 데이터 세트를 복원할 때 AOF보다 빠릅니다.

  ② 단점

  1. RDB 데이터는 실시간 지속성/2차 지속성을 구현할 수 없습니다. bgsave가 실행될 때마다 자식 프로세스를 생성하기 위해 분기 작업을 수행해야 하기 때문에 이는 중량 작업(메모리의 데이터가 복제되고 약 2배의 확장을 고려해야 함)이며 빈번한 실행에 따른 비용이 발생합니다. 너무 높음(성능에 영향)

2. RDB 파일은 특정 바이너리 형식으로 저장됩니다. Redis 버전이 발전하면서 RDB 버전의 형식이 여러 가지가 되지만, 이전 버전의 Redis 서비스는 문제가 있습니다. 새 버전의 RDB 형식과 호환되지 않음(버전이 호환되지 않음)

 3. 일정한 간격으로 한 번 수행 백업이므로 실수로 redis가 다운되면 마지막 스냅샷 이후의 모든 수정 사항이 손실됩니다(데이터가 손실됩니다)

6. RDB 자동 저장의 원리

  Redis에는 서버 상태 구조가 있습니다:

1

2

3

4

5

6

7

8

9

struct redisService{struct redisService{

     struct saveparam *saveparams;

     long long dirty;

     time_t lastsave;

}

  ①、首先看记录保存save条件的数组 saveparam,里面每个元素都是一个 saveparams 结构:

1

2

3

4

5

6

struct saveparam{

     time_t seconds;

     int changes;

};

  前面我们在 redis.conf 配置文件中进行了关于save 的配置:

longlongdirty;

1

2

3

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存

save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存

save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

struct saveparam *saveparams;
time_t lastsave;

}

Redis의 RDB 지속성에 대한 분석 예

 ① 먼저 저장 조건을 기록하는 saveparam 배열을 살펴보세요. 각 요소는 saveparams 구조입니다.

1

🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜🎜🎜 struct saveparam{🎜🎜 time_t 초;🎜🎜 int changes;🎜🎜}; 🎜🎜🎜🎜🎜🎜 이전에 redis.conf 구성 파일에 저장을 구성했습니다: 🎜 🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜🎜🎜save 900 1: 900초 이내에 1개 이상의 키 값이 변경되면 저장🎜🎜save 300 10: 10개 이상의 키 값이 300초 이내에 변경되면 저장🎜🎜save 60 10000: 최소 10,000개 이상의 키 값이 60초 내에 변경되면 저장함을 나타냅니다. >🎜🎜🎜🎜🎜🎜 그러면 서버 상태의 saveparam 배열은 다음과 같습니다.🎜🎜 🎜🎜🎜 ②, 더티 카운터 및 lastsave 속성🎜🎜  더티 카운터는 save 명령 또는 bgsave 명령을 마지막으로 성공적으로 실행한 이후의 거리를 기록합니다(쓰기, 삭제, 업데이트 등 포함). ). 🎜🎜 lastsave 속성은 save 명령이나 bgsave 명령이 마지막으로 성공적으로 실행된 시간을 기록하는 타임스탬프입니다. 🎜🎜 이 두 명령을 사용하면 서버가 수정 작업을 성공적으로 수행하면 더티 카운터가 1씩 증가하고 lastsave 속성은 마지막으로 save 또는 bgsave가 실행된 시간을 기록합니다. Redis 서버에는 주기적 작업 기능인 severCron도 있습니다. 기본값은 매 100밀리초마다 실행됩니다. 이 함수는 saveparams 배열의 모든 저장 조건을 순회하여 확인하며 하나의 조건이 충족되는 한 bgsave 명령이 실행됩니다. 🎜🎜 실행이 완료된 후 더티 카운터는 0으로 업데이트되고, lastsave도 실행된 명령의 완료 시간으로 업데이트됩니다. 🎜

위 내용은 Redis의 RDB 지속성에 대한 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제