Redis系列十二:Redis高可用之持久化

Redis夺命十二问,差点没抗住! 要注意,Redis 对 RDB 的执行频率非常重要,因为这会影响快照数据的完整性以及 Redis 的稳定性,所以在 Redis 4.0 后,增加了 AOF 和 RDB 混合的数据持久化机制:把数据以 RDB 的方式写入文件,再将后续的操作命令以 AOF 的格式存入文件,既保证了 Redis 重启速度,又降低数据丢失风险。Redis 数据是存储在内存中的,为了保证 Redis 数据不丢失,那就要把数据从内存存储到磁盘上,以便在服务器重启后还能够从磁盘中恢复原有数据,这就是 Redis 的数据持久化。 阅读详情

一、Redis高可用概述

在Redis语境中,高可用的含义:除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。

在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么样的问题。

  • 持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
  • 复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
  • 哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。
  • 集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

接下来会主要介绍redis的高可用,本节介绍redis的持久化部分。

二、Redis 持久化概述

redis持久化作用:将内存中的数据同步到磁盘来保证持久化,持久化可以避免因进程退出而造成数据丢失。当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。

Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。

三、RDB持久化

1、RDB持久化方式

RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发两种方式;

手动触发

手动触发有save和bgsave两命令

a、save命令:

阻塞当前Redis,直到RDB持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它

b、bgsave命令:

redis进程执行fork操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是save的优化,在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行bgsave;

bgsave运行流程
在这里插入图片描述

 

  1. Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(后面会详细介绍该命令)的子进程,如果在执行则bgsave命令直接返回。bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。
  2. 父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
  3. 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令
  4. 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
  5. 子进程发送信号给父进程表示完成,父进程更新统计信息

自动触发

a、配置save m n

自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。
在这里插入图片描述

其中save 900 1的含义是:当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave;save 300 10和save 60 10000同理。当三个save条件满足任意一个时,都会引起bgsave的调用。

b、其他自动触发机制

除了save m n 以外,还有一些其他情况会触发bgsave:

  • 在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点
  • 执行shutdown命令时,自动执行rdb持久化。

2、RDB文件操作

a、存储路径

RDB文件的存储路径既可以在启动前配置,也可以通过命令动态设定。
配置:dir配置指定目录,dbfilename指定文件名。默认是Redis根目录下的dump.rdb文件。
命令:可以用命令动态设置rdb文件路径和文件名。
设置路径:config set dir {newdir}

config set dir /usr/local //设置rdb文件保存路径为usr/local

设置文件名:config set dbfilename {newFileName}

config set dbfilename dump.rdb

b、恢复或启动时加载

将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis即可。
  RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。

3、优缺点

优点:

a、压缩后的二进制文,适用于备份、全量复制,用于灾难恢复
b、加载RDB恢复数据远快于AOF方式

缺点:

a、无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
b、保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题

四、AOF持久化

AOF持久化(即Append Only File持久化),是将Redis执行的每次写命令记录到单独的日志文件中(有点像MySQL的binlog);当Redis重启时再次执行AOF文件中的命令来恢复数据。与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。

1、开启AOF持久化

Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配置文件中配置:

appendonly yes (默认不开启,为no)

默认文件名:appendfilename “appendonly.aof”

2、AOF持久化流程

  1. 所有的写入命令(set hset)会append追加到aof_buf缓冲区中。
  2. AOF缓冲区向硬盘做sync同步。
  3. 随着AOF文件越来越大,需定期对AOF文件rewrite重写,达到压缩的目的。
  4. 当redis服务重启,可load加载AOF文件进行恢复。

在这里插入图片描述

3、关于文件重写

a、注意

  • 文件重写能减小AOF文件大小,也能减少数据恢复的时间。
  • AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
  • 对于AOF持久化来说,文件重写虽然是强烈推荐的,但并不是必须的;

b、文件重写之所以能够压缩AOF文件,原因在于:

    • 过期的数据不再写入文件
    • 无效的命令不再写入文件:如有些数据被重复设值(set mykey v1, set mykey v2)、有些数据被删除了(sadd myset v1, del myset)等等
    • 多条命令可以合并为一个:如sadd myset v1, sadd myset v2, sadd myset v3可以合并为sadd myset v1 v2 v3。不过为了防止单条命令过大造成客户端缓冲区溢出,对于list、set、hash、zset类型的key,并不一定只使用一条命令;而是以某个常量为界将命令拆分为多条。这个常量在redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD中定义,不可更改,3.0版本中值是64。

