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

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. 【Java】点击 JButton 修改 Jlabel 的文字和字体颜色

    要求: 点击 JButton 后执行一个方法 m(比较耗时),点击时改变 JLabel 的字体和颜色,方法 m 运行结束后再次修改 JLabel 的字体和颜色. 刚开始点击,都是方法 m 运行结束后, ...

  2. 【iOS】The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install

    从 github 下载的项目经常会遇到这个问题, 如图所示: 参考: iOS 'The sandbox is not sync with the Podfile.lock'问题解决 尚未解决…………

  3. Spring JdbcTemplate之使用详解

    最近在项目中使用到了 Spring 的 JdbcTemplate, 中间遇到了好多坑, 所以花一些时间对 JdbcTemplate 的使用做了一个总结, 方便以后自己的查看.文章中贴出来的API都是经 ...

  4. mysql 学习第一天

    RDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语: 数据库: 数据库是一些关联表的集合. 数据表: 表是数据的矩阵.在一个数据库中的表看起来像一个简单的电子表格 ...

  5. 武林 HDU - 1107

    题目链接:https://vjudge.net/problem/HDU-1107 注意:题目中只有两个不同门派的人在同一个地方才能对决,其他情况都不能对决. 还有,这步的有效的攻击只有走到下一步之后才 ...

  6. elk系列教程:docker中安装配置elk

    elasticSearch Docker安装elasticsearch: docker pull docker.io/elasticsearch:7.2.0 启动: docker run -p 920 ...

  7. kafka消息的处理机制(五)

    这一篇我们不在是探讨kafka的使用,前面几篇基本讲解了工作中的使用方式,基本api的使用还需要更深入的去钻研,多使用才会有提高.今天主要是探讨一下kafka的消息复制以及消息处理机制. 1. bro ...

  8. python3学习-lxml模块

    在爬虫的学习中,我们爬取网页信息之后就是对信息项匹配,这个时候一般是使用正则.但是在使用中发现正则写的不好的时候不能精确匹配(这其实是自己的问题!)所以就找啊找.想到了可以通过标签来进行精确匹配岂不是 ...

  9. 记我的一次 Java 服务性能优化

    背景 前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了. 在很低的 QPS 压力下服务器 load 就能达到 10-20,CPU 使用率 60% ...

  10. [转载]ActiveMQ实现负载均衡+高可用部署方案

    转载于 http://www.open-open.com/lib/view/open1400126457817.html 一.架构和技术介绍 1.简介 ActiveMQ 是Apache出品,最流行的, ...