1.RDB现存问题
耗时耗性能
O(n)数据:耗时
fork():消耗内存,copy-on-write策略
Disk I/O: I/O性能
不可控丢失数据
时间 | save |
T1 |
执行多个写命令 |
T2 | 满足RDB自动创建的条件 |
T3 | 再次执行多个写命令 |
T4 | 宕机 |
T3和T4之间的数据丢失
2.AOF原理
Redis将所有写入命令及其参数记录到AOF文件,当服务器宕机过后启用,重新执行AOF文件中的命令
Redis将写命令记录到AOF的过程
Redis-server ————Redis命令及参数——————》AOF程序————将命令转换为网络通讯协议的格式追加到AOF缓存——————》AOF缓存—————将命令写入AOF文件的末尾—————》AOF————满足设定的AOF保存条件————》调用fsync或fdatasync函数将文件真正保存到磁盘
3.文件的写入和保存
WIRTE:根据条件,将aof_buf中的缓存写入到AOF文件末尾
SAVE:根据条件,调用fsync或fdatasync函数将AOF文件保存到磁盘中
4.AOF保存策略
AOF_FSYNC_NO 跟随系统
该策略下,Redis被关闭、AOF功能被关闭、系统的写缓存被刷新三种情况执行SAVE
AOF_FSYNC_EVERYSEC 每一秒保存一次
该策略下,原则上每隔一秒钟就会执行一次,但实际情况中并非如此
执行SAVE的四种情况
子线程正在执行
这个SAVE执行时间未超过2秒,程序执行WRITE,程序直接返回,不执行WRITE或新的SAVE,发生故障,用户损失小于2秒内的数据
SAVE执行超过2秒,程序执行WRITE,不执行新SAVE,WRITE必须等待执行旧SAVE执行完才能执行,这里有阻塞,发生故障,会损失超过2秒的数据
上次成功执行SAVE距现在不超过1秒,程序执行WRITE,但不执行SAVE
上次成功执行SAVE距离现在超过1秒,程序执行WRITE和SAVE
AOF_FSYNC_ALWAS 每执行一个命令保存一次
这种策略下,没执行一条命令都有主进程执行WRITE和SAVE操作,SAVE执行期间,主进程会被阻塞,不能处理请求。
5.三种保存策略的对比
模式 | WITE是否阻塞? | SAVE是否阻塞? | 停机时丢失的数据 |
AOF_FSYNC_NO | 是 | 是 | 操作系统最后一次对AOF文件触发SAVE操作之后的数据 |
AOF_FSYNC_EVERYSEC | 是 | 否 | 一般情况下不超过2秒的数据 |
AOF_FSYNC_ALWAS | 是 | 是 | 最多只丢失一条命令 |