10分钟彻底理解Redis持久化和主从复制( 二 )

  • 完成数据写入,用临时文代替代正式 RDB 文件 。
  • 删除原来的 DB 文件 。
  • RDB 默认生成的文件名为 dump.rdb,当然,我可以通过配置文件进行更加详细配置 。
    比如在单机下启动多个 Redis 服务器进程时,可以通过端口号配置不同的 RDB 名称,如下所示:
    # 是否压缩rdb文件 rdbcompression yes# rdb文件的名称 dbfilename redis-6379.rdb# rdb文件保存目录 dir ~/redis/ RDB的几个优点:
    • 与 AOF 方式相比,通过 RDB 文件恢复数据比较快 。
    • RDB 文件非常紧凑,适合于数据备份 。
    • 通过 RDB 进行数据备份,由于使用子进程生成,所以对 Redis 服务器性能影响较小 。
    RDB 的几个缺点:
    • 如果服务器宕机的话,采用 RDB 的方式会造成某个时段内数据的丢失,比如我们设置 10 分钟同步一次或 5 分钟达到 1000 次写入就同步一次,那么如果还没达到触发条件服务器就死机了,那么这个时间段的数据会丢失 。
    • 使用 Save 命令会造成服务器阻塞,直接数据同步完成才能接收后续请求 。
    • 使用 Bgsave 命令在 Forks 子进程时,如果数据量太大,Forks 的过程也会发生阻塞,另外,Forks 子进程会耗费内存 。
    AOF
    聊完了 RDB,来聊聊 Redis 的另外一个持久化方式:AOF(Append-only file) 。
    与 RDB 存储某个时刻的快照不同,AOF 持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以 Redis 协议追加保存到以后缀为 AOF 文件末尾 。
    在 Redis 服务器重启时,会加载并运行 AOF 文件的命令,以达到恢复数据的目的 。
     
    10分钟彻底理解Redis持久化和主从复制

    文章插图
     
     
    ①开启 AOF 持久化方式
    Redis 默认不开启 AOF 持久化方式,我们可以在配置文件中开启并进行更加详细的配置,如下面的 redis.conf 文件:
    # 开启aof机制 appendonly yes# aof文件名 appendfilename "appendonly.aof"# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no appendfsync always# 默认不重写aof文件 no-appendfsync-on-rewrite no# 保存目录 dir ~/redis/ ②三种写入策略
    在上面的配置文件中,我们可以通过 appendfsync 选项指定写入策略,有三个选项:
    appendfsync always # appendfsync everysec # appendfsync no always:客户端的每一个写操作都保存到 AOF 文件当中,这种策略很安全,但是每个写操作都有 IO 操作,所以也很慢 。
    everysec:appendfsync 的默认写入策略,每秒写入一次 AOF 文件,因此,最多可能会丢失 1s 的数据 。
    no:Redis 服务器不负责写入 AOF,而是交由操作系统来处理什么时候写入 AOF 文件 。更快,但也是最不安全的选择,不推荐使用 。
    ③AOF 文件重写
    AOF 将客户端的每一个写操作都追加到 AOF 文件末尾,比如对一个 Key 多次执行 Incr 命令,这时候,AOF 保存每一次命令到 AOF 文件中,AOF 文件会变得非常大 。
    incr num 1 incr num 2 incr num 3 incr num 4 incr num 5 incr num 6 ... incr num 100000 AOF 文件太大,加载 AOF 文件恢复数据时,就会非常慢,为了解决这个问题,Redis 支持 AOF 文件重写 。
    通过重写 AOF,可以生成一个恢复当前数据的最少命令集,比如上面的例子中那么多条命令,可以重写为:
    set num 100000 【10分钟彻底理解Redis持久化和主从复制】AOF 文件是一个二进制文件,并不是像上面的例子一样,直接保存每个命令,而使用 Redis 自己的格式,上面只是方便演示 。
    两种重写方式:通过在 redis.conf 配置文件中的选项 no-appendfsync-on-rewrite 可以设置是否开启重写 。
    这种方式会在每次 Fsync 时都重写,影响服务器性能,因此默认值为 no,不推荐使用 。
    # 默认不重写aof文件 no-appendfsync-on-rewrite no 客户端向服务器发送 bgrewriteaof 命令,也可以让服务器进行 AOF 重写 。
    # 让服务器异步重写追加aof文件命令 > bgrewriteaof AOF 重写方式也是异步操作,即如果要写入 AOF 文件,则 Redis 主进程会 Forks 一个子进程来处理,如下所示:
     
    10分钟彻底理解Redis持久化和主从复制

    文章插图
     
     
    重写 AOF 文件的好处:
    • 压缩 AOF 文件,减少磁盘占用量 。
    • 将 AOF 的命令压缩为最小命令集,加快了数据恢复的速度 。
    ③AOF 文件损坏
    在写入 AOF 日志文件时,如果 Redis 服务器宕机,则 AOF 日志文件文件会出格式错误 。
    在重启 Redis 服务器时,Redis 服务器会拒绝载入这个 AOF 文件,可以通过以下步骤修复 AOF 并恢复数据:


    推荐阅读