来源:http://kaito-kidd.com/

从这篇文章开始,我们来介绍Redis高可用相关的机制。Redis要想实现高可用,主要有以下方面来保证:

  • 数据持久化

  • 主从复制

  • 自动故障恢复

  • 集群化

这篇文章我们先介绍Redis的高可用保障的基础:数据持久化。因为Redis的主从复制和自动故障恢复,都需要依赖Redis持久化相关的东西。同时,Redis的数据持久化也可以用来做数据备份,用来保障数据的安全性。

Redis是一个内存数据库,它的数据都保存在内存中,如果实例宕机,那么数据则全部丢失。如何保证数据的完整性和安全性也是提高服务高可用的重要机制之一。

Redis提供了完善的持久化机制,可以把内存中的数据持久化到磁盘上,方便我们进行备份数据和快速恢复数据。

这篇文章我们就来分析Redis的数据持久化是如何实现的?我们经常听的RDB和AOF有什么区别?以及它们不同的使用场景。

持久化方式

Redis提供的数据持久化方式主要有2种:

  • RDB:产生一个数据快照文件

  • AOF:实时追加命令的日志文件

它们分别对应了不同的使用场景,下面我们就来依次分析。

RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。

我们可以通过执行save或bgsave命令让Redis在本地生成RDB快照文件,这个RDB文件包含了整个实例接近完整的数据内容。

它的优点如下:

  • RDB文件数据是被压缩写入的,因此RDB文件的体积要比整个实例内存要小

  • 当实例宕机恢复时,加载RDB文件的速度很快,能够在很短时间内迅速恢复文件中的数据

它的缺点也很明显:

  • 由于是某一时刻的数据快照,因此它的数据并不全

  • 生成RDB文件的代价是比较大的,它会消耗大量的CPU和内存资源

因此RDB比较适用于以下场景:

  • 主从全量同步数据

  • 数据库备份

  • 对于丢失数据不敏感的业务场景,实例宕机后快速恢复数据

Redis主从全量同步数据就是使用RDB文件进行的,我们会在后面的文章详细讲到。

由此可以看出,RDB非常适合做数据备份,我们可以定时让Redis生成RDB文件,然后备份这个快照文件即可。

定时生成RDB

Redis也提供了定时触发生成RDB文件的配置项:

# 最近15分钟内 至少产生1次写入
save 900 1
# 最近5分钟内 至少产生10次写入
save 300 10
# 最近1分钟内 至少产生10000次写入
save 60 10000

如果达到以上任意条件,则Redis会自动生成新的RDB文件,降低RDB数据内容与实例数据的差异。

Copy On Write

在Redis上执行save和bgsave命令都可以生成RDB文件,但前者是在前台执行的,也就是说在生成RDB文件时,会阻塞整个实例,在RDB未生成之前,任何请求都是无法处理的,对于内存很大的实例,生成RDB文件非常耗时,显然这是我们不能接受的。

所以通常我们会选择执行bgsave让Redis在后台生成RDB文件,这样Redis依旧可以处理客户端请求,不会阻塞整个实例。

但不是说后台生成RDB就是没有代价的,Redis为了实现后台把内存数据的快照写入文件,采用了操作系统提供的Copy On Write技术,也就是我们熟知的fork系统调用。

fork系统调用会产生一个子进程,它与父进程共享相同的内存地址空间,这样子进程在这一时刻就能拥有与父进程的相同的内存数据。

虽然子进程与父进程共享同一块内存地址空间,但在fork子进程时,操作系统需要拷贝父进程的内存页表给子进程,如果整个Redis实例内存占用很大,那么它的内存页表也会很大,在拷贝时就会比较耗时,同时这个过程会消耗大量的CPU资源。在完成拷贝之前父进程也处于阻塞状态,无法处理客户端请求。

fork执行完之后,子进程就可以扫描自身所有的内存数据,然后把全部数据写入到RDB文件中。

之后父进程依旧处理客户端的请求,当在处理写命令时,父进程会重新分配新的内存地址空间,从操作系统申请新的内存使用,不再与子进程共享,这个过程就是Copy On Write(写实复制)名字的由来。这样父子进程的内存就会逐渐分离,父进程申请新的内存空间并更改内存数据,子进程的内存数据不受影响。

