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

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. 最新try2hack全详解

    第一题http://www.try2hack.nl/levels/: 方法:直接右键看网页源码 第二题http://www.try2hack.nl/levels/level2-xfdgnh.xhtml ...

  2. 第四章-使用本机文件对话框和帮助进程间沟通 | Electron实战

    本章主要内容: 使用Electron的dialog模块实现一个本机打开文件对话框 促进主进程和渲染器进程之间的通信 将功能从主进程暴露给渲染器进程 使用Electron的remote模块从主进程导入功 ...

  3. 使用jvisualvm.exe工具远程监视tomcat的线程运行状态

    一.简述 在web项目中,常使用tomcat作为web容器.代码编写的时候,由于业务需要,也常会使用线程机制.在系统运行一段时间之后,若出现响应慢或线程之间出现死锁的情况,要查出问题所在,需要使用jd ...

  4. 利用python自动生成verilog模块例化模板

    一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...

  5. indexedDB添加,删除,获取,修改

    [toc] 在chrome(版本 70.0.3538.110)测试正常 编写涉及:css, html, js 在线演示codepen html代码 <h1>indexedDB</h1 ...

  6. Liunx查看后1000行的命令以及查看中间部分

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  7. 素数筛法(Eratosthenes筛法)

    介绍 Eratosthenes筛法,又名埃氏筛法,对于求1~n区间内的素数,时间复杂度为n log n,对于10^6^ 以内的数比较合适,再超出此范围的就不建议用该方法了. 筛法的思想特别简单: 对于 ...

  8. NLP(十五)让模型来告诉你文本中的时间

    背景介绍   在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...

  9. 提取html内的文字1

    public static string StripHTML(string strHtml)   {    string [] aryReg ={           @"<scrip ...

  10. 【原创】微信小程序支付java后台案例(公众号支付同适用)(签名错误问题)

    前言 1.微信小程序支付官方接口文档:[点击查看微信开放平台api开发文档]2.遇到的坑:预支付统一下单签名结果返回[签名错误]失败,建议用官方[签名验证工具]检查签名是否存在问题.3.遇到的坑:签名 ...