redis 多进程_Redis 持久化
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 持久化相关推荐
- redis数据丢失_Redis持久化Redis宕机或者出现意外删库导致数据丢失解决方案
精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:xlecho 转载自: https://www.cnb ...
- redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解
走过路过不要错过 点击蓝字关注我们 文章出处:https://www.cnblogs.com/jojop/p/13941195.html Redis 持久化 我们知道Redis的数据是全部存储在内存中 ...
- redis 重新加载_Redis持久化和Redis持久化方式
1.啥是Redis持久化 持久化就是把内存中的数据存到硬盘中去,防止进程退出后数据丢失. 分析:redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再重启,内存里的数据将全部丢失.为 ...
- 高级架构师_Redis_第3章_Redis持久化
高级架构师_Redis_第3章_Redis持久化 文章目录 高级架构师_Redis_第3章_Redis持久化 Redis 持久化 1.1 为什么要持久化 1.2 RDB 介绍 1.3 RDB 执行流程 ...
- Redis哨兵、持久化、主从
Redis哨兵.持久化.主从 1 为啥Redis那么快 2 单线程的,我们现在服务器都是多核的,那不是很浪费? 3 Redis cluster 4 他们之间是怎么进行数据交互的?以及Redis是怎么进 ...
- mysql主从复制、redis基础、持久化和主从复制
一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...
- redis学习笔记-持久化
redis学习笔记-持久化 前言 redis持久化有两种方式:RDB和AOF.分别对应着全量复制和增量复制.深刻理解各自的实现方式及适用场景对redis的使用和运维十分重要.下面就分别介绍. RDB持 ...
- Redis提供的持久化机制(RDB和AOF)
Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...
- 怎么让修改的html持久化_redis持久化机制
redis 有 RDB 和 AOF 两种持久化机制,这两种机制可以共存. 可以通过修改redis.conf配置文件中的 dir 参数来改变生成的 dump.rdb 和 appendonly.aof 这 ...
- NoSQL之Redis非关系数据库(redis概述,持久化,RDB持久化,AOF持久,内存碎片)
关系型数据库与非关系型数据库 关系型数据库与菲关系型数据库 关系型数据库 非关系型数据库 非关系型数据库产生背景 Redis简介 Redis配置文件 Redis的安装 安装环境 Redis数据库常用命 ...
最新文章
- 干货 | 非常全面的谱聚类算法原理总结
- IDEA实际开发中的常用优化设置
- Spring Boot 2.0 新特性和发展方向
- C++中使用new和delete运算符实现二维数组的操作
- airpods有时能连上有时连不上怎么办?
- 基于AppDomain的插件式开发
- java 中 阻塞队列 非阻塞队列 和普通队列的区别
- 软件测试基础知识(一)
- 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
- POJ 3740 Easy Finding (DLX模板)
- 网站SEO优化之Robots.txt文件写法。
- 怎么用计算机弹出传说之下,传说之下神器怎么拿
- matlab中做出球面和圆柱面,如何用MATLAB在直角坐标系下绘制球面x^2+y^2+z^2=4被柱面(x-1)^2+y^2=1截得的部分曲面.急!谢谢...
- 【Web】CSS实现鼠标悬停实现显示与隐藏 特效
- Java后端以及web前端及echarts框架词云分析
- rsem比对_链特异性参数设不对 结果全是错的
- 凉哥核心圈程序员必备十大图书推荐(一)
- Hugegraph合集(一):图数据库技术调研
- 【精读AI论文】dropout----(Improving neural networks by preventing co-adaptation of feature detectors)
- oracle 12 c盘已共享,求助,12c使用iscsi作为共享存储的问题,数据不同步 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...
热门文章
- U盘安装Debian 6 amd64版本
- 电脑硬件知识大扫盲:主板知识大全
- el-tooltip位置不灵活_小厨房里的收纳,贵在灵活
- vue .native 方法未定义_技术分享谈谈Vue的响应式原理
- android 进程池 参数,Android 线程池全解析
- mapper的更多细节,日志配置、核心文件的配置等
- vb6 怎么把一个数组的 0 值 去掉_解决逆向查找问题?VLOOKUP、CHOOSE、IF,索引数组,轻松解决...
- mybatis中Mapper映射
- hdoj1043 Eight(逆向BFS+打表+康拓展开)
- 《Android游戏编程入门经典》——4.6节问与答