redis之持久化

Redis是一个高性能的key-value的存储系统,数据都存在内存里面,如果突然宕机,那么数据全部消失,所以redis提供了一种持久化的机制,以保证数据不会因为故障而丢失。

目录

持久化机制

1.RDB模式:

什么时候会出现rdb模式的备份

2.AOF模式

如何处理aof文件太大?

操作系统的COW机制


持久化机制

  1. RDB模式(快照):就是一次全量备份,就是讲内存的数据进行二进制序列化后在磁盘上紧凑存储的方式。
  2. AOF模式:增量日志,记录了redis的内存修改指令。

 

1.RDB模式:

当redis需要保存dump.rdb文件时,服务器会进行以下的操作

  • redis会再fork一个子进程,子进程用来处理快照持久化,并不会去修改内存的数据
  • 父进程继续接受客户端的指令,虽然会修改内存数据,但是运用操作系统的COW机制,并不影响子进程
  • 子进程只需要将数据写入一个临时的dump.rdb文件中
  • 当子进程完成后,将新的rdb文件替换之前的rdb文件

 

什么时候会出现rdb模式的备份

save 900 1
save 300 10
save 60 10000
  • 自动:默认情况下,在redis.conf文件中,redis的配置是每900秒有一次更新,300秒有10次更新或者是60秒有10000次的更新自动会有rdb的备份。
  • 主动:客户端主动发起rdb备份
    • save指令:阻塞客户端主进程,此时不能处理任何客户端的请求
    • bgsave指令:后台fork一个进程去处理备份,不阻塞主进程,能处理客户端请求

 

2.AOF模式

  aof是以日志的形式,将客户端的修改指令写入文件中,为了防止丢失更新,类似mysql的机制,先对指令进行参数比对,没有错误后将指令先写入aof日志中,然后在修改内存中的数据。·

在redis.conf的文件中有如下相关的aof配置

appendonly yes  ## 开始aof日志模式
# appendfsync always ##将每一次更新指令都刷进磁盘
appendfsync everysec ##将每秒更新指令刷进磁盘
# appendfsync no ## 由系统自行决定什么时候将内核的数据写入磁盘中

严格上说,aof写日志是先将指令写入操作系统的缓存,linux提供fsync函数,fsync函数可以指定将缓存强制刷新磁盘,虽然很影响性能,毕竟磁盘IO相对来说比较慢,所以appendfsync的设置影响了你redis的持久化以及redis的性能。

 

如何处理aof文件太大?

  • 自动:redis的配置文件redis.conf中有配置重写aof文件的相关配置

auto-aof-rewrite-percentage 100 ## 与上一次重写aof的文件大小相比,此次增长大小是上一次的多少比例才进行重写
auto-aof-rewrite-min-size 64mb ## 自动重写rdb文件的最小的日志文件大小,自动重写需两个都符合
  • 主动:客户端发送rewriteaof指令,会将aof文件进行压缩,其实就是将多个可以合并的指令变成一个,不影响数据结果。

 

    最后当 redis重启后,会先加载rdb的文件的内容,毕竟rdb文件是某段时间内的全量备份,加载后会读取aof日志文件,以保证数据的一致以及不丢失。

 

题外:

操作系统的COW机制

     写入时复制(Copy-on-write),核心思想,就是多个进程共享一份内存数据,只有当某一个进程需要修改才会拷贝出一份副本供其修改,而其他进程读取的数据不变。所以redis的rdb模式的备份,fork一个子进程,父进程与子进程共享一份数据,只有当父进程需要修改时,将内存数据复制一份供起修改,子进程所看到的内存数据不变,继续将内存数据进行二进制压缩写入磁盘文件中。

你可能感兴趣的:(redis,Redis持久化)