1 前言

Redis 相比较于 memcache,多了持久化的功能。而持久化分为 2 种,一种是 RDB(全量),一种是 AOF(增量)。

RDB 是旧的模式,现在基本上都使用 AOF。当然,今天两个都会一起聊聊。

2 RDB

RDB 流程图:

RDB 特点:

  • RDB 是一种快照模式,即——保存的是 key value 数据内容。

  • RDB 有 2 种持久方式,同步 save 模式和异步 bgsave 模式。由于 save 是同步的,所以可以保证数据一致性,而 bgsave 则不能。

  • save 可以在客户端显式触发,也可以在 shutdown 时自动触发;bgsave 可以在客户端显式触发,也可以通过配置由定时任务触发,也可以在 slave 节点触发。

  • save 导致 redis 同步阻塞,基本已经废弃。bgsave 则不会导致阻塞,但也有缺点:在 fork 时,需要增加内存服务器开销,因为当内存不够时,将使用虚拟内存,导致阻塞 Redis 运行。所以,需要保证空闲内存足够。

  • 默认执行 shutdown 时,如果没有开启 AOF,则自动执行 bgsave。

  • 每次的 RDB 文件都是替换的。

关于优化:Redis 会压缩 RDB 文件,使用 LZF 算法,让最终的 RDB 文件远小于内存大小,默认开启。但会消耗 CPU。

RDB 缺点:

  • 无法秒级持久化。

  • 老版本 Redis 无法兼容新版本 RDB。

RDB 优点:

  • 文件紧凑,适合备份,全量复制场景。例如每 6 小时执行 bgsave,保存到文件系统之类的。

  • Redis 加载 RDB 恢复数据远远快于 AOF。

3 AOF

由于 RDB 的数据实时性问题,AOF(append only file) 是目前 Redis 持久化的主流方式。

AOF 特点:

  • 默认文件名是 appendonly.aof。和 RDB 一样,保存在配置中 dir 目录下。

  • AOF 相比较于 RDB,每次都会保存写命令,数据实时性更高。

  • AOF 由于每次都会记录写命令,文件会很大,因此需要进行优化,称之为“重写机制”(下面详细说)。

  • AOF 每次保存的写命令都放在一个缓冲区,根据不同的策略(下面详细说)同步到磁盘。

“重写机制” 细节:

  • fork 子进程(类似 bgsave)

  • 主进程会写到2个缓冲区,一个是原有的 “AOF 缓存区”,一个是专门为子进程准备的 “AOF 重写缓冲区”;

  • 子进程写到到新的 AOF 文件中,批量的,默认 32m;写完后通知主进程。

  • 主进程把“AOF 重写缓冲区”的数据写到新 AOF 文件中。

  • 将新的 AOF 文件替换老文件。

重写流程图:

缓冲区同步策略,由参数 appendfsync 控制,一共3种:

  • always:调用系统 fsync 函数,直到同步到硬盘返回;严重影响 redis 性能。

  • everysec:先调用 OS write 函数, 写到缓冲区,然后 redis 每秒执行一次 OS fsync 函数。推荐使用这种方式。

  • no: 只执行 write OS 函数,具体同步硬盘策略由 OS 决定;不推荐,数据不安全,容易丢失数据。

4 持久化恢复

AOF 和 RDB 文件都可以用于服务器重启时的数据恢复,具体流程如下图:

从图中可以看出优先加载 AOF,当没有 AOF 时才加载 RDB。当 AOF 或者 RDB 存在错误,则加载失败。

5 问题排查和性能优化

Redis 持久化是影响 Redis 性能的高发地,也是面试中常问的问题。

1. fork 操作

当 Redis 做 RDB 或者 AOF 重写时,必然要进行 fork 操作,对于 OS 来说,fork 都是一个重量级操作。而且,fork 还会拷贝一些数据,虽然不会拷贝主进程所有的物理空间,但会复制主进程的空间内存页表。对于 10GB 的 Redis 进程,需要复制大约 20MB 的内存页表,因此 fork 操作耗时跟进程总内存量息息相关,再加上,如果使用虚拟化技术,例如 Xen 虚拟机,fork 会更加耗时。

一个正常的 fork 耗时大概在 20毫秒左右。为什么呢,假设一个 Redis 实例的 OPS 在 5 万以上,如果 fork 操作耗时在秒级,那么僵拖慢几万条命令的执行,对生产环境影响明显。

我们可以在 Info stats 统计中查询 latest_fork_usec 指标获取最近一次 fork 操作耗时,单位微秒。

