一简介:
rdb是redis持久化策略的选择之一,让我们来一探究竟
二 核心设计思路
核心思路:fork一个子进程,只有在父进程发生写操作修改内存数据时,才会真正去分配内存空间,并复制内存数据,而且也只是复制被修改的内存页中的数据,并不是全部内存数据,所以内存数据快照说法并不标准,应该来说是单位时间内改变的内存数据快照
三 CopyOnWrite(简称cow) 好处:
1、减少分配和复制资源时带来的瞬时延迟;
2、减少不必要的资源分配,假如整体资源是10G,redis现有使用率是5G,那么fork一个子进程拷贝rdb到磁盘并不是5G,而是改变数据的大小
四 CopyOnWrite的缺点:
如果父子进程都需要进行大量的写操作,会产生大量的分页错误(页异常中断page-fault)
五 RDB参数
0 save 900 1 15分钟->1 key
save 300 10 5分钟->10 key
save 60 10000 1分钟->1W key
1 rdbcompression 默认打开
2 rdbchecksum 默认打开
3 dbfilename dir 路径 名称 元数据 默认当前目录下
六 需要注意点
1 rdb本身是二进制文件,不可手工进行读取
2 rdb本身可以手动触发 save(阻塞型) bgsave(非阻塞型)
3 rdb本身可以进行冷拷贝,在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的
4 rdb的恢复效率是远远高于aof的
5 rdb只有在单位时间内至少N个key改变才会生成快照
七 缺点
1 rdb没办法做到实时备份,会丢失掉最后一次快照之后的数据
2 rdb 的动作(生成快照,备份文件压缩 checksum)都会消耗cpu资源,快照本身也会消耗内存资源
八 相关错误
ERROR error==redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
相关参数
stop-writes-on-bgsave-error 默认值YES 作用 当RDB持久化失败时会阻止写入,这是一种REDIS的RDB自我保护机制,当因为内存 OR 磁盘导致RDB持久化失败时,redis会认为备份既然无法正常运行,就必须阻止操作,优先解决RDB生成问题 常出现在内存不够(rdb也需要一部分内存) 磁盘问题(磁盘只读 OR 磁盘已满) 两种情况,不建议放大RDB的快照时间