【Redis】Redis高可用

news2024/11/14 0:05:46

目录

  • 主从复制
    • 1. 全量复制
    • 2. 增量复制
    • 3. 主从复制的问题
      • (1). 主从复制延迟
      • (2). 读到过期数据
      • (3). 主从配置不一致导致数据丢失
      • (4). 全量复制性能损耗大
      • (5). 主节点向所有从节点进行全量复制,消耗大量网络带宽(复制风暴)
    • 参考
  • Sentinel哨兵
  • Redis cluster集群
    • 1. 建立集群:
    • 2. 槽分配
    • 3. 处理命令
    • 4. 数据重新分片(通常用于扩容、缩容)
    • 5. 故障检测与转移
    • 参考
  • 三种高可用比较

主从复制

一主多从,每个节点数据都是相同的。核心的作用是数据备份和读写分离来提高查询性能

复制分为全量复制和增量复制。在2.8版本之前只有全量复制,而2.8版本后有全量和增量复制

1. 全量复制

在这里插入图片描述
分为三阶段:

  • 建立连接,协商同步
  • 主库同步数据给从库
  • 主库发送新写命令给从库

几个概念:

  • runID:主节点启动时生成的随机ID,第一次为?
  • offset:复制偏移量,第一次为-1。主从节点都会维护自己的复制偏移量,主节点向从节点传播N个字节数据时,从节点自己会将复制偏移量加N,从节点接受到数据后,也会将自己的偏移量加N
  • repl buffer(或replication buffer):在生成RDB文件后,记录主节点写命令的缓冲区,会不断将命令发送到从节点

1. 建立连接,协商同步

  • 从节点执行slaveof命令后,会向主节点发送psync命令,并携带两个参数:runID(主节点启动时生成的随机ID,第一次为?)和offset(从节点的复制进度,第一次为-1)
  • 主节点收到命令后,会使用FULLRESYNC命令(表示第一次复制采用全量复制),并携带runID和offset

2. 主库同步数据给从库

  • 主库执行BGSAVE命令,生成RDB文件,并通过网络发送给从库。
  • 从库接受到文件后,清空当前数据库,并加载文件

3. 主库发送新写命令给从库
在主节点生成RDB文件到从节点加载文件完毕的过程中,主节点可能有新数据写入,因此需要将新数据传递给从节点。

  • 主节点会将没有记录到RDB文件的写操作,记录到复制缓冲区(replication buffer)
  • 主节点不断将缓冲区的命令发送到从节点,从节点重新执行
  • 数据同步后,主从节点建立TCP长连接。主节点会不断给从节点发送新的写命令

2. 增量复制

在这里插入图片描述
假如主从节点之间网络断开,重新连接后重新进行全量复制,并生成RDB文件,对于网络带宽以及服务性能都会有影响。增量复制能够

几个概念:

  • repl backlog:复制积压缓冲区,是一个环形的先进先出队列,主节点在命令传播时,不仅将命令发送给从节点,还会记录到复制积压缓冲区。因为容量有限,超过一定数量后会覆盖旧数据。

大致流程:

  • 断开后恢复,从节点的数据会落后主节点。从节点向主节点发送psync命令,携带runID和offset参数
  • 以下两种情况会返回FULLRESYNC命令并触发全量复制
    • 主节点发现从节点发送的runID与自己不一致,说明自己重启过或者从节点之前不是从自己复制的(原来的主宕机,从节点变为了主节点)
    • 从节点宕机过久,发送的offset在repl backlog中找不到
  • 如果主节点发现runID一致,并且offset在repl backlog中能够找到,则会返回Continue命令,准备增量复制
  • 主节点把repl backlog中offset之后的数据发送给从节点

3. 主从复制的问题

(1). 主从复制延迟

产生原因:

  • 从节点阻塞,会延迟主节点的写入,在从节点读不到某些数据
  • 本身从写入主节点到写入从节点需要一定时间

解决方法:

一致性要求不高的场景一般不需要解决。

  • **减缓:**避免从节点堵塞,排查大key问题,和避免用keys等同步耗时操作
  • 严格一致: 直接或者选择性读取主节点,牺牲一定的性能。

(2). 读到过期数据

