Redis AOF日志

1. 如何写日志?

  • 记录增删改命令;
  • 在命令执行之后写日志,避免无效命令的检查开销;

2. 三种回写策略(保存到磁盘)

  • Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘;优点是最多只会丢失上一次操作的日志,缺点是每次都需要写到磁盘,这种操作比较慢;
  • Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;是一种这种的解决方案;
  • No,操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。优点是避免每次都写磁盘,提高了性能,但是如果down机,丢失的日志也会相比其他俩种更多。

3. 日志重写

写日志带来的一些潜在问题:

  • 文件系统本身对文件大小有限制,无法保存过大的文件;
  • 如果文件太大,之后再往里面追加命令记录的话,效率也会变低;
  • 如果发生宕机,AOF 中记录的命令要一个个被重新执行,用于故障恢复,如果日志文件太大,整个恢复过程就会非常缓慢,这就会影响到 Redis 的正常使用。
  • 日志重写就是为了解决上面的问题,将数据库现有的数据重新写入到新的日志文件中,使其保持最新的状态。

4. 日志重写过程

  • 1. 主线程fork出后台的bgrewriteaof子进程,此过程会从主进程将进程的页表拷贝给子进程;
  • 2. 为bgrewriteaof子进程分配日志缓冲内存区;
  • 3. 主进程处理新的操作时,会继续写正在使用的日志,同时把操作写入到以上缓冲区;
  • 4. 子进行进行日志的重写(其实是读取当前数据库的最新数据写到日志中);
  • 5. 子进程完成日志合并压缩后,向主进程发送一个信号;
  • 6. 主进程将缓冲区的数据写入到心的日志文件,并替换原有旧的日志文件;
posted @ 2020-12-01 11:33  少羽大怪兽  阅读(283)  评论(0编辑  收藏  举报