美文网首页
Redis数据持久化到硬盘

Redis数据持久化到硬盘

作者: 奇点一氪 | 来源:发表于2018-12-19 14:46 被阅读15次

    Redis为持久化提供了两种方式:

    • RDB:在指定的时间间隔能对你的数据进行快照存储。
    • AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。

    而手动执行持久化命令,你依然有两种选择,那就是save命令和bgsave命令。

    本文将通过下面内容的介绍,希望能够让大家更全面、清晰的认识这两种持久化方式,同时理解这种保存数据的思路,应用于自己的系统设计中。

    • 持久化的配置
    • RDB与AOF持久化的工作原理
    • 如何从持久化中恢复数据
    • 关于性能与实践建议

    持久化的配置

    为了使用持久化的功能,我们需要先知道该如何开启持久化的功能。

    RDB的持久化配置

    # 时间策略
    save 900 1
    save 300 10
    save 60 10000
    
    # 文件名称
    dbfilename dump.rdb
    
    # 文件保存路径
    dir /home/work/app/redis/data/
    
    # 如果持久化出错,主进程是否停止写入
    stop-writes-on-bgsave-error yes
    
    # 是否压缩
    rdbcompression yes
    
    # 导入时是否检查
    rdbchecksum yes
    

    配置其实非常简单,这里说一下持久化的时间策略具体是什么意思。

    • save 900 1 表示900s内如果有1条是写入命令,就触发产生一次快照,可以理解为就进行一次备份
    • save 300 10 表示300s内有10条写入,就产生快照
      下面的类似,那么为什么需要配置这么多条规则呢?因为Redis每个时段的读写请求肯定不是均衡的,为了平衡性能与数据安全,我们可以自由定制什么情况下触发备份。所以这里就是根据自身Redis写入情况来进行合理配置。

    stop-writes-on-bgsave-error yes 这个配置也是非常重要的一项配置,这是当备份进程出错时,主进程就停止接受新的写入操作,是为了保护持久化的数据一致性问题。如果自己的业务有完善的监控系统,可以禁止此项配置, 否则请开启。

    关于压缩的配置 rdbcompression yes ,建议没有必要开启,毕竟Redis本身就属于CPU密集型服务器,再开启压缩会带来更多的CPU消耗,相比硬盘成本,CPU更值钱。

    当然如果你想要禁用RDB配置,也是非常容易的,只需要在save的最后一行写上:save ""

    (默认下,持久化到dump.rdb文件,并且在redis重启后,自动读取其中文件,据悉,通常情况下一千万的字符串类型键,1GB的快照文件,同步到内存中的 时间是20-30秒)

    bgSave则是调用Fork,产生子进程,父进程继续处理请求。子进程将数据写入临时文件,并在写完后,替换原有的.rdb文件。Fork发生时,父子进程内存共享,所以为了不影响子进程做数据快照,在这期间修改的数据,将会被复制一份,而不进共享内存。所以说,RDB所持久化的数据,是Fork发生时的数据。在这样的条件下进行持久化数据,如果因为某些情况宕机,则会丢失一段时间的数据。如果你的实际情况对数据丢失没那么敏感,丢失的也可以从传统数据库中获取或者说丢失部分也无所谓,那么你可以选择RDB持久化方式。

    AOF的配置

    # 是否开启aof
    appendonly yes
    
    # 文件名称
    appendfilename "appendonly.aof"
    
    # 同步方式
    appendfsync everysec
    
    # aof重写期间是否同步
    no-appendfsync-on-rewrite no
    
    # 重写触发配置
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    # 加载aof时如果有错如何处理
    aof-load-truncated yes
    
    # 文件重写策略
    aof-rewrite-incremental-fsync yes
    

    还是重点解释一些关键的配置:

    appendfsync everysec它其实有三种模式:

    • always:把每个写命令都立即同步到aof,很慢,但是很安全
    • everysec:每秒同步一次,是折中方案
    • no:redis不处理交给OS来处理,非常快,但是也最不安全

    一般情况下都采用 everysec 配置,这样可以兼顾速度与安全,最多损失1s的数据。
    aof-load-truncated yes如果该配置启用,在加载时发现aof尾部不正确是,会向客户端写入一个log,但是会继续执行,如果设置为 no ,发现错误就会停止,必须修复后才能重新加载。

    创建快照的方式“

    • 手动save
    • 手动bgsave
    • save配置项:save 60 1000 当redis在 满足在60s内操作Redis达到1000次就会存储一次,自动存储
    • 在执行shutdown关闭服务器时会执行一次save命令阻塞所有客户端实行命令;
    • 当Redis在连接另外一台redis服务器执行sync命令来开始一次复制操作时,那么主服务器会执行bgsave命令

    相关文章

      网友评论

          本文标题:Redis数据持久化到硬盘

          本文链接:https://www.haomeiwen.com/subject/alalkqtx.html