关于Redis过期删除,可以看Redis八股文必背的Redis处理过期键策略

在主节点读取过期数据后,会惰性删除,但是不会触发从节点的数据删除。

Redis 3.2 版本之前: 从节点读取数据时,不会判断数据是否过期而直接返回数据,并且不会删除过期数据。

Redis 3.2 版本之后:

  • 从节点读取数据时,会判断是否过期,如果过期返回空值,但仍然不会删除。
  • 如果使用EXPIRE 和 PEXPIRE,它们给数据设置的是从命令执行时开始计算的存活时间,即相对时间,那么从节点会在接受命令时执行,因而从节点过期时间会比主节点过期时间晚。
  • 如果使用EXPIREAT 和 PEXPIREAT:它们会直接把数据的过期时间设置为具体的一个时间点。这种方式没问题。

(3). 主从配置不一致导致数据丢失

maxmemory配置不一致,比如从节点内存配置比主节点小。那么从节点可能比主节点先行发生缓存淘汰(4. Redis缓存淘汰策略)。并且若是该从节点升级为主节点,那么整个集群都会发生数据丢失。

(4). 全量复制性能损耗大

1. 第一次全量复制

无法避免,但是可以通过下面两种方法降低影响

  • 减小节点内存大小(降低RDB复制时间)
  • 流量低峰期挂载从节点

2. runID发生改变

主节点重启会导致runID发生改变。无法避免全量复制。

3. 复制积压缓冲区不足

repl backlog复制积压缓冲区不足,导致从节点短暂离线重连后,offset已经无法在主节点找到,从而发生全量复制。可以调大缓冲区大小。

(5). 主节点向所有从节点进行全量复制,消耗大量网络带宽(复制风暴)

主节点重启导致需要向所有从节点进行全量复制。
在这里插入图片描述
主节点宕机后,将slave1晋升为主节点,就不需要给另外两个从节点进行全量同步了。

可以,但没必要,会带来slave1单点问题、复制延迟增高等问题

参考

  • 主从复制详解
  • redis主从复制常见的问题
  • Redis主从数据不一致及读取过期数据问题的解决方案

Sentinel哨兵

角色说明:

  • 主结点:负责处理外部的读写操作
  • 从结点:只读,主节点无效时可能被选拔为主节点
  • 哨兵:监控主结点、从结点、其他哨兵。主结点故障时选从结点变为主结点。哨兵是特殊的Redis结点,不存储数据,只只支持部分命令

Redis cluster集群

介绍优点: redis cluster集群模式,既拥有哨兵模式高可用、自动主从切换、高性能的特点,又解决了其只有单主结点承载数据量小的缺点。集群模式可以有多主结点,数据分散到多个主节点上,可以动态扩容。
槽分区的特点:

  • 利用槽分区来实现数据分片
  • 解耦数据和结点的关系,降低扩缩容和数据迁移的难度

一个节点大概会有如下操作

1. 建立集群:

在这里插入图片描述

  • 最开始时,每个redis实例是一个集群
  • 用CLUSTER MEET命令,让各节点握手,组建集群

2. 槽分配

  • 为每个实例节点分配一定数量的槽
  • 16384个槽分配到所有节点上后,集群变为上线状态(默认配置所有槽都分配才可以上线)

3. 处理命令

  • 客户端将命令发到某节点
  • 节点通过计算CRC16(key)&16384,得到这个key对应的槽
  • 查看槽所分配的节点,若为当前节点,则直接处理命令,否则返回MOVED错误,并提供正确节点的信息
  • 客户单拿到正确的节点信息后,重新向正确的节点发起请求。并且下次再操作这个key时会直接访问正确的节点。

4. 数据重新分片(通常用于扩容、缩容)

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

  • 分片过程中,各个节点仍然可以对外提供服务。迁移数据过程中,一个槽的数据可能分布在源节点和目标节点
  • 客户端发起请求时,通过MOVED错误定位到槽的源节点
  • 如果源节点没找到查询的key,那么数据可能迁移到了目标节点中,因此源节点会返回ASK错误,携带了目标节点的信息
  • 客户端根据ASK错误和信息,访问目标节点尝试操作(和MOVED不同,下次操作同一个key时,还会访问源节点,而非目标节点)
  • 迁移完成后,集群内部通过gossip协议传递最终的槽信息

