引言

(本文改编自生活真实案例,如有类同,绝不是巧合!)
端午节,烟哥正在一边愉快的学习....
突然,微信一阵抖动。原来是老刘呼唤烟哥!善良的烟哥本以为人家是要约我出去玩!然而,打开微信一看,出现下图聊天记录

于是本文的主题就这么展开了。由于我需要迅速让老刘明白,这种问题的回答套路,所以我回答的时候,教她的是一种通用做法。
ps:附《那些年用过的redis集群架构(含面试解析)》的连接地址。
当然,必须的,我一定要先问一下老刘答了哪种redis集群架构!老刘的回答是用了redis cluster集群架构。
于是,我一听心里就有底,开始balabala....

正文

持久化套路

OK,一般我们在生产上采用的持久化策略为

  • (1)master关闭持久化
  • (2)slave开RDB即可,必要的时候AOF和RDB都开启

该策略能够适应绝大部分场景,绝大部分集群架构。
为什么是绝大部分场景?
因为这套策略存在部分的数据丢失可能性。redis的主从复制是异步的,master执行完客户端请求的命令后会立即返回结果给客户端,然后异步的方式把命令同步给slave。因此master可能还未来得及将命令传输给slave,就宕机了,此时slave变为master,数据就丢了。
幸运的是,绝大部分业务场景,都能容忍数据的部分丢失。假设,真的遇到缓存雪崩的情况,代码中也有熔断器来进行资源保护,不至于所有的请求都转发到数据库上,导致我们的服务崩溃!
ps:这里的缓存雪崩是指同一时间来了一堆请求,请求的key在redis中不存在,导致请求全部转发到数据库上。
为什么是绝大部分集群架构?
因为在集群中存在redis读写分离的情况,就不适合这套方案了。
幸运的是,由于采用redis读写分离架构,就必须要考虑主从同步的延迟性问题,徒增系统复杂度。目前业内采用redis读写分离架构的项目,真的太少了。

为什么这么做

(1)master关闭持久化

原因很简单,因为无论哪种持久化方式都会影响redis的性能,哪一种持久化都会造成CPU卡顿,影响对客户端请求的处理。为了保证读写最佳性能,将master的持久化关闭!
RDB持久化
RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
那么RDB持久化的过程,相当于在执行bgsave命令。该命令执行过程如下图所示

如图所示,主线程需要调用系统函数fork(),构建出一个子进程进行持久化!很不幸的是,在构建子进程的过程中,父进程就会阻塞,无法响应客户端的请求!
而且,在测试中发现,fork函数在虚拟机上较慢,真机上较快。考虑到现在都是部署在docker容器中,很少部署在真机上,为了性能,master不建议打开RDB持久化!
AOF持久化
RDB持久化是将进程数据写入文件,而AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中。
随着时间的流逝,你会发现这个AOF文件越来越大,于是redis有一套rewrite机制,来缩小AOF文件的体积。然而,在rewrite的过程中也是需要父进程来fork出一个子进程进行rewrite操作。至于fork函数的影响,上面提到过了。
还有一个就是刷盘策略fsync,这个值推荐是配everysec,也就是Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。
然而,如果磁盘性能不稳定,fsync的调用时间超过1秒钟。此时主线程进行AOF的时候会对比上次fsync成功的时间;如果距上次不到2s,主线程直接返回;如果超过2s,则主线程阻塞直到fsync同步完成。
因此AOF也是会影响redis的性能的。
ps:linux函数中,wrtie函数将数据写入文件的时候,是将数据写入操作系统的缓冲区,还并未刷入磁盘。而fsync函数,可以强制让操作系统将缓冲区数据刷入磁盘。

综上所述,我们为了保证读写性能最大化,将master的持久化关闭。

(2)slave开RDB即可,必要的时候AOF和RDB都开启

首先,我先说明一下,我不推荐单开AOF的原因是,基于AOF的数据恢复太慢。
你要想,我们已经做了主从复制,数据已经实现备份,为什么slave还需要开持久化?
因为某一天可能因为某某工程,把机房的电线挖断了,就会导致master和slave机器同时关机。
那么这个时候,我们需要迅速恢复集群,而RDB文件文件小、恢复快,因此灾难恢复常用RDB文件。

