redis重启命令_请收下这份redis持久化详解

前言

Redis支持RDB和AOF两种持久化机制, 持久化功能有效地避免因进程退出造成的数据丢失问题, 当下次重启时利用之前持久化的文件即可实现数据恢复。

RDB介绍

按指定时间间隔把数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。

自动触发

RDB的配置参数在配置文件redis.conf

#时间策略save 900 1save 300 10save 60 10000

这里说一下save的时间策略配置默认是三个,拿其中一个做说明,其他同理:

  • save 900 1 表示900s内至少有一个键更改,就会触发产生一次快照。

如果要关闭RDB快照生成可以直接在时间策略最尾部加上

save ""

为什么要设置这么多条规则,因为考虑到每个时段的读写请求不一定是均衡的,为了平衡性能和数据安全,我们可以自由定制什么情况下触发备份。所以这里就是根据自身Redis写入情况来进行合理配置。

#文件名称dbfilename dump.rdb#文件保存路径dir ./#压缩:默认采用LZF算法对生成的RDB文件做压缩处理,压缩会消耗CPU,但可大幅降低文件体积rdbcompression yes#默认情况下,如果Redis在后台生成快照的时候失败,那么就会停止接收数据,目的是让用户能知道数据没有持久化成功。但是如果你有其他的方式可以监控到Redis及其持久化的状态,那么可以把这个功能禁止掉。stop-writes-on-bgsave-error yes#导入时是否校验rdbchecksum yes

默认Redis会把快照文件存储为当前目录下一个名为dump.rdb的文件

手动触发save和bgsave

  • save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。
  • bgsave命令:Redis进程执行fork操作创建子进程, RDB持久化过程由子进程负责, 完成后自动结束。 阻塞只发生在fork阶段, 一般时间很短。

显然bgsave命令是对save阻塞问题进行的优化,我们要重点看看bgsave的工作流程。

bgsave工作流程

8272e37e3123633d7ad712fcc5432c39.png
  1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令则直接返回。
  2. 父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latestforkusec选项,可以获取最近一个fork操作的耗时,单位为微秒。
  3. 父进程fork完成后, bgsave命令返回“Background saving started”信息并不再阻塞父进程, 可以继续响应其他命令。
  4. 子进程创建RDB文件, 根据父进程内存生成临时快照文件, 完成后对原有文件进行原子替换。 执行lastsave命令可以获取最后一次生成RDB的时间, 对应info统计的rdblastsave_time选项。
  5. 进程发送信号给父进程表示完成, 父进程更新统计信息, 具体见info Persistence下的rdb_*相关选项。

除了执行命令手动触发之外,Redis内部还存在自动触发RDB的持久化 机制,例如以下场景:

  • 使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave。
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作。
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则 自动执行bgsave。

优点

  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如6小时执行bgsave备份。
  • 基于上面所描述的特性,RDB很适合用于灾备。单文件很方便就能传输到远程的服务器上。
  • RDB的性能很好,需要进行持久化时,主进程会fork一个子进程出来,然后把持久化的工作交给子进程,自己不会有相关的I/O操作。
  • Redis加载RDB恢复数据远远快于AOF的方式。

缺点

  • RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照到Redis出现问题这段时间的数据就会丢失了。
  • ·RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
  • ·RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式 的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。

AOF介绍

以独立日志的方式记录每次写命令.重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性, 目前已经是Redis持久化的主流方式。

AOF文件配置

详看配置文件redis.conf

#是否开启AOF(yes or no)appendonly yes #文件名称appendfilename "appendonly.aof"#文件保存路径,与RDB共用dir ./

默认Redis会把文件存储为当前目录下一个名为appendonly.aof的文件

#同步频率# appendfsync always appendfsync everysec# appendfsync no

特地把AOF的同步频率的配置拿出来讲,redis调用fsync的频率分三个:

  • appendfsync always 每次将新命令附加到AOF,非常慢,非常安全。(这里安全指的就是进程挂掉时候数据丢失的安全性)
  • 每秒fsync一次。速度快(再2.4版本中与快照方式的速度差不多),安全性不错(最多丢失1秒的数据)
  • 从不fsync,交给系统处理。速度非常快,但安全性一般,通常,Linux使用此配置30秒刷新一次数据。