5. 故障检测与转移

  • 集群中每个节点定期向其它结点发送PING消息,如果规定时间内未收到返回的PONG消息,则将其标记为疑似下线(PFAIL)
  • 各个节点会交换节点状态信息,超过半数认为某节点意思下线时,那么这个结点会被标记为已下线(FAIL),并将信息在集群中传播
  • 在已下线主节点的从结点中选举新的主节点
  • 新的主节点会将原主节点的槽指派给自己,并将信息发送到集群中

参考

  • 《Redis设计与实现》第十七章:集群

三种高可用比较

版本优点缺点
主从模式redis2.8之前解决数据备份问题
读写分离,提高查询性能
主节点故障无法自动转移,需要人工介入
无法动态扩容
哨兵模式redis2.8级之后的模式在主从模式基础上自动切换主从结点
无法动态扩容
连接从结点的客户端在从结点下线后无法获取新的可用从结点
集群模式redis3.0版本之后数据分片,可以支持更大规模的数据
可以动态扩容
1、架构比较新,最佳实践较少

2、为了性能提升,客户端需要缓存路由表信息

3、节点发现、reshard操作不够自动化

4、不支持处理多个keys的命令,因为这需要在不同的节点间移动数据

5、Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT index 命令

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

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

相关文章

机器人动力学与控制学习笔记(十五)——机器人路径规划

十五、机器人路径规划 15.1 机器人运动规划 机器人运动规划包含三个层次的内容:即路径规划、轨迹规划、轨迹跟踪或轨迹控制。路径规划是确定不含时间信息的几何路径。一般的工业机器人中都含有点到点,直线,圆弧及样条曲线等常用轨迹的路径…

【进程】进程概念及相关函数实现

目录 0. 进程概述 1. 创建进程 1.1 进程的创建:fork函数 1.2 进程的等待:wait()、waitpid() 1.3 特殊进程:僵尸进程、孤儿进程、守护进程 1.4 进程的终止:exit和_exit函数 1.5 进程退出清理:atexit函数 1.6 进…

【我的创作纪念日】关于某站的音频爬虫+GUI

文章目录 一、前言&机遇二、爬虫代码三、爬虫GUI四、文件打包五、结果展示未来可期 一、前言&机遇 许久没看私信内容,一上线就看到了官方的私信,我已经来到CSDN1024天啦! 想到注册这个号的初衷是学习记录爬虫,后面渐渐变…

抖音产业带服务商哪些类目在招募?开通需要什么条件?

5月,刚刚结束的抖音电商生态大会上,抖音电商总裁魏雯雯披露,近一年平台GMV增幅超80%。其中,商城GMV同比增长277%,电商搜索GMV同比增长159%,货架场景GMV在平台GMV占比超30%。过去一年,抖音电商直…

数据结构与算法——树与二叉树

😊数据结构与算法——树与二叉树 🚀前言🚀树🚢树的定义🚢树的基本术语🚢有序树和无序树🚢森林 🚀二叉树🚢二叉树的定义🚢二叉树的性质🚢满二叉树&…

【VUE】Element UI 表单校验出现async-validator: [‘discipline is required‘]报错

问题:async-validator: [discipline is required] 选择器已经获取到数值,却显示获取到 解决办法如下

线性规划算法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转 本文部分内容来自网友博客 一,线性规划 例如,一个企业“生产计划”的线性规划模型如下: 是subjec…

​如何优雅的卸载Edge浏览器

如何优雅的卸载Edge浏览器 由于Edge浏览器越来越复杂,功能越来越繁琐我是真的一刻也用不下去了。虽然我主力是火狐浏览器,Edge用来访问一些只能使用Chromium内核的网页作为备用。 但是我现在一打开Edge浏览器我就窝火,也懒得再去调整优化&a…

【表格树状】jqgrid表格树状折叠效果实现(附代码,留邮箱发demo)

【写在前面】有段时间没好好的整理一篇前端文章了,之前的6月城市活动也结束了,期待下周的榜单公布,其实这个月还有一个东西也让我牵肠挂肚的,就是软考的成绩也会在这个月的中旬公布,也是感觉很悬。既成定局&#xff0c…