c、文件重写的流程(了解即可)

在这里插入图片描述

注意:

 

对照上图,文件重写的流程如下:
1 ) Redis父进程首先判断当前是否存在正在执行 bgsave/bgrewriteaof的子进程,如果存在则bgrewriteaof命令直接返回,如果存在bgsave命令则等bgsave执行完成后再执行。这个主要是基于性能方面的考虑。

2 ) 父进程执行fork操作创建子进程,这个过程中父进程是阻塞的。

3.1) 父进程fork后,bgrewriteaof命令返回”Background append only file rewrite started”信息并不再阻塞父进程,并可以响应其他命令。Redis的所有写命令依然写入AOF缓冲区,并根据appendfsync策略同步到硬盘,保证原有AOF机制的正确。

3.2) 由于fork操作使用写时复制技术,子进程只能共享fork操作时的内存数据。由于父进程依然在响应命令,因此Redis使用AOF重写缓冲区(图中的aof_rewrite_buf)保存这部分数据,防止新AOF文件生成期间丢失这部分数据。也就是说,bgrewriteaof执行期间,Redis的写命令同时追加到aof_buf和aof_rewirte_buf两个缓冲区。

子进程根据内存快照,按照命令合并规则写入到新的AOF文件。
5.1) 子进程写完新的AOF文件后,向父进程发信号,父进程更新统计信息,具体可以通过info persistence查看。

5.2) 父进程把AOF重写缓冲区的数据写入到新的AOF文件,这样就保证了新AOF文件所保存的数据库状态和服务器当前状态一致。

5.3) 使用新的AOF文件替换老文件,完成AOF重写。

3、AOF如何恢复?

appendonly yes           //启用aof持久化方式
# appendfsync always //每收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒强制写入磁盘一次,性能和持久化方面做了折中,推荐
# appendfsync no         //完全依赖os,性能最好,持久化没保证(操作系统自身的同步)
no-appendfsync-on-rewrite  yes  //正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100  //aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb   //aof文件,至少超过64M时,重写

只有当auto-aof-rewrite-min-size和auto-aof-rewrite-percentage两个参数同时满足时,才会自动触发AOF重写,即bgrewriteaof操作(可以直接调用bgrewriteaof指令手动触发文件重写)。

5、AOF持久化的优缺点

与RDB持久化相对应,AOF的优缺点如下
优点:支持秒级持久化、兼容性好。
缺点:文件大、恢复速度慢、对性能影响大。

五、redis重启时加载AOF与RDB的顺序

在这里插入图片描述

 

    • 重写由父进程fork子进程进行;
    • 重写期间Redis执行的写命令,需要追加到新的AOF文件中,为此Redis引入了aof_rewrite_buf缓存。

     

    4、AOF常用配置总结

      • 设置appendonly yes;
      • 将appendonly.aof放到dir参数指定的目录;
      • 启动Redis,Redis会自动加载appendonly.aof文件。
    1. 当AOF和RDB文件同时存在时,优先加载AOF
    2. 若关闭了AOF,加载RDB文件
    3. 加载AOF/RDB成功,redis重启成功
    4. AOF/RDB存在错误,启动失败打印错误信息
Java面试第十二山!《Redis缓存》 Redis是Java面试必考的高频知识点,掌握其核心概念、数据结构、缓存问题解决方案及高可用架构,能让你在面试中脱颖而出。 阅读详情

相关推荐

Redis从入门到入坟系列文章(十二):持久化

今天来了解下Redis的持久化。Redis提供了两种持久化方式:RDB和AOF。 RDB:能够在指定的时间间隔能对你的数据进行快照存储 AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。 RDB: 我们先来看看RDB持久化方式。RDB是默认开启的。有关RDB的默认配置,我们打开文件reids.conf(windows系统是redis.windows.conf),其中相关的配置主要有如下几项: save

qq_34804559的博客 255

redis.conf之save配置项解读

配置示例: save 900 1 save 300 10 save 60 3600   配置解读: 1) “save 900 1”表示如果900秒内至少1个key发生变化(新增、修改和删除),则重写rdb文件; 2) “save 300 10”表示如果每300秒内至少10个key发生变化(新增、修改和删除),则重写rdb文件; 3) “save 60 ...