由此可以看出,在生成RDB文件时,不仅消耗CPU资源,还有需要占用最多一倍的内存空间。

我们在Redis执行info命令,可以看到fork子进程的耗时,可以通过这个耗时来评估fork时间是否符合预期。同时我们应该保证Redis机器拥有足够的CPU和内存资源,并合理设置生成RDB的时机。

AOF

AOF全称为Append Only File(追加日志文件)。它与RDB不同的是,AOF中记录的是每一个命令的详细信息,包括完整的命令类型、参数等。只要产生写命令,就会实时写入到AOF文件中。

我们可以通过配置文件开启AOF:

# 开启AOF
appendonly yes# AOF文件名
appendfilename "appendonly.aof"# 文件刷盘方式
appendfsync everysec

刷盘方式

开启AOF后,Redis会把每个写操作的命令记录到文件并持久化到磁盘中,为了保证数据文件的安全性,Redis还提供了文件刷盘的时机:

  • appendfsync always:每次写入都刷盘,对性能影响最大,占用磁盘IO比较高,数据安全性最高

  • appendfsync everysec:1秒刷一次盘,对性能影响相对较小,节点宕机时最多丢失1秒的数据

  • appendfsync no:按照操作系统的机制刷盘,对性能影响最小,数据安全性低,节点宕机丢失数据取决于操作系统刷盘机制

以上可以看出AOF相对于RDB的优点是,AOF数据文件更新比较及时,比RDB保存更完整的数据,这样在数据恢复时能够恢复尽量完整的数据,降低丢失数据的风险。

如果同时存在RDB文件和AOF文件,Redis会优先使用AOF文件进行数据恢复。

但它的缺点也很易见:

  • 随着时间增长,AOF文件会越来越大

  • AOF文件刷盘会增加磁盘IO的负担,可能影响Redis的性能(开启每秒刷盘时)

AOF重写

针对第一种情况,Redis提供了AOF瘦身的功能,可以设置在AOF文件很大时,自动触发AOF重写,Redis会扫描整个实例的数据,重新生成一个AOF文件达成瘦身的效果。但这个重写过程也需要消耗大量的CPU资源。

# AOF文件距离上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

由于AOF可以最大可能降低丢失数据的风险,所以它一般适用于对丢失数据很敏感的业务场景,例如涉及金钱交易的业务。

性能影响

如果AOF的刷盘时机设置为每次写入都刷盘,那么会大大降低Redis的写入性能,因为每次写命令都需要写入文件并刷到磁盘中才会返回,当写入量很大时,会增加磁盘IO的负担。

性能与数据安全不能兼得,虽然Redis提供了实时刷盘的机制,但是在真正场景中使用的不多。

通常我们会选择每秒刷盘这种方式,既能保证良好的写入性能,在实例宕机时最多丢失1秒的数据,做到性能和安全的平衡。

总结

我们对RDB和AOF的总结如下表。


我们需要针对不同的业务场景选择合适的持久化方式,也可以根据RDB和AOF的优点配合使用,保证Redis数据的安全性,又可以兼顾它的性能。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

