Redis AOF日志
AOF日志实现过程
先执行客户端命令,将数据写入内存,再记录日志文件。
AOF日志内容
以一条客户端命令 set testKey testValue
为例,AOF日志内容如下:
1 | *3 |
其中,*3
表示当前命令由3个部分组成,$ 数字 表示这部分命令、健、值占多少字节
为了避免额外开销,Redis在向AOF里面记录日志的时候,并不会先去对这些命令进行语法检查,所以,如果先记日志,再执行命令的话,日志中就有可能记录了错误的命令,在恢复数据的时候就有可能出错。
因此Redis的这种先执行命令再记录日志的方式可以避免出现记录错误命令的情况。
AOF另一个好处就是先执行完命令之后才去记录日志,不会阻塞当前的写操作。
AOF潜在的风险
先执行命令,后记录日志。如果在命令执行后就宕机了,那么这部分命令便无法被记录在日志中,会造成数据丢失。
AOF操作也是在主线程中进行的,如果将日志文件写入磁盘时,磁盘压力大,可能会阻塞下一个写操作。
三种写回策略
AOF配置项appendfsync的三个可选值
- Always 客户端每个写命令执行完,立马同步写回磁盘
- Everysec 客户端每个写命令执行完,先把日志写到AOF文件的内存缓存区,每隔1秒将内存缓冲区的内容写入到磁盘
- No 客户端每个写命令执行完,先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写入到磁盘
日志文件太大怎么办
如果日志文件太大,系统恢复时Redis要执行大量命令,整个恢复过程就会非常慢。
Redis通过AOF重写机制 来减小日志文件。在重写时,通过读取旧的命令,在一个key值被修改多次以后,Redis会记录该值最新的状态,因此会把原来的文件变小。同时,和AOF日志由主线程写回不同,AOF重写过程是由后台子进程 bgrewriteaof 来完成的。