一见 1万+

Redis教程(十二):Redis的持久化RDB和AOF

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留 save 900 1 这条规则。如果Enable AOF ,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

十三月的博客 969

redis 持久化

一、rdb快照持久化 save 900 1 #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。 save 300 10 #必须是300秒之后至少10个关键字发生变化。 save 60 10000 #必须是60秒之后至少10000个关键字发生变化。 (从下往上理解) stop-writes-on-bgsave-error yes #后台存储错误停止写。.........

weixin_43947156的博客 450

【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作...

写在前面: ???? 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。???? ???? 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 ????感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~文章目录引言一、油门标定原理1.1 油门与速度、加速度的关系1.2 油门控制曲面模型的构建二、油门标定表的制作流程...

qq_35485206的博客 2139

scrapy - 美团民宿 实战练习

目录结构 items.py import scrapy # 民俗名称,地区,价格,房间类型及数量,床的数量,可住几人 class MeituanItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() place = scrapy.Field() price = scrapy.F...

小刘的博客 2664

redis中的save配置项

redis配置文件中的 save <seconds> <changes> 默认的配置为: save 900 1 save 300 10 save 60 10000 redis持久化 redis保存RDB文件

qq_33169465的博客 7570

802.1AS-2011_Gptp协议栈

GPTP(广义时钟同步协议,或IEEE 802.1AS)的基本功能是确保局域网中所有的时钟都同步,并提供时间信息。这种协议用于在局域网中进行同步和时间对齐,其目的是确保网络中各设备的时间一致性。

weixin_49041703的博客 2542

Redis持久化的几种方式——深入解析RDB_save 900 1 300 10 60 10000

RDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。

2401_84264010的博客 1142

使用RustDesk或者AnyDesk的TCP隧道实现Codesys系列PLC的远程调试和下载

Codesys远程调试

exat500g的博客 7272

蓝牙 - 如何在Windows下抓取蓝牙数据

选择Windows Instarller(64-bit),最好不要选择PortableApps版,因为后面需要通过btvs.exe来启动Wireshark,如果是绿色可移植版,会启动失败。在安装完以后,找到btvs.exe文件,位于路径:C:\BTP\v1.14.0\x86下,这个视安装版本不同路径名不同。在第一台机器上启动btvs.exe,第二台机器上手动启动wireshark,并将第一台机器的IP地址作为参数。1,同一机器上,Wireshark安装后,会自动直接启动,如上面使用方式一样。

guoqx的专栏 2万+

Redis学习笔记

NoSQL的概述 什么是NoSQL          NoSQL = Not Only SQL,非关系型数据库 为什么需要NoSQL         High performance - 高并发读写         Huge Storage - 海量数据的高效率存储和访问         High Scalability &amp;&amp; High Avaliability - 高...

笑容刺眼 278

Vivado XDMA仿真实战:从配置到链路训练全解析

本文深入解析了Vivado中XDMA IP核的仿真实战流程,重点剖析了PCIe链路训练状态机(LTSSM)的工作原理与调试方法。通过搭建仿真环境、解读日志与波形,手把手指导如何从配置、链路训练(LTSSM)到BAR映射与DMA启动进行全流程分析与问题定位,帮助工程师掌握核心调试技能,确保PCIe链路稳定与数据传输正确。

weixin_29197051的博客 154

Redis夺命十二问,差点没抗住

Redis 是面试中绕不过的槛,只要在简历中写了用过 Redis,肯定逃不过。今天我们就来模拟一下面试官在 Redis 这个话题上是如何一步一步深入,全面考察候选人对于 Redis 的掌握情况。小二:面试官,你好。我是来参加面试的。面试官:你好,小二。我看了你的简历,熟练掌握 Redis,那么我就随便问你几个 Redis 相关的问题吧。首先我的问题是,Redis 是单线程还是多线程呢 ?小二:Redis 不同版本之间采用的线程模型是不一样的,在 Redis4.0 版本之前使用的是单线程模型,在 4.0 版本

知识分享官 9083

如何使用 Python 爬虫爬取滴滴打车信息:获取司机和乘客数据

