更多内容,欢迎关注微信公众号:全菜工程师小辉~

Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。

RDB

保存数据快照至一个RDB文件中,用于持久化。RDB操作和Mysql Dump相似。

执行方式

  • save。同步操作,会阻塞Redis。
  • bgsave。调用linux的fork(),然后使用新的线程执行复制。但是fork期间也会阻塞Redis,但是阻塞时间通常很短。
  • 自动保存。Redis配置文件中设置了自动保存的触发机制,可以自定义修改,运行原理同bgsave。

save和bgsave的对比

注意:

  • 如果机器上运行多个Redis,需要配置RDB文件名称,否则多个Redis的RDB文件会相互覆盖。

除了上述三种执行方式,以下情况也会生成RDB文件:

  • 主从的全量复制时,主机会生成RDB文件。
  • Redis中的debug reload提供debug级别的重启,不清空内存的一种重启,这种方式也会触发RDB文件的生成。
  • 执行shutdown时,会触发RDB文件的生成。

RDB的缺点

  • 全量数据存储,耗时。
  • 虽然fork()采用copy-on-write策略,但仍消耗内存
  • 写RDB文件消耗大量IO性能。

AOF

采用AOF持久方式时,Redis会把每一个写请求都记录在一个日志文件里,AOF操作和Mysql Binlog相似。通过AOF重写机制减少AOF文件的体积,从而减少恢复时间。

执行方式

  • always。Redis的每条写命令都写入到系统缓冲区,然后每条写命令都使用fsync“写入”硬盘。
  • everysec。过程与always相同,只是fsync的频率为1秒钟一次。这个是Redis默认配置,如果系统宕机,会丢失一秒左右的数据
  • no。由操作系统决定什么时候从系统缓冲区刷新到硬盘。

AOF重写

为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。

AOF重写方式

  • bgrewriteaof(流程与bgsave相似)
  • AOF重写配置(与RDB自动保存相似)

AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。

RDB vs AOF

Redis启动时的数据加载

Redis启动数据加载流程:

  1. AOF持久化开启且存在AOF文件时,优先加载AOF文件。
  2. AOF关闭或者AOF文件不存在时,加载RDB文件。
  3. 加载AOF/RDB文件成功后,Redis启动成功。
  4. AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。

开发运维中常见的问题

fork操作

fork()的实际开销就是复制父进程的页表以及给子进程创建一个进程描述符,所以速度一般比较快

内存量越大,耗时越长;物理机相对较快,虚拟机相对较慢。

优化方法

  1. 优先使用物理机或者高效支持fork操作的虚拟化技术
  2. 控制Redis实例最大可用内存maxmemory
  3. 合理配置Linux内存分配策略:vm.overcommit_memory=1。默认值为0,会使Linux在内存分配时,发现不够内存不足时,不会进行分配,进而造成fork阻塞
  4. 降低fork频率。例如放宽AOF重写自动触发时机或者减少不必要的主从全量复制

进程外开销

  • CPU。RDB和AOF文件生成,属于CPU密集型。不要将Redis进程绑定在某个CPU上,防止单核过载;同时Redis不和CPU密集型应用一起部署。
  • 内存。fork内存开销,copy-on-write。
  • 硬盘。AOF和RDB文件的写入。可以结合iostat和iotop进行分析。

优化方法

  1. 不要和高硬盘负载服务部署在一起:存储服务、消息队列等
  2. 配置no-appendfsync-on-rewrite=yes。这样在AOF重写的期间,不要进行AOF追加操作(主线程只将数据写入缓冲区),可以减少内存的开销。

但如果AOF重写期间,Redis宕机的话,在Linux的系统默认配置下,最多会丢失30s的数据。如果无法忍受数据丢失,no-appendfsync-on-rewrite配置no;如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。

  1. 根据写入量决定磁盘类型:例如ssd
  2. 单机多实例持久化文件目录可以考虑分盘,或者使用类似cgroups机制进行硬盘资源的合理分配

AOF追加阻塞