默认采取的策略是fsync每秒执行一次,即快速又安全。

工作流程

AOF的工作流程操作: 命令写入(append)、文件同步(sync) 、 文件重写(rewrite)、重启加载 (load)

7525793e8422f4620606731540c39cc6.png

流程如下:

  1. 所有的写入命令会追加到aof_buf(缓冲区)中。
  2. AOF缓存区根据对应的策略向磁盘做同步操作。
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
  4. 当Redis服务器重启时,可以加载AOF文件进行数据恢复。

优点

  • 比RDB可靠。你可以制定不同的fsync策略:不进行fsync、每秒fsync一次和每次查询进行fsync。默认是每秒fsync一次。这意味着你最多丢失一秒钟的数据。
  • AOF日志文件是一个纯追加的文件。就算是遇到突然停电的情况,也不会出现日志的定位或者损坏问题。甚至如果因为某些原因(例如磁盘满了)命令只写了一半到日志文件里,我们也可以用redis-check-aof这个工具很简单的进行修复。
  • 当AOF文件太大时,Redis会自动在后台进行重写。重写很安全,因为重写是在一个新的文件上进行,同时Redis会继续往旧的文件追加数据。新文件上会写入能重建当前数据集的最小操作命令的集合。当新文件重写完,Redis会把新旧文件进行切换,然后开始把数据写到新文件上。
  • AOF把操作命令以简单易懂的格式一条接一条的保存在文件里,很容易导出来用于恢复数据。例如我们不小心用FLUSHALL命令把所有数据刷掉了,只要文件没有被重写,我们可以把服务停掉,把最后那条命令删掉,然后重启服务,这样就能把被刷掉的数据恢复回来。

缺点

  • 在相同的数据集下,AOF文件的大小一般会比RDB文件大。
  • 在某些fsync策略下,AOF的速度会比RDB慢。通常fsync设置为每秒一次就能获得比较高的性能,而在禁止fsync的情况下速度可以达到RDB的水平。
  • 在过去曾经发现一些很罕见的BUG导致使用AOF重建的数据跟原数据不一致的问题。

重写机制

随着命令不断写入AOF, 文件会越来越大, 为了解决这个问题, Redis引入AOF重写机制压缩文件体积。 重写后的AOF文件会变小,原因如下:

  • 进程内已经超时的数据不再写入文件。
  • 旧的AOF文件含有无效命令, 如del key1、 hdel key2、 srem keys、 set a111、 set a222等。 重写使用进程内数据直接生成, 这样新的AOF文件只保留最终数据的写入命令。
  • 多条写命令可以合并为一个, 如: lpush list a、 lpush list b、 lpush list c可以转化为: lpush list a b c。 为了防止单条命令过大造成客户端缓冲区溢出, 对于list、 set、 hash、 zset等类型操作, 以64个元素为界拆分为多条。

AOF重写降低了文件占用空间, 除此之外, 另一个目的是: 更小的AOF文件可以更快地被Redis加载。

AOF重写过程可以手动触发和自动触发: 自动触发

auto-aof-rewrite-min-size 64mb

表示运行AOF重写时文件最小体积, 默认为64MB。

auto-aof-rewrite-percentage 100

代表当前AOF文件空间( aofcurrentsize) 和上一次重写后AOF文件空间( aofbasesize) 的比 值。

自动触发时机=aofcurrentsize>auto-aof-rewrite-minsize&&( aofcurrentsize-aofbasesize) /aofbasesize>=auto-aof-rewritepercentage

表示触发重写的条件是文件大小最小为64mb,并且aof文件大小超过上一次重写文件的百分之百时会触发重写。

手动触发 手动触发直接调用bgrewriteaof命令。

bgrewriteaof工作流程