滴滴打车作为中国最大的打车平台之一,提供了丰富的司机和乘客数据,包括司机的车辆信息、乘客的评价、行程数据等。公开的司机和车辆信息(如司机的名字、车辆类型、评价等)可以通过网页直接获取,而乘客的个人信息和具体行程数据通常会受到隐私保护。在滴滴打车的网页中,司机的信息可能以特定的 HTML 标签存在,例如包含司机名称、车辆类型、车辆等级等信息。我们需要分析网页的 HTML 结构,找到这些数据所在的标签。同时,对于涉及到隐私的用户数据(如乘客的行程信息、用户评价等),我们必须特别谨慎,避免侵犯他人的隐私。

2201_76125261的博客 1917

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Redis高可用、持久化及性能管理

文章目录一、Redis高可用1、概述2、高可用技术二、Redis持久化1、持久化的功能2、两种持久化方式三、RDB持久化1、概述2、触发条件(1)手动触发(2)自动触发(3)其他自动触发机制3、执行流程4、启动时加载四、AOF 持久化1、概述2、开启AOF3、执行流程4、命令追加(append)5、文件写入(write)和文件同步(sync)6、文件重写(rewrite)7、文件重写的流程8、启动时加载五、RDB和AOF的优缺点1、RDB持久化2、AOF持久化六、Redis的性能管理1、查看Redis内存使

肥猫警长的博客 859

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Redis(十二) 持久化

redis实现持久化的两种方式:RDB持久化和AOF持久化

不能再留遗憾了的博客 877

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Docker系列十二】使用Docker run命令部署Redis

秒级启动:传统安装需要编译和配置,容器化部署仅需一条命令环境隔离:每个 Redis 实例拥有独立的环境,避免端口和配置冲突资源控制:精确限制 CPU、内存等资源使用量版本管理:轻松切换不同 Redis 版本(4.0/5.0/6.0/7.0 等)数据持久化:通过卷挂载实现数据持久存储。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

Redis夺命十二问,你能扛到第几问?

大家好,我是飘渺Redis是面试中绕不过的槛,只要在简历中写了用过Redis,肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入,全面考察候选人对于Redis的...

飘渺Jam的博客 1万+

十二、Redis持久化之AOF原理

一、什么是AOF 它也是Redis持久化的重要手段之一,aof-》Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。 二、优缺点 1、优点 持久化的速度快,因为每次都只是追加,rdb每次都全量持久化 数据相对更可靠,丢失少,因可以配置每秒持久化、每个命令执行完就持久化 2、缺点 灾难性恢复的时候过慢,因为aof每次都只追加原命令,导致aof文件过大,但是后面...

IT蜗牛的专栏 2374

Redis系列(十二)、Redis6集群搭建及原理(主从、哨兵、集群)

由于单机Redis存储能力受单机限制,以及无法实现读写操作的负载均衡和读写分离,无法保证高可用。本篇就来介绍 Redis 集群搭建方案及实现原理,实现Redis对数据的冗余备份,从而保证数据和服务的高可用。主从复制是哨兵和集群的基石,因此我们循序渐进,由浅入深一层层的将Redis高可用方案抽丝剥茧展示在大家面前。

王义凯 的博客 6746

Redis面试宝典【刷题系列】

🪧Redis是一个高性能的Key-Value内存数据库,支持多种数据类型如StringListSetSorted Set和Hash。它通过将数据存储在内存中来实现快速读写,并通过异步方式将数据持久化到硬盘。Redis的优势在于其出色的性能和丰富的数据结构支持,但也存在物理内存容量限制的问题。RedLock是Redis官方提出的基于Redis实现分布式锁的算法,提供了互斥访问、避免死锁和高容错性的特性。

李赛赛的专栏 1914

Redis100篇 - Redis部署在Docker里 容器化配置+数据持久化

Redis容器化部署与数据持久化实践 本文详细介绍了Redis在Docker中的最佳部署方案,重点解决容器化环境下的数据持久化问题。主要内容包括:Redis官方镜像使用规范、RDB和AOF持久化配置的正确挂载方法、三种自定义redis.conf的注入方式(直接挂载/环境变量/自定义镜像)、主从架构的Docker Compose编排示例,以及Java应用连接容器化Redis的配置技巧。文章特别强调必须将数据目录和配置文件挂载到宿主机或持久卷,以避免容器重启导致数据丢失。通过清晰的配置示例和架构图,为开发者提供

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 【二十六】redis之事务、事务特性、与pipeline比较,与Lua脚本比较
下一篇: 配置Redis作为缓存(六种淘汰策略)
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值