例如在AOF的everysec策略中,主线程会对比上次fsync的时间,如果距离上次fsync时间超过两秒,就会造成主线程阻塞(等待同步线程同步完成)。

日常开发可以使用info persistence命令,查看历史发生AOF阻塞的次数;然而需要了解AOF追加阻塞的发生时间则需要查看Redis日志。

发送AOF追加阻塞的时候,日志如下:

Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

优化方法(参考其他方面的优化点)

更多内容,欢迎关注微信公众号:全菜工程师小辉~

Redis持久化的原理及优化的更多相关文章

  1. Redis 入门到分布式 (七)Redis复制的原理与优化

    一.目录 Redis复制的原理与优化 什么是主从复制 全量复制和部分复制 复制的配置 故障处理 开发运维常见问题 二. 什么是主从复制 1.单机有什么问题? 单机如果机器故障,那么久无法及时提供服务: ...

  2. Redis持久化——问题定位与优化(三)

    核心知识点: 1.fork操作 a.在RDB或AOF重写时,会执行fork操作创建子进程,fork操作是一个重量级操作. b.改善fork操作耗时的手段:避免使用Xen.配置Redis实例最大使用内存 ...

  3. redis从入门到高可用 Redis复制的原理与优化

    需要的联系我,QQ:1844912514

  4. redis分布式锁原理与实现

    分布式锁原理 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候, ...

  5. redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化

    redis持久化策略 1.数据文件.rdb 2.更新日志.aof 设置aof 1.命令方式config set appendonly noconfig rewrite2.配置文件方式 redis持久化 ...

  6. Redis持久化RDB和AOF原理

    前言: redis持久化方式分为两种:RDB快照和AOF方式(默认为RDB模式),当Redis服务器重启的时候,会自动恢复数据,优先从AOF中恢复,其次才从RDB中恢复   一.RDB快照模式 RDB ...

  7. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  8. Redis持久化 aof和rdb的原理配置

    目录 一.介绍 二.RDB持久化(全量写入) rdb原理 rdb模式 rdb触发情况 rdb优势和劣势 rdb文件配置 rdb命令配置 rdb数据恢复 三.AOF持久化(增量写入) aof原理 aof ...

  9. redis的持久化的原理介绍和实现

    redis提供了持久化功能——RDB和AOF.通俗的讲就是将内存中的数据写入硬盘中. RDB一定时间取存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用 一.RDB(Redis Data ...

随机推荐

  1. GCD和扩展GCD

    gcd(a, b)用于求解自然数a,b的最大公约数 int gcd(int a, int b) { ) return a; return gcd(b, a%b); } extgcd(a, b, x, ...

  2. 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧

    一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...

  3. vim中 E212:无法打开并写入文件的解决办法

    很简单,就是用管理员身份打开这个文件 不要被网上的一些乱七八糟的迷惑了 sudo vim ....... 解决了问题请点个赞,谢谢

  4. 脱壳系列_2_IAT加密壳_详细版_解法1_包含脚本

    1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...

  5. 模块购物商城和ATM机代码:

    http://outofmemory.cn/python/video/let-us-python/ python为程序员服务  快来加入群[python爬虫交流群](群号570070796),发现精彩 ...

  6. DES、3DES、AES、PBE对称加密算法实现及应用

    1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...

  7. weblogic 内存溢出解决 java.lang.OutOfMemoryError: PermGen space

    解决办法: 1.在idea中,运行时给weblogic server中 VM options 配置增加内存的参数:-server -XX:PermSize=1024m -XX:MaxPermSize= ...

  8. 【0806 | Day 9】异常处理/基本的文件操作

    一.异常处理 异常即报错,可分为语法异常和逻辑异常 1. 语法异常 举个栗子 if #报错 syntaxerror 0 = 1 #报错 syntaxerror ... 正经地举个栗子 print(1) ...

  9. Streaming+Sparksql使用sql实时分析 rabbitmq+mongodb+hive

    SparkConf sparkConf = new SparkConf()//此处使用一个链接切记使用一个链接否则汇报有多个sparkcontext错误 .setAppName("Spark ...

  10. WPF中TimeSpan的坑

    记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...