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


  • 备份现在 AOF 文件,以防万一 。
  • 使用 redis-check-aof 命令修复 AOF 文件,该命令格式如下:
# 修复aof日志文件 $ redis-check-aof -fix file.aof
  • 重启 Redis 服务器,加载已经修复的 AOF 文件,恢复数据 。
AOF 的优点:
  • AOF 只是追加日志文件,因此对服务器性能影响较小,速度比 RDB 要快,消耗的内存较少 。
AOF 的缺点:
  • AOF 方式生成的日志文件太大,即使通过 AFO 重写,文件体积仍然很大 。
  • 恢复数据的速度比 RDB 慢 。
选择 RDB 还是 AOF 呢?
通过上面的介绍,我们了解了 RDB 与 AOF 各自的优点与缺点,到底要如何选择呢?
通过下面的表示,我们可以从几个方面对比一下 RDB 与 AOF,在应用时,要根据自己的实际需求,选择 RDB 或者 AOF 。
其实,如果想要数据足够安全,可以两种方式都开启,但两种持久化方式同时进行 IO 操作,会严重影响服务器性能,因此有时候不得不做出选择 。
 
10分钟彻底理解Redis持久化和主从复制

文章插图
 
 
当 RDB 与 AOF 两种方式都开启时,Redis 会优先使用 AOF 日志来恢复数据,因为 AOF 保存的文件比 RDB 文件更完整 。
小结:上面讲了一大堆 Redis 的持久化机制的知识,其实,如果你只是单纯把 Redis 作为缓存服务器,那么可以完全不用考虑持久化 。
但是,在如今的大多数服务器架构中,Redis 不单单只是扮演一个缓存服务器的角色,还可以作为数据库,保存我们的业务数据,此时,我们则需要好好了解有关 Redis 持久化策略的区别与选择 。
什么是 Reids 主从复制?
上面,我们了解了 Redis 两种不同的持久化方式,Redis 服务器通过持久化,把 Redis 内存中持久化到硬盘当中,当 Redis 宕机时,我们重启 Redis 服务器时,可以由 RDB 文件或 AOF 文件恢复内存中的数据 。
不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或 CPU 坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故障时数据的安全性?或者可以快速恢复数据呢?
想做到这一点,我们需要再了解 Redis 另外一种机制:主从复制 。
Redis 的主从复制机制是指可以让从服务器(Slave)能精确复制主服务器(Master)的数据,如下图所示:
 
10分钟彻底理解Redis持久化和主从复制

文章插图
 
 
上面的图表示的是一台 Master 服务器与 Slave 服务器的情况,其实一台 Master 服务器也可以对应多台 Slave 服务器,如下图所示:
 
10分钟彻底理解Redis持久化和主从复制

文章插图
 
 
另外,Slave 服务器也可以有自己的 Slave 服务器,这样的服务器称为 Sub-Slave 。
而这些 Sub-Slave 通过主从复制最终数据也能与 Master 保持一致,如下图所示:
 
10分钟彻底理解Redis持久化和主从复制

文章插图
 
 
主从复制的方式和工作原理
Redis 的主从复制是异步复制,异步分为两个方面:
  • 一个是 Master 服务器在将数据同步到 Slave 时是异步的,因此 Master 服务器在这里仍然可以接收其他请求 。
  • 一个是 Slave 在接收同步数据也是异步的 。
①复制方式
Redis 主从复制分为以下三种方式:
  • 当 Master 服务器与 Slave 服务器正常连接时,Master 服务器会发送数据命令流给 Slave 服务器,将自身数据的改变复制到 Slave 服务器 。
  • 当因为各种原因 Master 服务器与 Slave 服务器断开后,Slave 服务器在重新连上 Master 服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制 。
  • 如果无法部分同步(比如初次同步),则会请求进行全量同步,这时 Master 服务器会将自己的 RDB 文件发送给 Slave 服务器进行数据同步,并记录同步期间的其他写入,再发送给 Slave 服务器,以达到完全同步的目的,这种方式称为全量复制 。
②工作原理
Master 服务器会记录一个 Replication Id 的伪随机字符串,用于标识当前的数据集版本,还会记录一个当数据集的偏移量 Offset 。
不管 Master 是否有配置 Slave 服务器,Replication Id 和 Offset 会一直记录并成对存在,我们可以通过以下命令查看 Replication Id和 Offset:
> info repliaction 通过 redis-cli 在 Master 或 Slave 服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同):


推荐阅读