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

2023-11-23 01:59

本文主要是介绍Redis—高可用、持久化及性能管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • Redis
    • 1.redis是一种非关数据库(内存、缓存)
    • 2.redis集群模式
  • 一、Redis高可用
    • 1.1Redis高可用概述
    • 1.2Redis高可用的技术
  • 二、Redis持久化
    • 2.1持久化的功能
    • 2.2redis提供的两种持久化方法
  • 三、RDB持久化
    • 3.1RDB持久化概述
    • 3.2触发条件
      • 3.2.1手动触发
      • 3.2.2自动触发
    • 3.3执行流程
    • 3.4启动时加载
  • 四、AOF持久化
    • 4.1AOF持久化概述
    • 4.2开启AOF
    • 4.3执行流程
      • 4.3.1命令追加(append)
      • 4.3.2文件写入(write)和文件同步(sync)
      • 4.3.3AOF缓存区的同步文件策略存在三种同步方式
      • 4.4.4文件重写(rewrite)
      • 4.4.5文件重写之所以能够压缩AOF文件,原因在于
    • 4.5文件重写触发分类
      • 4.5.1手动触发
      • 4.5.2自动触发
    • 4.6启动时加载
  • 五、RDB和AOF的优缺点
    • 5.1RDB持久化优缺点
    • 5.2AOF持久化优缺点
  • 六、Redis性能管理
    • 6.1查看Redis内存使用
    • 6.2内存碎片率
      • 6.2.1跟踪内存碎片率对理解Redis实例的资源性能是非常重要
    • 6.3内存使用率
    • 6.4内回收key
  • 总结
    • 高可用中的持久化
    • RDB和AOF;RDB是默认开启的,AOF需要手动开启


Redis

1.redis是一种非关数据库(内存、缓存)

  • redis相比于其他非关数据库优势的地方在于
    ①数据类型丰富
    ②持久化(可以将内存种的数据保存在磁盘中)

2.redis集群模式

  • redis 的集群模式,同时也可以理解为是redis 的高可用模式主从:提供了备份冗余,缺点:无法针对故障进行自动修复,写操作无法负载均衡

  • 哨兵:以主从为基础提供了故障自动修复的功能,写操作无法负载均衡

  • 集群:基于主从基础,解决了故障自动修复、写操作负载均衡的问题,同时对于资源需求相较于前两种集群得到了一定的改善

一、Redis高可用

1.1Redis高可用概述

  • 在web服务器中,高可用是指服务器可以正常访问的时间,衡量标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%)
  • 在Redis语法中,高可用的含义似乎要广泛一些,除了保证正常服务(主从分离、快速容灾技术),还要考虑数据容量的扩展,数据安全不会丢失

1.2Redis高可用的技术

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

二、Redis持久化

2.1持久化的功能

  • Redis是内存数据库,数据库都是存储在内存中,为了避免服务器断电等元婴导致redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(或命令数据)从内存保存到硬盘,当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置(NFS)

2.2redis提供的两种持久化方法

  • RDB持久化
    原理是将Redis在内存中的数据记录定时保存到磁盘上
  • AOF持久化(append only file)
    原理是将Redis的操作日志以追加的方式写入文件,类似于MySQL的binlog(基于日志持久化方式)
    由于AOF持久化的实时性更好,即当进程意味退出时,因此AOF是目前主流的持久化方式,RDB持久化基本都会开启(用于集群)

三、RDB持久化

3.1RDB持久化概述

  • RDB持久化是指在指定时间间隔内将内存中当前进程中的数据生成快照保存到硬盘,也称作快照持久化,用二进制压缩存储,保存的文件后缀是rdb;当RDB重新启动时,可以读取快照文件恢复数据
  • 周期性(1-10秒,会进行一定的限制)
  • 保存形式:二进制压缩存储

3.2触发条件

3.2.1手动触发

  • save命令和bgsave命令都可以生成RDB文件
  • save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。
  • bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(Redis主进程)则继续处理请求
  • bgsave命令执行过程中,只有fork,子进程时会阻塞服务器,而对于save命令,整个过程中都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用
  • 生产环境中bgsave依然不允许轻易使用

3.2.2自动触发

  • 在自动触发持久化时,Redis也会选择bgsave而不是save来进行持久化
  • save m n 自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave
vim /etc/redis/6379.conf
以下三个save条件满足任意一个时,都会引起bgsave的调用
219 save 900 1 	##当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
220 save 300 10 ##当时间到300秒时, 如果redis数据发生了至少10次变化, 则执行bgsave
221 save 60 10000 :当时间到60秒时,如果redis数据发生了至少10000次变化, 则执行bgsave242 rdbcompression yes		##是否开启RDB文件压缩
254 dbfilename dump.rdb		##指定RDB文件名
264 dir /var/lib/redis/6379		##指定RDB文件和AOF文件所在目录

加粗样式

在这里插入图片描述

3.3执行流程

  • Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则bgsave命令直接返回bgsave/bgrewriteaof
  • 父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
  • 父进程fork后,bgsave命令返回”Background saving started" 信息并不再阻塞父进程,并可以响应其他命令
  • 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
  • 子进程发送信号给父进程表示完成,父进程更新统计信息

3.4启动时加载

  • RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令
  • 优先级:AOF>RDB,因此当AOF开启时,默认先载入AOF文件,仅当AOF关闭,才会载入RDB文件
  • Redis载入RDB文件时(即启动过程中),会对RDB 文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败

四、AOF持久化

4.1AOF持久化概述

  • RDB持久化是将进程数据写入文件,而AOF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录,当Redis重启时优先执行AOF文件中的命令来恢复数据
  • 与RDB相比,AOF的实时性更好,成为主流的持久化方案

4.2开启AOF

  • Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配置文件中配置:
vim /etc/redis/6379.conf
700 appendonly yes		##修改成yes,开启AOF
704 appendfilename "appendonly.aof"		##指定A0F文件名称
796 aof-load-truncated yes		##是否忽略最后一条可能存在问题的指令/etc/ init.d/redis_ 6379 restart		##重启redis

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3执行流程

  • 由于需要记录Redis的每条写命令,因此AOF不需要触发
  • AOF的执行流程包括
    ①命令追加(append):将Redis的写命令追加到缓冲区aof_buf
    ②文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘
    ③文件重写(rewrite):定期重写AOF文件,达到压缩的目的

4.3.1命令追加(append)

  • Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘Io成为Redis负载的瓶颈。
  • 命令追加的格式是Redis命令请求的协议格式,它是一种纯文本格式,具有兼容性好、可读性强、容易处理、操作简单避免二次开销等优点。在A0F文件中,除了用于指定数据库的select命令(如select0为选中0号数据库)
  • 是由Redis添加的,其他都是客户端发送来的写命令。

4.3.2文件写入(write)和文件同步(sync)

  • Redis提供了多种AoF缓存区的同步文件策略,策略涉及到操作系统的write函数和fsync函数,说明如下
  • 为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里。这样的操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失;因此系统
  • 同时提供了fsync、 fdatasync等同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保数据的安全性
  • Redis AOF 持久化策略中:会先把数据写入缓冲区(系统提供了强制同时写入磁盘的功能)然后同步到磁盘中

4.3.3AOF缓存区的同步文件策略存在三种同步方式

vim /etc/redis/6379.conf
729 appendfsync always		
//命令写入aof_buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到A0F文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
729 appendfsync no
//命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。
729 appendfsync everysec(默认配置)
//命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是我们推荐的配置。

在这里插入图片描述

4.4.4文件重写(rewrite)

  • 随着时间流逝,Redis服务器执行的写命令越来越多,AOF文件也会越来越大,过大的AOF文件不仅会影响服务器的正常运行,也会导致数据恢复需要的时间过长。
  • 文件重写是指定期重写AOF文件,减小AOF文件的体积。需要注意的是,AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作
  • 关于文件重写需要注意的另一点是:对于AOF持久化来说,文件重写虽然是强烈推荐的,但并不是必须的;即使没有文件重写,数据也可以被持久化并在Redis启动的时候导入:因此在一些实现中,会关闭自动的文件重写,然后通过定时任务在每天的某一时刻定时执行。

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

  • 过期的数据不再写入文件
  • 无效的命令不再写入文件:如有些数据被重复设值(set mykey v1,set mykey v2)、有些数据被删除了(sad mysetv1, del myset)等。
  • 多条命令可以合并为一个:如sadd myset v1, sadd myset v2,sadd myset v3可以合并为sad myset vl v2 v3。
  • 通过上述内容可以看出,由于重写后AoF执行的命令减少了,文件重写既可以减少文件占用的空间,也可以加快恢复速度。

4.5文件重写触发分类

4.5.1手动触发

  • 直接调用bgrewriteaof命令,该命令的执行与bgsave有些类似:都是fork子进程进行具体的工作,且都只有在fork时阻塞