如何优化:

  • 优先使用物理机或者高效支持 fork 的虚拟化技术,避免使用 Xen。

  • 控制 redis 实例最大内存,尽量控制在 10GB 以内。

  • 合理配置 Linux 内存分配策略,避免内存不足导致 fork 失败。

  • 降低 fork 的频率,如适度放宽 AOF 自动触发时机,避免不必要的全量复制。

2. 子进程开销

fork 完毕之后,会创建子进程,子进程负责 RDB 或者 AOF 重写,这部分过程主要涉及到 CPU,内存,硬盘三个地方的优化。

  • CPU

写入文件的过程是 CPU 密集的过程,通常子进程对单核 CPU 利用率接近 90%。

如何优化呢?既然是 CPU 密集型操作,就不要绑定单核 CPU,因为这样会和父 CPU 进行竞争。同时,不要和其他 CPU 密集型服务不是在一个机器上。如果部署了多个 Redis 实例,尽力保证统一时刻只有一个子进程执行重写工作。

  • 内存

子进程通过 fork 操作产生,占用内存大小等同于父进程,理论上需要两倍的内存完成持久化操作,但 Linux 有 copy on write 机制,父子进程会共享相同的物理内存页,当父进程处理写操作时,会把要修改的页创建对应的副本,而子进程在 fork 操作过程中,共享整个父进程内存快照。

即——如果重写过程中存在内存修改操作,父进程负责创建所修改内存页的副本。这里就是内存消耗的地方。

如何优化呢?尽量保证同一时刻只有一个子进程在工作;避免大量写入时做重写操作。

  • 硬盘

硬盘开销分析:子进程主要职责是将 RDB 或者 AOF 文件写入硬盘进行持久化,势必对硬盘造成压力,可通过工具例如 iostat,iotop 等,分析硬盘负载情况。

如何优化:

  • 不要和其他高硬盘负载的服务放在一台机器上,例如 MQ,存储。

  • AOF 重写时会消耗大量硬盘 IO,可以开启配置 no-appendfsync-on-rewrite,默认关闭。表示在 AOF 重写期间不做 fsync 操作。

  • 当开启 AOF 的 Redis 在高并发场景下,如果使用普通机械硬盘,每秒的写速率是 100MB左右,这时,Redis 的性能瓶颈在硬盘上,建议使用 SSD。

  • 对于单机配置多个 Redis 实例的情况,可以配置不同实例分盘存储 AOF 文件,分摊硬盘压力。

3. AOF 追加阻塞

当开启 AOF 持久化时,常用的同步硬盘的策略是“每秒同步” everysec,用于平衡性能和数据安全性,对于这种方式,redis 使用另一条线程每秒执行 fsync 同步硬盘,当系统资源繁忙时,将造成 Redis 主线程阻塞。

流程图如下:

通过上图可以发现:everysec 配置最多可能丢失 2 秒数据,不是 1 秒;如果系统 fsync 缓慢,将会导致 Redis 主线程阻塞影响效率。

问题定位:

  • 发生 AOF 阻塞时,会输入日志。用于记录 AOF fsync 阻塞导致拖慢 Redis 服务的行为。

  • 每当 AOF 追加阻塞事件发生时,在 info Persistence 统计中,aof_delayed_fsync 指标会累加,查看这个指标方便定位 AOF 阻塞问题。

  • AOF 同步最多运行 2 秒的延迟,当延迟发生时说明硬盘存在性能问题,可通过监控工具 iotop 查看,定位消耗 IO 的进程。

4. 单机多实例部署

Redis 单线程架构无法充分利用多核CPU,通常的做法是一台机器上部署多个实例,当多个实例开启 AOF 后,彼此之间就会产生CPU 和 IO 的竞争。

如何解决这个问题呢?

让所有实例的 AOF 串行执行。

我们通过 info Persistence 中关于 AOF 的信息写出 Shell 脚本,然后串行执行实例的 AOF 持久化。

整个过程如图:

通过不断判断 AOF 的状态,手动执行 AOF 重写,保证 AOF 不会存在竞争。具体的 Shell 编写以及 info 信息判断,可以查看下图:

6 总结

本文主要讲了 Redis 的持久化相关功能,持久化一直是影响 Redis 性能的高发地,也是面试中经常被问到的。包括 RDB 相关的特定和优缺点,AOF 的优缺点,事实上,由于 RDB 的数据实时性问题,目前用 AOF 比较多了。而持久化恢复也是优先 AOF。

关于持久化的问题排查,就很麻烦了,但无非几个方面,fork 耗时,子进程的 CPU,内存,硬盘开销,AOF 的同步阻塞,单机多实例部署。

这些优化,可以通过前面写的分析进行排查。

引用

《Redis 开发与运维》

《深入分布式缓存》

来源:https://www.jianshu.com/p/14fa8e6e132fENDPHP开源社区