其次,官网也不推荐单开AOF,地址如下:
https://redis.io/topics/persistence
截图如下

所以,如果实在对数据安全有一定要求,将AOF和RDB持久化都开启。

另外,做好灾难备份。利用linux的scp命令,定期将rdb文件拷贝到云服务器上。
ps:scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。

总结

本文提出的是一种通用的持久化策略,主要目的是在面试的时候被问到,给出一个合理的回答,而不至于一脸懵逼。

【原创】你的Redis怎么持久化的的更多相关文章

  1. Redis 之持久化

    目录 一.前言 二.持久化类型之 RDB 三.持节化类型之AOF 四.Redis 持久化类型的抉择 五.持久化的恢复 六.持久化问题的分析定位与优化 七.回顾总结 一.前言 首先,来回顾下前面文章的知 ...

  2. Redis数据持久化,安全

    一.redis数据持久化 由于redis是一个内存数据库,如果系统遇到致命问题需要关机或重启,内存中的数据就会丢失,这是生产环境所不能允许的.所以redis提供了数据持久化的能力. redis提供了两 ...

  3. Redis(7)——持久化【一文了解】

    一.持久化简介 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的 持久化机制, ...

  4. Redis总结(四)Redis 的持久化

    前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化. redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来 ...

  5. Redis的持久化的两种方式drbd以及aof日志方式

    redis的持久化配置: 主要包括两种方式:1.快照  2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...

  6. redis启用持久化

    redis的持久化有rdb和aof两种. rdb是记录一段时间内的操作,一盘的配置是一段时间内操作超过多少次就持久化. aof可以实现每次操作都持久化. 这里我们使用aof. 配置方式,打开redis ...

  7. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  8. Redis笔记(八)Redis的持久化

    Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...

  9. 深入剖析 redis AOF 持久化策略

    本篇主要讲的是 AOF 持久化,了解 AOF 的数据组织方式和运作机制.redis 主要在 aof.c 中实现 AOF 的操作. 数据结构 rio redis AOF 持久化同样借助了 struct ...

  10. 深入剖析 redis RDB 持久化策略

    简介 redis 持久化 RDB.AOF redis 提供两种持久化方式:RDB 和 AOF.redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以 ...

随机推荐

  1. Vue-Property-Decorator源码分析

    概述 vue-property-decorator是基于vue组织里vue-class-component所做的拓展,先来了解一下vue-class-component Vue-Class-Compo ...

  2. 爬虫框架Scrapy入门——爬取acg12某页面

    1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_ ...

  3. TensorFlow学习笔记——LeNet-5(训练自己的数据集)

    在之前的TensorFlow学习笔记——图像识别与卷积神经网络(链接:请点击我)中了解了一下经典的卷积神经网络模型LeNet模型.那其实之前学习了别人的代码实现了LeNet网络对MNIST数据集的训练 ...

  4. Oracle SCN 详解

    一.简介 scn,system change number 在某个时间点定义数据库已提交版本的时间戳标记,Oracle为每个已提交事务分配一个唯一的scn,scn值是对数据库进行更改的逻辑时间点.sc ...

  5. 使用SSH服务远程管理主机(使用密钥)

    使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...

  6. NAT回流(Twice NAT)Hairping 参数详解

    内网用户需要通过域名访问内网的服务器,一般商用环境是无法访问的,需要经过以下配置,原理不说了,直接说配置. nat (inside,inside) source dynamic inside-net  ...

  7. Vue - 简单实现一个命令式弹窗组件

    前言 在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件 涉及知识点:extend.$mount.$el 使用方式: this.$Confirm({ titl ...

  8. Mysql双活方案

    #### 说明 Mysql主主互备即为两个mysql的互为备份机   ##### Windows下安装步骤(Linux下步骤类似,基本就是装上mysql,然后修改配置来完成主从的设置) - step1 ...

  9. nginx部署基于http负载均衡器

    nginx跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术. 环境介绍 配置nginx负载均衡器因会用到多台服务器来进行,所以下面我会用到docke ...

  10. 基于iSensor的MT9M001C12STM传感器调试总结

    iSensor APP 之 摄像头调试  MT9M001C12STM iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l  OV7670.OV7725.OV9650.OV ...