不知道这些,简历上千万不要说你会 Redis 持久化。。。相关推荐

  1. 【Linux服务器开发系列】一场redis线上事故引发的思考丨redis持久化 rdb和aof丨redis主从复制

    一场redis线上事故引发的思考 1. 事故背景介绍 2. redis持久化 rdb和aof 3. redis主从复制 4. 解决方案详解 [Linux服务器开发系列]一场redis线上事故引发的思考 ...

  2. 我猜你还不知道这个轻松上热门的小技巧|走过路过千万不要错过......

    很多开始做短视频的朋友是不是都遇上了这样的问题:满心欢喜的发布视频,结果却只有几十几百的播放量,有时候甚至连一个赞都没有:撰写脚本.外出取景.精修剪辑,非常用心地做好一条视频,结果只有寥寥几个赞:跟着 ...

  3. 拿到2021年灰飞烟灭的算法岗offer的大佬们,简历上都有什么?

    ↑ 点击蓝字 关注视学算法 本文授权自知乎问答,转载需获得原作者授权. 编辑丨极市平台 经历一 作者丨SleepyBag 末流 985 硕士,本科普通 211,目前 3 算法意向书,字节,快手,猿辅导 ...

  4. 并不是所有的 Github 项目写在简历上都加分

    本文转载自微信公众号:果汁简历 为什么 Github 可以加分 很多招聘描述上面都会备注 github加分项,那么为什么它是加分项呢? 停,如果看到这里你还不知道 Github 是什么,可以看一下 P ...

  5. 不止一个人犯错,这种 Github 不要写在简历上!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 为什 ...

  6. 阿里第二代微服务强势崛起,你还敢往简历上写“精通”吗?

    总算迎来金三银四...但简历千万别瞎写! 前几天,刚面试完一小伙,简历上写了"精通微服务",进来时表现得非常自信,所以我很期待他接下来的表现...... 也就随便问了几个微服务相关 ...

  7. mysql查询前段时间_没想到!我在简历上写了“精通MySQL”,阿里面试官跟我死磕后就给我发了高薪offer...

    事情是这样的 前段时间面试了阿里,大家也都清楚,如果你在简历上面写着你精通XX技术,那面试官就会跟你死磕到底. 我就是在自己的简历上写了精通MySQL,然后就开启了和阿里面试官的死磕之路,结果就是拿到 ...

  8. 我换了一个灯泡,看看互联网大厂员工们的简历上都会怎么写

    我换了一个灯泡,看看互联网大厂员工们的简历上都会怎么写 https://www.toutiao.com/i6937238178176827911/?tt_from=weixin&utm_cam ...

  9. 简历上的照片怎么制作?这两种方法真的很简单

    怎么制作简历上的照片呢?简历是每个人在找工作的时候必须要用到的,在简历中,除了填写我们出众的履历和工作技能之外,还有一个很重要的影响因素,那就是我们放在简历中的证件照,一个好的照片可以让面试官一眼记住 ...

最新文章

  1. apache起步命令加-k参数和不加的区别
  2. 2.1 进行误差分析-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. abb变频器如何就地增加频率_abb变频器报接地故障如何处理,故障原因分析
  4. TensorFlow学习笔记(十九) 基本算术运算和Reduction归约计算
  5. win7连接sftp_SFTP远程连接服务器上传下载文件-vs2010项目实例
  6. Error:express-session deprecated undefined resave option; provide resave option app.js:17:10
  7. mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告
  8. [六省联考2017]分手是祝愿
  9. ubuntu 配置ip地址命令
  10. 泸州NGN属南气矿工程----N2000网管系统提示连接数据库失败
  11. AI加持,云之家V10让移动办公充满无限想象
  12. 实现数据结构中的栈---后进先出LIFO
  13. 连续,可积,存在原函数,变上限积分
  14. SAP-MM 常见移动类型
  15. 全年涨幅超200%,来自东南亚的Sea Limited有何魔力?
  16. 中职计算机应用专业教师到电商企业实践报告,中职教师到企业实践总结.doc
  17. 吾爱破解安卓逆向入门教程学习心得(1-4)
  18. PhotoZoom中如何调整预设
  19. opencv 最小二乘法拟合曲线
  20. Pytorch CIFAR10图像分类 LeNet5篇

热门文章

  1. redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]
  2. python3连接mysql,python3连接MySQL数据库实例详解
  3. D.Digits 思维dp 取log乘积变成加法
  4. Boruvka求最小生成树
  5. 2019计算机科学论文研讨大会,2019年中华口腔医学会口腔医学计算机专业委员会第十七次全国口腔医学数字化学术会议第一轮会议通知...
  6. 计算机硬件系统公开课课件,计算机硬件系统的组成(公开课).ppt.ppt
  7. php 尾递归,关于尾递归的使用详解
  8. java restful接口开发实例_Spring Boot 中 10 行代码构建 RESTful 风格应用!
  9. android视频拷到iphone6s,爱思助手怎么把电脑视频导入iphone6s
  10. 体外反搏做_体外反搏治疗的原理