【中间件-Openjob】高性能任务调度框架Openjob简介及快速搭建

介绍基础基础信息任务调度框架对比 特性高可靠高性能定时调度分布式计算延迟任务工作流程权限管理告警监控跨语言 安装访问docker-compose安装在线访问 总结 介绍 一款分布式高性能任务调度框架,支持多种定时任务、延时任务、工作流设计、轻量级分布式计算、无限水平…

el-form动态嵌套表单验证

v-for 遍历的表单校验 根据官网的介绍&#xff0c;是在 el-form-item 中使用 :rules 属性&#xff0c;同时 prop 属性直接定位到具体循环元素。这个用法的前提是在循环外面包裹一个 el-form 元素&#xff0c;v-for 位于 el-form-item 中。 <template><el-form:model…

深入浅出对话系统——对话管理与对话生成

引言 对话管理 我们知道对话管理主要包括状态追踪(DST)和策略优化(DPO)。 对话管理模块包含两个子任务&#xff1a; 对话状态追踪(Dialogue State Tracking) 根据用户输入和对话历史识别对话状态&#xff1b;策略学习(Policy Learning) 根据识别到的对话状态选择合适的下一步…

BC SU21 对象 ZJHD_LGO 已交付;只能进行有限更改

ECC 升级S4 库位从ECC的唯一库位 → S4 工厂 库位才能唯一。 那原先的 依据库存地 控制库位的zjhd打印机的权限需要新增工厂字段。 但是su21的修改的时候 提示 &#xff1a;对象 ZJHD_LGO 已交付&#xff1b;只能进行有限更改 查了一下&#xff0c;SAP官方说只能 把该权限…

HCIP第二次作业

要求&#xff1a;R1-R2-R3-R4-R5 RIP 100运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1-R2之间增加路由传递…

部署springboot项目读取外部配置文件

我们在部署springboot项目的时候&#xff0c;经常会遇到这样的情况&#xff1a;测试环境与生产环境的配置不一样&#xff0c;这就导致每次部署的时候都要修改配置文件再打包&#xff0c;即使用了nacos进行配置管理&#xff0c;但测试环境与生产环境的nacos部署的地方肯定不一样…

MyBatis简单入门

文章目录 快速入Mapper代理开发具体步骤使用mapper代理中的包扫描 查询字段名称不一致问题方法一&#xff1a;对SQL语句起别名方法二&#xff1a; 采用resultMap映射 条件查询单条件查询SQL中特殊字符的处理 多条件查询方式一&#xff1a;散装参数方式二&#xff1a;对象参数方…

ABAP:ABAP解析xml文件的方法

目前我在ECC的系统找到两种实现XML解析的办法&#xff0c;第一种是通过strans创建转化例程&#xff0c;然后在程序中调用转化例程来转化xml&#xff0c;第二种是调用方法按照node解析xml。 要转化的xml文件demo如下 <?xml version"1.0" encoding"Windows-…

1.5 编写自定位ShellCode弹窗

在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码&#xff0c;虽然简易ShellCode可以被正常执行&#xff0c;但却存在很多问题&#xff0c;由于采用了硬编址的方式来调用相应API函数的&#xff0c;那么就会存在一个很大的缺陷&#xff0c;如果操作系统的版本不…

提取图像中的文本信息(Tesseract OCR 和 pytesseract)

环境准备 安装Tesseract&#xff1a;点这里参考本人博客 下载第三方库 pip install Pytesseract这个库只自带了一个英语的语言包&#xff0c;这个时候如果我们图片中有对中文或者其他语言的识别需求&#xff0c;就需要去下载其他语言包 下载其他语言包 进入官网以后进入Tra…

MyBatisPlus基础知识

一、MyBatisPlus 1.MyBatisPlus入门案例与简介 这一节我们来学习下MyBatisPlus的入门案例与简介&#xff0c;这个和其他课程都不太一样&#xff0c;其他的课程都是先介绍概念&#xff0c;然后再写入门案例。而对于MyBatisPlus的学习&#xff0c;我们将顺序做了调整&#xff0…