Redis 高可用之持久化

news2025/1/18 6:06:41

Redis 高可用之持久化

  • Redis 高可用
    • 什么是高可用
    • Redis的高可用技术
  • Redis持久化
    • 持久化的功能
    • Redis提供两种方式进行持久化:
  • RDB持久化
    • 触发条件
    • bgsave执行流程
    • 启动时加载
  • AOF持久化(支持秒级写入)
    • 开启AOF
    • 执行流程
    • 启动时加载
  • RDB和AOF的优缺点
    • RDB持久化的优缺点
    • AOF持久化的优缺点
  • Redis性能管理
    • 查看Redis内存使用
    • 内存碎片
      • 内存碎片率如何计算:
      • 内存碎片如何产生的?
    • 内存使用率

Redis 高可用

什么是高可用

在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。

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

Redis的高可用技术

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

  • 持久化: 持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。

  • 主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份(和同步),以及对于读操作的负载均衡和简单的故障恢复。

缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。

  • 哨兵: 在主从复制的基础上,哨兵实现了自动化的故障恢复。(主挂了,找一个从成为新的主,哨兵节点进行监控)

缺陷:写操作无法负载均衡;存储能力受到单机的限制。

  • Cluster集群: 通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。(6台起步,成双成对,3主3从)

Redis持久化

持久化的功能

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

灾难备份:一般做异地备份,发生灾难后切换节点。例如本来使用上海的数据库,现在使用切换到重庆的。

Redis提供两种方式进行持久化:

  • RDB持久化:原理是将Reids在内存中的数据库记录定时保存到磁盘上。(定时对内存中的数据生成快照,以文件形式保存在硬盘中)
  • AOF持久化(append only file):原理是将Reids 的操作日志以追加的方式写入文件,类似于MySQL的binlog。(类似于Mysql的二进制日志)(以追加的方式将写和删的操作命令记录到AOF文件中)

由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持 久化仍然有其用武之地。(RDB体积小,恢复速度更快。对性能影响较小。)

RDB持久化

RDB持久化是指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
在这里插入图片描述

触发条件

(1)手动触发
save命令和bgsave命令都可以生成RDB文件。

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

(2)自动触发
在自动触发RDB持久化时,Redis 也会选择bgsave而不是save来进行持久化。
自动触发最常见的情况是在配置文件中通过 save m n 指定当m秒内发生n次变化时,会触发bgsave。

(3)其他自动触发机制
除了savemn以外,还有一些其他情况会触发bgsave:

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

bgsave执行流程

(1)Redis父进程首先判断:当前是否在执行save,或 bgsave/ bgrewriteaof 的子进程,如果在执行则bgsave命令直接返回。

  • bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。

(2)父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。

(3)父进程fork后,bgsave 命令返回"Background saving started" 信息并不再阻塞父进程,并可以响应其他命令。

(4)子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。(原子替换:文件整体替换,要么都发生,要么都不发生)

(5)子进程发送信号给父进程表示完成,父进程更新统计信息。

在这里插入图片描述

启动时加载

  • RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。 服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。
  • Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。

AOF持久化(支持秒级写入)

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

在这里插入图片描述

开启AOF

Redis服务器默认开启RDB,关闭AOF的, 要开启AOF,需要在/etc/redis/6379.conf配置文件中配置。

 vim /etc/redis/6379.conf
 ----700行---修改,开启AOF
 appendonly yes
 ----704行---指定AOF文件名称
 appendfilename "appendonly.aof"
 ----796行---是否忽略最后一条可能存在问题的指令
 aof-load-truncated yes   
 #Redis恢复时,发现AOF文件的末尾被截断了,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能发生redis机器运行崩溃,AOF文件的末尾被截断了,这种情况下,yes会继续执行并恢复尽量多的数据,而no会直接恢复失败报错退出。
 ​
 ​
 /etc/init.d/redis_6379 restart    #重启redis
 ls /var/lib/redis/6379/      #查看是否生成了aof文件

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

执行流程

由于需要记录Redis的每条写命令,因此AOF不需要触发,下面介绍AOF的执行流程。
AOF的执行流程包括:

  • 命令追加(append) :将Redis的写 命令追加到缓冲区aof_ buf;
  • 文件写入(write)和文件同步(sync) :根据不同的同步策略将aof_buf中的内容同步到硬盘;
  • 文件重写(rewrite) :定期重写AOF文件,达到压缩的目的。(将过期数据、无效命令、多条命令,进行压缩或删除)

启动时加载

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

RDB和AOF的优缺点

RDB持久化的优缺点

优点:
RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比, RDB最重要的优点之一是对性能的影响相对较小。
(体积小,恢复速度更快,对性能影响较小。)
缺点:

  • RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化成为主流。
  • 此外,RDB文 件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件)。
  • 对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力。

AOF持久化的优缺点

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

Redis性能管理

查看Redis内存使用

方法一:进入redis数据库查看
 redis-cli
 127.0.0.1:6379> info memory
 ​
 方法二:命令行查看
 redis-cli info memory

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

内存碎片

内存碎片率如何计算:

内存碎片率=Redis向操作系统申请的内存 / Redis中的数据占用的内存
mem_fragmentation_ratio = used_memory_rss / used_memory

  • mem_fragmentation_ratio:内存碎片率。
  • used_memory_rss:是Redis向操作系统申请的内存。
  • used_memory:是Redis中的数据占用的内存。
  • used_memory_peak:redis内存使用的峰值。

内存碎片如何产生的?

  • Redis内部有自已的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
  • Redis中的值删除的时候,并没有把内存直接释放、交还给操作系统,而是交给了Redis内部有内存管理器。
  • Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
  • Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。

内存使用率

redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

