redis持久化之RDP和AOF
先来解释一下
RDP和AOF都是redis持久化模式
说原理之前先说下 save 900 1 的含义 代表900 秒内如果至少有 1 个 key 的值变化,则保存(想了解redis.conf配置含义 https://www.cnblogs.com/pqchao/p/6558688.html)
RDP原理:save 1 1为例 12:00的数据为100条 100条会存储到RDP文件中 12:01的数据为200条时候 200条会存储到RDP文件中 (或者说从内存存到磁盘中)会造成丢失很多数据
AOF原理:
1 redis本来有100w条 都会记录到AOF文件中 但是因为redis中有lru清除缓存 导致了AOF中的数据相关的指令日志就比原redis内存中存的数据多 导致AOF很大
2 等AOF文件达到一定量时 redis会重新创建一个AOF文件 吧redis中最新的数据指令日志写到AOF中
3 这样AOF中的数据指令日志都是最新的
以下配置都是在redis.conf中
RDP:redis默认开启的持久化模式, save 1 1是我自己测试的 , 如果想关闭RDP 可以 把 save “” 放开 ,把下面的注释掉就可以了。
AOF:默认不开启
配置
appendonly yes
appendfsync always appendfsync everysec appendfsync no
aof持久化策略的配置
no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
always表示每次写入都执行fsync,以保证数据同步到磁盘。
everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
no-appendfsync-on-rewrite no
在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,
执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。
如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。
设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。
Linux的默认fsync策略是30秒。可能丢失30秒数据。
auto-aof-rewrite-percentage 100
aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,
即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。
当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
aof-load-truncated yes
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。
重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象
redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。
如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。
如果是no,用户必须手动redis-check-aof修复AOF文件才可以。
aof配置结合自己的项目情况配置
一般rpd和aof都会开启 这样来确保数据万无一失