Redis持久化

Redis持久化

持久化是为了数据重用或者防止系统崩溃后数据丢失,甚至就是保存计算后的结果方便使用等。redis支持两种方式来进行持久化将数据写入磁盘,分别是 快照以及aof。

1.快照

  • 什么是快照

    快照就是获取存储在内存中的数据在某个时间点的副本,在创建快照后,用户可以对快照进行备份,可以将快照放到其余服务器上进行恢复数据或者创建数据,还可以放在本地,方便系统重启后恢复数据

  • 如何触发快照

    1. 通过redis.conf配置文件中配置 save 触发选项来触发,第二个参数表示多长时间,以秒为单位,第三个参数是写入次数,例如 save 60 10000 意思是 在60秒内写入了10000次就会触发 快照,如果设置了多个save,则只要满足其中要给条件都会创建一个快照

    2. 在redis客户端执行 bgsave 命令,服务器在接收到该命令后不会阻塞客户端的请求,会fork一个子进程来对数据进行备份

    3. 在redis客户端执行 save命令,服务器在接收到该命令后会停止接收客户端请求,知道备份完成后才会继续接收客户端请求,一般该方法使用不多,在服务器内存不够用的情况下,执行save命令

    4. 在使用shutdown等命令后,服务端会立即使用 save命令模式,不再接受任何而客户端请求,等待备份完成后关系服务器

    5. 当有两台服务器,其中一台服务器连接另一个服务器,并发送了一个 sync同步命令后,那么主服务器会执行 bgsave模式

  • 快照的优处

    1. 通过快照的方式可以生成多个储存文件,将这些文件放到别的服务器上可以快速恢复数据。
    2. 生成快照占用io资源少,不用频繁写操作,只用fork一个子线程操作即可。
    3. 相对于aof方式来说,直接基于快照的方式恢复和重启redis进程更加快速。
  • 快照的劣势

    1. 快照默认是根据某个时间段写入频率来触发创建,这意味着如果在创建一个快照后,还没有到下一次快照创建前,写入了假如20个key,redis服务器异常断开,那么这段时间内的 20个key 数据将会全部丢失,不能保证数据完整性。
    2. 当快照文件比较大以后,每次创建新的快照,会导致对客户端的服务暂停数毫秒,甚至数秒。

2.AOF

  • 什么是AOF

    aof是将redis的写操作以日志记录的形式追加到 aof文件中保存,每次有写操作,都会向该文件追加,因此,redis重启或恢复数据都是将aof中的记录的命令重新全部执行一次达到恢复数据的目的

  • 如何开启aof

    1. 配置 appendonly yes 来开启
    2. 通过配置 appendsync 选项来 决定同步频率, appendsync 对应有三个选项
      1. always:每个redis写命令都是记录追加到aof文件,这样会严重降低redis的速度
      2. everysec:每秒执行一次同步,显式的将多个写命令同步到硬盘
      3. no:让操作系统来决定应该何时进行同步
  • AOF的优处

    1. 一般配置每秒进行写入同步,这样可以很好的数据的完整性,最多只会丢失一秒的数据
    2. aof日志文件以appendonly模式写入,所有没有任何磁盘寻址的开销,可以很快找到文件并写入文件,而且文件不容易破损,且还可以修复
    3. 当aof文件过大的时候,可能会出现后台重写操作,也不会影响客户端的使用,在创建新的日志文件时候,会将老文件压缩,提取恢复数据的最小日志出来。
  • AOF的劣势

    1. 针对快照来说,aof文件相对要大得多
    2. 每秒写入文件,性能相对快照而言相对会降低,但还是很快
    3. 以前AOF出现bug,就是通过aof日志恢复数据,没有恢复的一摸一样,所以相对快照这种稳定的恢复数据方式来说更加脆弱一点。

3.如何抉择

  1. 不要只用快照,因为这样可能会导致丢失很多数据
  2. 不要只用aof,因为使用aof做冷备没有使用快照做冷备恢复数据来的快,并且没有快照稳定
  3. 因此,最好两者都使用。使用aof保证数据不丢失,作为恢复数据的第一选择。用快照用不同程度的冷备,在aof文件丢失或者损坏的情况下还可以使用快照进行恢复。
posted @ 2018-06-07 23:43  风中追风_lonely  阅读(183)  评论(0编辑  收藏  举报