扫描关注  进入”PHP资料“

免费获取进阶

面试、文档、视频资源

redis 多进程_Redis 持久化相关推荐

  1. redis数据丢失_Redis持久化Redis宕机或者出现意外删库导致数据丢失解决方案

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:xlecho 转载自: https://www.cnb ...

  2. redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解

    走过路过不要错过 点击蓝字关注我们 文章出处:https://www.cnblogs.com/jojop/p/13941195.html Redis 持久化 我们知道Redis的数据是全部存储在内存中 ...

  3. redis 重新加载_Redis持久化和Redis持久化方式

    1.啥是Redis持久化 持久化就是把内存中的数据存到硬盘中去,防止进程退出后数据丢失. 分析:redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再重启,内存里的数据将全部丢失.为 ...

  4. 高级架构师_Redis_第3章_Redis持久化

    高级架构师_Redis_第3章_Redis持久化 文章目录 高级架构师_Redis_第3章_Redis持久化 Redis 持久化 1.1 为什么要持久化 1.2 RDB 介绍 1.3 RDB 执行流程 ...

  5. Redis哨兵、持久化、主从

    Redis哨兵.持久化.主从 1 为啥Redis那么快 2 单线程的,我们现在服务器都是多核的,那不是很浪费? 3 Redis cluster 4 他们之间是怎么进行数据交互的?以及Redis是怎么进 ...

  6. mysql主从复制、redis基础、持久化和主从复制

    一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...

  7. redis学习笔记-持久化

    redis学习笔记-持久化 前言 redis持久化有两种方式:RDB和AOF.分别对应着全量复制和增量复制.深刻理解各自的实现方式及适用场景对redis的使用和运维十分重要.下面就分别介绍. RDB持 ...

  8. Redis提供的持久化机制(RDB和AOF)

    Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...

  9. 怎么让修改的html持久化_redis持久化机制

    redis 有 RDB 和 AOF 两种持久化机制,这两种机制可以共存. 可以通过修改redis.conf配置文件中的 dir 参数来改变生成的 dump.rdb 和 appendonly.aof 这 ...

  10. NoSQL之Redis非关系数据库(redis概述,持久化,RDB持久化,AOF持久,内存碎片)

    关系型数据库与非关系型数据库 关系型数据库与菲关系型数据库 关系型数据库 非关系型数据库 非关系型数据库产生背景 Redis简介 Redis配置文件 Redis的安装 安装环境 Redis数据库常用命 ...

最新文章

  1. 干货 | 非常全面的谱聚类算法原理总结
  2. IDEA实际开发中的常用优化设置
  3. Spring Boot 2.0 新特性和发展方向
  4. C++中使用new和delete运算符实现二维数组的操作
  5. airpods有时能连上有时连不上怎么办?
  6. 基于AppDomain的插件式开发
  7. java 中 阻塞队列 非阻塞队列 和普通队列的区别
  8. 软件测试基础知识(一)
  9. 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
  10. POJ 3740 Easy Finding (DLX模板)
  11. 网站SEO优化之Robots.txt文件写法。
  12. 怎么用计算机弹出传说之下,传说之下神器怎么拿
  13. matlab中做出球面和圆柱面,如何用MATLAB在直角坐标系下绘制球面x^2+y^2+z^2=4被柱面(x-1)^2+y^2=1截得的部分曲面.急!谢谢...
  14. 【Web】CSS实现鼠标悬停实现显示与隐藏 特效
  15. Java后端以及web前端及echarts框架词云分析
  16. rsem比对_链特异性参数设不对 结果全是错的
  17. 凉哥核心圈程序员必备十大图书推荐(一)
  18. Hugegraph合集(一):图数据库技术调研
  19. 【精读AI论文】dropout----(Improving neural networks by preventing co-adaptation of feature detectors)
  20. oracle 12 c盘已共享,求助,12c使用iscsi作为共享存储的问题,数据不同步 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...

热门文章

  1. U盘安装Debian 6 amd64版本
  2. 电脑硬件知识大扫盲:主板知识大全
  3. el-tooltip位置不灵活_小厨房里的收纳,贵在灵活
  4. vue .native 方法未定义_技术分享谈谈Vue的响应式原理
  5. android 进程池 参数,Android 线程池全解析
  6. mapper的更多细节,日志配置、核心文件的配置等
  7. vb6 怎么把一个数组的 0 值 去掉_解决逆向查找问题?VLOOKUP、CHOOSE、IF,索引数组,轻松解决...
  8. mybatis中Mapper映射
  9. hdoj1043 Eight(逆向BFS+打表+康拓展开)
  10. 《Android游戏编程入门经典》——4.6节问与答