2d9eaa1195a5541dcbadcf4c082d78bf.png
  1. 执行AOF重写请求。如果当前进程正在执行AOF重写, 请求不执行并返回。如果当前进程正在执行bgsave操作, 重写命令延迟到bgsave完成之后再执行。
  2. 父进程执行fork创建子进程, 开销等同于bgsave过程。
  3. 主进程fork操作完成后, 继续响应其他命令。 所有修改命令依然写入AOF缓冲区并根据appendfsync策略同步到硬盘, 保证原有AOF机制正确性。
  4. 由于fork操作运用写时复制技术, 子进程只能共享fork操作时的内存数据。 由于父进程依然响应命令, Redis使用“AOF重写缓冲区”保存这部分新数据, 防止新AOF文件生成期间丢失这部分数据。
  5. 子进程根据内存快照, 按照命令合并规则写入到新的AOF文件。 每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制, 默认为32MB, 防止单次刷盘数据过多造成硬盘阻塞。
  6. 新AOF文件写入完成后, 子进程发送信号给父进程, 父进程更新统计信息, 具体见info persistence下的aof_*相关统计。
  7. 父进程把AOF重写缓冲区的数据写入到新的AOF文件。
  8. 使用新AOF文件替换老文件, 完成AOF重写。

重启加载

AOF和RDB文件都可以用于服务器重启时的数据恢复。 加载流程

a32be0cabf752a476e872d9ad9a5a9a6.png
  1. AOF持久化开启且存在AOF文件时, 优先加载AOF文件。
  2. AOF关闭或者AOF文件不存在时, 加载RDB文件。
  3. 加载AOF/RDB文件成功后, Redis启动成功。
  4. AOF/RDB文件存在错误时, Redis启动失败并打印错误信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 苹果id申请_如何申请百度机器翻译API的ID和Key,为Python调用做准备

1.打开以下页面: http://api.fanyi.baidu.com/api/trans/product/index 2. 在网页找到“立即使用”并点击,之后,如果要求你登录百度,那就用你已有的百度账号登录,如果没有百度账号,请先申请一个百度账号&am…

去掉窗口_Flink 基础——窗口(Window)理论篇

窗口是什么要知道 Flink 面对的是无限的数据流,而批处理只是流处理的一个特例,然而我们的计算只能基于一个有限的集合,这个时候窗口正好定义了这其中的概念。因此可以说了解窗口机制是学习 Flink 的基础也是关键。总结来说,窗口将…

开题报告方案论证_观点讨论研究方案、立项申报书、开题报告的联系和区别

点击蓝字获取更多精彩信息观点讨论┃研究方案、立项申报书、开题报告的联系和区别第一部分 开题报告与立项申报书的区别开题报告与立项申报书看似类似(一级目录大致相同),但相比之下,重点和详略有明显变化,主要有以下实际区别:1…

resnet50能用cpu跑吗_2020年12月1日更新。性价比最高入门游戏CPU--intel 10100F装机配置推荐。...

牙膏厂终于发布了入门级性价比最高的十代CPU,inte i3 10100F。10100F采用LGA1200芯片接口,四核八线程,主频3.6GHz,睿频可以到4.3Ghz。TDP功耗65w,支持双通道DDR4 2666内存。可以搭配H410或B460主板。首发价格为699元,性价比非常的…

匹配正则_程序员入门基础:python正则表达式贪婪匹配和非贪婪匹配

此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式。一、贪婪匹配和非贪婪匹配举例说明概念:print(非贪婪匹配,re.search(el?, hello world,re.I))print(贪婪匹配,re.search(el, hello world,re.I))贪…

python数据结构与算法分析_数据结构和算法分析

问题引出假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路:1、将N个数读入一个数组中,再通过某种简单的算法,…

单片机与树莓派蓝牙连接_用树莓派玩转蓝牙

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。蓝牙是一个使用广泛的无线通信协议,这两年又随着物联网概念进一步推广。我将介绍蓝牙协议,特别是低功耗蓝牙,并用树莓派来实践。树莓派3中内置了蓝牙模块。树…

禁止更改计算机名_计算机改名、加域脚本集合