避免内存交换发生的方法:

  • 针对缓存数据大小选择安装Redis 实例
  • 尽可能的使用Hash数据结构存储
  • 设置key的过期时间

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

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

相关文章

CSC7261M

CSC7261M是一款内置高压MOS的高性能、多工作模式的PWM控制芯片,内置多种保护机制。当系统为空载和轻载时,芯片采用Burst和Green控制模式可有效地减少了空载和轻载时的损耗。当系统为中载和重载时,CSC7261M芯片采用CCM模式可有效提升电源系统的…

校招面试中常见的算法题整理【长文】

⭐️我叫恒心,一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 文章目录前言一、链表问题1 合并…

Anaconda安装详细教程

一、Anaconda下载 (1)方式一:Anaconda官网 不推荐使用官网下载: (1)官网下载速度非常慢,需要使用国内源下载 (2)官网下载的是最新版本,可能使用时会出现意料…

基于java+springboot+mybatis+vue+mysql的地方废物回收机构管理系统

项目介绍 地方废物回收机构管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知地方废物回收机构管理系统的便捷高效,不仅为用户提供了服务,而且也推广了自己,让更多的用户了解自己。对于地方废物回收机构…

【 SQLite3移植到ARM Linux教程】

SQLite3移植到ARM Linux教程1 下载 SQLite3源码2 复制并解压源码包3 配置编译选项4 编译5 去除调试信息6 复制文件7 运行测试sqlite3SQLite 是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多…

MyBatis如何处理表关联

实体类 学生表 添加对应对象 - 教师 private Teacher teacher; 2. Mapper添加对应结果集映射 collection 一对多 学科表 对 学生表 1. 实体类 学科 添加对应集合 – 学生 private List<Student> stuList; 2. Mapper添加对应结果集映射 使用ResultType实现结果多表映…

[附源码]Python计算机毕业设计Django云南美食管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Redis配置、优化以及相命令

目录 一、关系数据库和非关系型数据库 1、关系型数据库 2、非关系型数据库 二、关系型数据库和非关系型数据库区别 1、数据存储方式不同 1.1 关系型数据 1.2 非关系型数据库 2、扩展方式不同 2.1 SQL数据库 2.2 NoSQL数据库 3、对事务性的支持不同 3.1 SQL数据库 …

全网最详细的HTTP协议学习笔记

目录 一、HTTP简介 相关词语 HTTP请求过程 二、HTTP详解 1.在TCP/IP协议中的位置 2.Request(请求消息) 3.Response(响应消息) 4.HTTP状态码 5.HTTP请求方法 6.其他 三、练习自测 四、总结 五、重点&#xff1a;配套学习资料和视频教学 一、HTTP简介 全称&#…

[附源码]Python计算机毕业设计大学生兼职管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

[附源码]Python计算机毕业设计宠物短期寄养平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

R语言无监督学习:PCA主成分分析可视化

总览 在监督学习中&#xff0c;我们通常可以访问n个 观测值的p个 特征 集 &#xff0c;并 在相同观测值上测得的 Y。 无监督学习是一组没有相关的变量 Y的方法。在这里&#xff0c;我们重点介绍两种技术… 主成分分析&#xff1a;用于数据可视化或在其他监督学习方法之…

面试官:你说说Springboot的启动过程吧(5.4万字分析启动过程)

文章目录前言一、Springboot是什么二、启动流程2.1 构建Spring Boot项目2.2 启动的日志2.3 启动流程分析说明2.3.1 第一部分&#xff1a;SpringApplication的构造函数A、webApplicationType&#xff08;web应用类型&#xff09;B、引导注册初始化器C、设置初始化器D、设置监听器…

[附源码]Python计算机毕业设计大学生二手物品交易网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

锁存器和触发器

大多数数字系统中,除了需要具有逻辑运算和算术运算功能的组合逻辑电路外,还需要具有存储功能的电路。组合电路与存储电路结合构成时序逻辑电路,简称时序电路。 本文将讨论实现存储功能的两种逻辑单元电路∶锁存器和触发器,着重讨论其工作原理与电路结构,以及所实现的不同逻…

手写js——继承

原型链继承 所谓 函数 也就是 函数 Father其本身&#xff0c;也叫作构造函数 &#xff0c;当一个函数被创建的同时&#xff0c;也会为其创建一个 prototype 属性&#xff0c;而这个属性&#xff0c;就是用来指向 函数原型&#xff0c;的我们可以把 prototype 理解为 Father的一…

用 Numba 加速 Python 代码,变得像 C++ 一样快

1. 介绍 Numba 是 python 的即时&#xff08;Just-in-time&#xff09;编译器&#xff0c;即当你调用 python 函数时&#xff0c;你的全部或部分代码就会被转换为“即时”执行的机器码&#xff0c;它将以你的本地机器码速度运行&#xff01;它由 Anaconda 公司赞助&#xff0c…

SpringMVC初配置解析?

在springMVC-servlet中 在web.xml中 SpringMVC常用注解 Controller 负责注册一个bean 到spring 上下文中 RequestMapping 注解为控制器指定可以处理哪些 URL 请求 RequestBody 该注解用于读取Request请求的body部分数据&#xff0c;使用系统默认配置的HttpMessageConverter进行…

CentOS7安装Cockpit网页版图像化服务管理工具

不经意间看到CentOS8说是默认集成了Cockpit——网页版图像化服务管理工具&#xff0c;出于为了更好的管理自己的服务器&#xff0c;于是参考一些资料在自己的服务器CentOS7上也安装了一个。 一、Cockpit是什么 github 地址&#xff1a; https://github.com/cockpit-project/c…

[附源码]Python计算机毕业设计大数据与智能工程系教师档案管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…