Redis-rdb持久化

时间:2023-03-09 01:58:28
Redis-rdb持久化

Redis实现快照的过程

  1. redis调用fork,现在有了子进程和父进程
  2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文. 由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面, 当父进程处理写请求时os会为父进程要修改的页面创建副本, 而不是写共享的页面, 所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照(是不是类似于python中使用os模块创建子进程???)
  3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件, 然后子进程退出

注:

  • client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求, 所以不推荐使用.
  • 另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
  • 另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式

数据备份

使用SAVE命令保存数据或使用BGSAVE在后台保存

127.0.0.1:6379> SAVE
OK
127.0.0.1:6379>

该命令将在redis目录中创建dump.rdb文件

数据恢复

将备份文件(dump.rdb)移动到redis安装目录并启动服务

获取redis目录使用如下命令

127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/home/ql"
127.0.0.1:6379>

持久化: 把数据存储于断电后不会丢失的设备中, 通常是硬盘

常见持久化方式:

主从: 通过从服务器保存和持久化, 如mongoDB的replication sets配置

日志: 操作生成相关日志, 并通过日志来恢复数据

rdb工作原理:

每隔N分钟或N次写(新增或改变)操作后, 从内存dump数据形成rdb文件, 压缩, 放在备份目录

: 红色部分可以通过参数来配置

rdb快照相关参数

save 900 1    #刷新快照到硬盘中, 必须满足两者要求才会触发, 及900秒内至少1个关键字发生变化
save 300 10 #必须是300秒内至少10个关键字发生变化
save 60 10000 #必须是60秒内至少10000个关键字发生变化
#以上三个选项都屏蔽, 则rdb被禁用 stop-writes-on-bgsave-error yes #后台存储错误停止写
rdbcompression yes #使用LZF压缩rdb文件
rdbchecksum yes #存储和加载rdb文件时校验
dbfilename dump.rdb #设置rdb文件名
dir ./ #设置工作目录, rdb文件会写入该目录

rdb缺陷

在两个保存点之间突然断电, 则会丢失两个保存点之间的数据

出于对持久化的更精细要求, redis增添了 aof方式 (append only file)