>  기사  >  데이터 베이스  >  Redis의 RDB 지속성에 대한 자세한 설명

Redis의 RDB 지속성에 대한 자세한 설명

尚
앞으로
2019-11-30 16:08:461964검색

Redis의 RDB 지속성에 대한 자세한 설명

Memcache와 같은 다른 캐싱 제품과 비교하여 Redis는 단순한 키-값 유형 데이터를 지원할 뿐만 아니라 list, set, zset, hash와 같은 데이터 구조의 저장도 제공한다는 점에서 분명한 이점을 가지고 있습니다. 우리는 이러한 풍부한 데이터 유형을 자세히 소개하는 두 개의 기사를 썼습니다. 다음으로 Redis의 또 다른 주요 이점인 지속성을 소개하겠습니다. (추천: redis 동영상 튜토리얼)

Redis는 인메모리 데이터베이스이기 때문에 소위 인메모리 데이터베이스는 데이터베이스의 내용을 메모리에 저장하는 방식입니다. 이는 MySQL, Oracle과 같은 기존 관계형 데이터베이스와 다릅니다. , 기존 데이터베이스와 비교하여 메모리 내 데이터베이스의 읽기 및 쓰기 효율성은 기존 데이터베이스보다 훨씬 빠릅니다(메모리의 읽기 및 쓰기 효율성은 읽기 및 쓰기보다 훨씬 높습니다). 하드 디스크의 효율성). 그러나 메모리에 저장하면 단점도 발생합니다. 전원이 꺼지거나 컴퓨터가 다운되면 메모리 데이터베이스의 모든 데이터가 손실됩니다.

이러한 단점을 해결하기 위해 Redis는 메모리 데이터를 하드 디스크에 유지하고 영구 파일을 사용하여 데이터베이스 데이터를 복원하는 기능을 제공합니다. Redis는 두 가지 형태의 지속성을 지원합니다. 하나는 RDB 스냅샷(스냅샷)이고 다른 하나는 AOF(추가 전용 파일)입니다. 이 블로그에서는 먼저 RDB 스냅샷을 소개합니다.

1. RDB 소개

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

맨 위로

2. 트리거링 방법

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

①, automatic Trigger

redis.conf 구성 파일의 SNAPSHOTTING 아래

Redis의 RDB 지속성에 대한 자세한 설명

①, 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 지속성이 필요한 경우 모든 저장 라인을 주석 처리하여 저장을 비활성화할 수 있습니다. 비활성화하려면 빈 문자열을 직접 사용할 수 있습니다. save ""

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

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

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

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

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

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

②. 수동 트리거

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

1. 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 行来停用保存功能或者直接一个空字符串来实现停用:save ""

也可以通过命令:

redis-cli config set save " "

回到顶部

5、RDB 的优势和劣势

①、优势

1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。

2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

②、劣势

1、RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁执行成本过高(影响性能)

2、RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题(版本不兼容)

3、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)

回到顶部

6、RDB 自动保存的原理

Redis有个服务器状态结构:

struct redisService{
     //1、记录保存save条件的数组
     struct saveparam *saveparams;
     //2、修改计数器
     long long dirty;
     //3、上一次执行保存的时间
     time_t lastsave;
 
}

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

struct saveparam{
     //秒数
     time_t seconds;
     //修改数
     int changes;
};

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

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

那么服务器状态中的saveparam 数组将会是如下的样子:

Redis의 RDB 지속성에 대한 자세한 설명

②、dirty 计数器和lastsave 属性

dirty 计数器记录距离上一次成功执行 save 命令或者 bgsave 命令之后,Redis服务器进行了多少次修改(包括写入、删除、更新等操作)。

lastsave 属性是一个时间戳,记录上一次成功执行 save 命令或者 bgsave 命令的时间。

通过这两个命令,当服务器成功执行一次修改操作,那么dirty 计数器就会加 1,而lastsave 属性记录上一次执行save或bgsave的时间,Redis 服务器还有一个周期性操作函数 severCron ,默认每隔 100 毫秒就会执行一次,该函数会遍历并检查 saveparams 数组中的所有保存条件,只要有一个条件被满足,那么就会执行 bgsave 命令。

执行完成之后,dirty 计数器更新为 0 ,lastsave 也更新为执行命令的完成时间。

更多redis知识请关注redis数据库教程栏目。

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

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