4.5.2自动触发

  • 通过设置auto-aof - rewrite-min-size选项和auto- aof - rewrite-percentage选项来自动执行BGREWR工TEAOF。
  • 只有当auto-aof- rewrite- -rmin-size和lauto-aof-rewrite-percentage两个选项同时满足时,才会自动触发AoF重写,即bgrewriteaof操作
vim /etc/ redis/ 6379. conf
//AOF同步的策略
729 # appendfsync always
730 appendfsync everysec
731 # appendfsync no
771	auto-aof-rewrite-percentage 100		//当前AOF文件大小(即aof_current_size)是上次日志重写时AOF文件大小(aof_base_size)两倍时,发生BGREWRITEAOF操作
772 auto-aof-rewrite -min-size 64mb		//当前A0F文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEA0F

在这里插入图片描述

4.6启动时加载

  • 当AOF开启时,Redis启动时会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会载入RDB文件恢复数据。
    当AOF开启,但AOF文件不存在时,即使RDB文件存在也不会加载。
  • Redis载入AOF文件时,会对AOF文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。但如果是AOF文件结尾不完整(机器突然宕机等容易导致文件尾部不完整),且aof-load-truncated参数开启,则日志中会输出警告,Redis忽略掉AOF文件的尾部,启动成功。
  • aof-load-t runcated参数默认是开启的

五、RDB和AOF的优缺点

5.1RDB持久化优缺点

  • 优点
    RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与A0F相比,RDB最重要的优点之一是对性能的影响相对较小。
  • 缺点
    RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化成为主流。此外,RDB文件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件),对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力。

5.2AOF持久化优缺点

  • 与RDB持久化相对应,AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大、恢复速度慢、对性能影响大。
  • 对于AOF持久化,向硬盘写数据的频率大大提高(everysec策略下为秒级),Io压力更大,甚至可能造成AOF追加阻塞问题。
  • AOF文件的重写与RDB的bgsave类似,会有fork时的阻塞和子进程的T0压力问题。相对来说,由于AOF向硬盘中写数据的频率更高,因此对Redis主进程性能的影响会更大。

六、Redis性能管理

6.1查看Redis内存使用

127.0.0.1:6379> info memory

在这里插入图片描述

6.2内存碎片率

  • 操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出内存碎片是由操作系统低效的分配/回收物理内存导致的(不连续的物理内存分配)

6.2.1跟踪内存碎片率对理解Redis实例的资源性能是非常重要

  • 内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
  • 内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150号,其中50号是内存碎片率。需要在redis-cli工具上输入shutdown save命令,并重启Redis服务器。
  • 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用

6.3内存使用率

  • redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
  • 避免内存交换发生的方法
    ①针对缓存数据大小选择安装Redis实例(云平台里面使用RDS服务,ECS云主机选择内存、缓存型配置)
    ②尽可能的使用Hash数据结构存储
    ③设置key的过期时间

6.4内回收key

  • 合理分配redis有限的内存资源
  • 当达到设置的最大阀值时,需选择–种key的回收策略,默认情况下回收策略是禁止删除。
  • 配置文件中修改maxmemory- policy属性值
vim /etc/redis/6379.conf
598 maxmemory-policy noenviction
volatile-lru	//使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl	//从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random	//从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru 	//使用LRU算法从所有数据集合中淘汰数据
allkeys-random //从数据集合中任意选择数据淘汰

总结

高可用中的持久化

RDB和AOF;RDB是默认开启的,AOF需要手动开启

1、持久化方式
①:RDB:周期性的快照;二进制压缩格式
②:A0F:接近实时的持久化(以everysec方式)基于日志文件持久化;还有一个文件重写功能,可以帮助AOF减少持久化文件的大小

2、redis 启用的优先级
AOF>RDB,同时仅当AOF功能关闭的情况下,redis才会在重新启动时使用RDB的方式进行恢复

3、RDB和AOF中持久化模式
①:RDB
由redis主进程( 周期性) fork 派生出子进程对redis内存中的数据进行持久化(二进制压缩),生成到.rd文件中,自动触发的方式是使用的bgsave持久化
②:AOF
根据持久化策略(alawys、no、everysec(默认) ),先将redis中的语句保存在缓冲区中,再从缓冲区同步到.aof文件中;bgrewriteaeof

这篇关于Redis—高可用、持久化及性能管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414504

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应