windows计算机改名、改密码、设置ip、加域脚本集合今天和大家分享一下,如何将前面的改名加域整合在一起,根据选择执行对应的命令。新建txt文档,输入一下代码,另存为“自动加域脚本.bat”。echo offcolor 1Fmode con cols100 lines…

加载文件流_jvm类加载的过程

一个类从加载到虚拟机到使用结束从虚拟机卸载包括了加载、验证、准备、解析、初始化、使用、卸载,即为一个类的生命周期下面来看一下类加载的过程,即加载、验证、准备、解析、初始化5个阶段都做了什么事:阶段1:加载加载阶段虚拟机…

php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server

前言:最近的PHP项目中有使用AMQP,解耦一些业务性的功能模块。因为工作使用的是线上Linux搭建,为了方便测试所以我决定本地搭建一个MQ服务。RabbitMQ简介:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。…

小程序底部弹窗css_微信小程序之animation底部弹窗动画(两种方法)

简单分享一下常用的底部弹窗层或下拉框弹出层(代码需要修改)的内容弹窗的动画效果,这里分享的是点击按钮后底部弹窗的动画效果。第一种方式是动态设置显示区域的高度,第二种方法是动态设置显示区域的移动的位置(使用到 transform:translateY )&#xff1…

js cookie 存储checkbox_浏览器数据存储方式总结,网友:“精辟”!

今天主要来讲下前端的数据存储,说起数据存储,大家肯定第一时间想起cookie,localstorage,sessionstorage,而其实还有userData和IndexedDB这两种数据存储,接下来将对它们进行一个比较详细的总结一、为什么要进…

mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。下面介绍三种方法(1) getGeneratedKeys()方法:程序片断:Connection conn ;Serial…

navigator工具_Javascript常用工具类

就算现今是以框架为主流的前端,依然离不开JS,因为他是框架底层的一部分。我先上传代码截图(截图显示会更好看点),截图后面有带源码(源码方便大家复制)。/** * 文件描述:js项目开发中的常用方法工具 * *//** * 全局常量 */var DEFAULT_LINE_KE…

tail将输出的日志放到文件中_如何将Spring Boot应用中日志输出格式改为JSON?

作者:DEV出自:解道JDON原文:jdon.com/55006今天,我们有了一类称为日志聚合系统的应用程序。当我们拥有大量微服务并且我们希望跨微服务跟踪日志时,日志聚合很有用。传统的Java应用程序日志如下所示:2020-09…

造轮子是什么意思_程序员为什么热衷于造轮子,升职加薪吗?

作者:小傅哥博客: https://bugstack.cn-沉淀、分享、成长,让自己和他人都能有所收获!一、前言哪个架构师没造过轮子?你想过这样一件事吗? 是先具备能力在安排职位,还是先安排职位在学习&#xf…

阿里云 服务器 系统 php mysql_阿里云服务器配环境(Ubuntu 16.04+Nginx+MySQL+PHP)并部署hexo博客...

购买服务器阿里云向学生出售优惠价格的服务器,一个月只需9.5块,具体配置看图吧更新Ubuntu源,安装Git123sudo apt updatesudo apt upgradesudo apt-get install git配置Nginx安装Nginxsudo apt install nginx开启Nginx服务sudo service nginx …

python web开发项目 源码_Python + Flask 项目开发实践系列七

对于 Python Flask 这种灵活的web开发框架,在前面的六个系列文章中详细的进行了说明,主要讲到了页面的首页加载时的页面渲染,增加功能,删除功能,修改功能,查询功能,查询详情功能等一些页面常见…

回调函数 相当于线程_阿里面试题:请简述下 Node 的线程模型

前言如果你有一定的前端基础,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称这个全栈为伪全栈,我认为的全栈也要精通数据库,不喜勿喷),从而触及后端…

微信小程序 本地mysql_微信小程序系列之使用缓存在本地模拟服务器数据库

微信小程序系列之使用缓存在本地模拟服务器数据库现在将data.js这个文件视作是本地数据库的初始化数据,要做的第一件事就是讲这些初始化数据装进缓存中,以形成数据库的初始化数据整个应用程序的生命周期,类比一下页面的生命周期,在…