Redis④ —— 高可用

news2024/9/22 5:35:50

1. 主从复制

  • 一主多从模式,采用读写分离的方式
  • 主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。
  • 主从服务器之间的命令复制是异步进行的

1.1 第一次同步

  • 建立连接、协商同步
    • 主服务器会把所有的数据都同步给从服务器(全量复制)。
  • 主服务器同步数据给从服务器
    • 主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器
    • 从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件(异步)
    • 为了保证主从服务器的数据一致性,主服务器在下面这三个时间间隙中将收到的写操作命令,写入到 replication buffer 缓冲区里
      • 主服务器生成 RDB 文件期间;
      • 主服务器发送 RDB 文件给从服务器期间;
      • 从服务器加载 RDB 文件期间;
  • 主服务器发送新写操作命令给从服务器
    • 主服务器将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,从服务器执行来自主服务器 replication buffer 缓冲区里发来的命令,这时主从服务器的数据就一致了

1.2 命令传播

  • 主从服务器在完成第一次同步后,双方之间就会维护一个 TCP 连接。
  • 连接是长连接的,目的是避免频繁的 TCP 连接和断开带来的性能开销

1.3 分摊主服务器的压力

  • 从服务器可以有自己的从服务器,可以把拥有从服务器的从服务器当作经理角色,它不仅可以接收主服务器的同步数据,自己也可以同时作为主服务器的形式将数据同步给从服务器
  • 通过这种方式,主服务器生成 RDB 和传输 RDB 的压力可以分摊到充当经理角色的从服务器

在这里插入图片描述

1.3.1 增量复制

  • 网络断开又恢复后,从主从服务器会采用增量复制的方式继续同步,也就是只会把网络断开期间主服务器接收到的写操作命令,同步给从服务器。
  • 主服务器怎么知道要将哪些增量数据发送给从服务器呢
    • repl_backlog_buffer,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据;
    • replication offset,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用 master_repl_offset 来记录自己「」到的位置,从服务器使用 slave_repl_offset 来记录自己「」到的位置。
  • 如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用增量同步的方式;
  • 相反,如果判断出从服务器要读取的数据已经不存在 repl_backlog_buffer 缓冲区里,那么主服务器将采用全量同步的方式。

在这里插入图片描述

2. 哨兵机制

  • 实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端
  • 哨兵其实是一个运行在特殊模式下的 Redis 进程,相当于是“观察者节点”,观察的对象是主从节点。
  • 主要负责三件事情:监控、选主、通知
  • 哨兵节点通过 Redis 的发布者/订阅者机制,哨兵之间可以相互感知,相互连接,然后组成哨兵集群,同时哨兵又通过 INFO 命令,在主节点里获得了所有从节点连接信息,于是就能和从节点建立连接,并进行监控了。
  • 流程:
    • 判断主节点下线
      • 某个哨兵判定主节点下线(主观下线)后,就会向其他哨兵发起命令,其他哨兵收到这个命令后,就会根据自身和主节点的网络状况,做出赞成投票或者拒绝投票的响应。当赞成数到达预定值后,标记为客观下线
    • 选出哨兵leader
      • 拿到半数以上的赞成票
      • 拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值
    • 哨兵leader进行主从故障转移
      • 在已下线主节点(旧主节点)属下的所有「从节点」里面,挑选出一个从节点,并将其转换为主节点,选择的规则:
        • 过滤掉已经离线的从节点
        • 过滤掉历史网络连接状态不好的从节点
        • 将剩下的从节点,进行三轮考察:优先级、复制进度、ID 号。在每一轮考察过程中,如果找到了一个胜出的从节点,就将其作为新主节点
      • 让已下线主节点属下的所有「从节点」修改复制目标,修改为复制「新主节点」
      • 将新主节点的 IP 地址和信息,通过「发布者/订阅者机制」通知给客户端
      • 继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点

3. 切片集群模式

  • 当 Redis 缓存数据量大到一台服务器无法缓存时,就需要使用 Redis 切片集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。
  • 采用哈希槽(Hash Slot),来处理数据和节点之间的映射关系。一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中
    • 根据键值对的 key,按照 CRC16 算法 计算一个 16 bit 的值
    • 再用 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽
  • 哈希槽怎么被映射到具体的 Redis 节点上的呢
    • 平均分配: 在使用 cluster create 命令创建 Redis 集群时,Redis 会自动把所有哈希槽平均分布到集群节点上。比如集群中有 9 个节点,则每个节点上槽的个数为 16384/9 个。
    • 手动分配: 可以使用 cluster meet 命令手动建立节点间的连接,组成集群,再使用 cluster addslots 命令,指定每个节点上的哈希槽个数。
      • 在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作

4. 集群脑裂

4.1 什么是脑裂?

  • 由于网络问题,主节点与从节点失联,但是主节点与客户端网络正常,客户端仍然向主节点写数据,但是此时主节点无法同步数据给从节点。哨兵模式选举新的leader作为主节点,这时集群有两个主节点了。

4.2 为什么集群脑裂会导致数据丢失?

  • 网络好了之后,哨兵会把原来的主节点降级为从节点,然后从节点会向新的主节点请求数据同步。
  • 第一次同步是全量同步,该从节点会清除自己本地的数据,然后再全量同步。这样会导致客户端之前写入的数据都丢失了

4.3 如何解决

  • 当主节点发现从节点下线或者通信超时的总数量小于阈值时,那么禁止主节点进行写数据,直接把错误返回给客户端。
  • 等到新主库上线时,就只有新主库能接收和处理客户端请求,此时,新写的数据会被直接写到新主库中。而原主库会被哨兵降为从库,即使它的数据被清空了,也不会有新数据丢失。

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

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

相关文章

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具,用于列出正在运行的Java进程 jps命令的使用:cmd打开直接jps 1.1不带参数: jps 默认情况下,列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l:显示完整的主类名或 JAR 文件…

《故障复盘 · 数据库连接异常关闭》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

不开放80或443端口也能申请IP SSL证书!

在申请SSL/HTTPS证书时,如果不方便使用域名或者没有域名,就要申请一种特殊的SSL证书——IP SSL证书。但是一般的IP地址证书签发过程中,需要短暂开放80或者443端口才能签发成功。那么问题来了,有的实在不能开放80或者443端口&#…

keil中GD32 MCU IAP中APP的存储地址如何设置?

前面和大家聊过什么是IAP,那么IAP中APP的存储地址该如何设置呢? 以keil为例,打开工程的option选项卡: 将IROM1中的地址改为你想要保存的位置,比如0x08008000开始的位置: 这样通过keil烧录,程序…

记录|.NET上位机开发和PLC通信的实现

本文记录源自:B站视频 实验结果:跟视频做下来是没有问题的。能运行。 目录 前言一、项目Step1. 创建项目Step2. 创建动态图片展示Step3. 创建图片型按钮Step4. 创建下拉框Step1~4的效果展示Step5. 编程实体类操作类Main函数 Step1~5的效果展示Main函数 最…

[Python学习篇] Python PyMysql

什么是PyMysql PyMysql是一个纯 Python 实现的 MySQL 客户端库,允许你在 Python 程序中与 MySQL 数据库进行交互。 安装PyMysql PyMysql地址:https://pypi.org/project/PyMySQL/ pip install pymysql 使用PyMysql 连接mysql import pymysql# 数据库连…

数据库redis命令作业九

1、安装redis,启动客户端、验证。 2、string类型数据的命令操作: (1) 设置键值: (2) 读取键值: (3) 数值类型自增1: (4) 数…

【单片机毕业设计选题24064】-基于阿里云的鱼塘水质检测系统

系统功能: 主控为STM32F103C8T6,通过PH值传感器、浑浊度传感器、温度传感器采集各项水质数据,系统可设定各参数 的阈值,超过设定的阈值将通过蜂鸣器响来提醒用户做出措施,同时通过ESP-12F WIFI模块将设备连接阿里云 物联网平台…

信通院全景图发布 比瓴科技领跑软件供应链安全,多领域覆盖数字安全服务

近日,中国信息通信研究院在2024全球数字经济大会—数字安全生态建设专题论坛正式发布首期《数字安全护航技术能力全景图》(以下简称全景图)。 比瓴科技入选软件供应链安全赛道“开发流程安全管控、交互式安全测试、静态安全测试、软件成分分…

rtf是什么格式的文件?rtf格式和word的区别是什么?

RTF是什么格式的文件? RTF(富文本格式,Rich Text Format)和Word文档(以.doc和.docx为扩展名的Microsoft Word文档)是两种常用的文本文件格式。它们在文件结构、兼容性、功能和使用场景等方面存在一些显著差异。 比如…

泰迪智能科技江西大数据实验室成功案例介绍说明

高校大数据实验室作为作为支撑高校人培方案实施的核心设施,实验室的建设一定要与学科建设、人才培养充分融合,是一个包含物理空间硬件资源软件资源课程内容的系统化工程。高校在实验室规划过程中,第一要务就是从学科定位出发、结合学校的特色…

ASP.NET MVC-制作可排序的表格组件-PagedList版

环境: win10 参考: 学习ASP.NET MVC(十一)——分页 - DotNet菜园 - 博客园 https://www.cnblogs.com/chillsrc/p/6554697.html ASP.NET MVCEF框架实现分页_ef 异步分页-CSDN博客 https://blog.csdn.net/qq_40052237/article/details/106599528 本文略去…

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统,基于强大的32 位微处理器设计,采用Linux操作系统,是一种模块化的分布式I/O系统。该系统由3部分组成:现场总线耦合器和各种类型的(数字和模拟信号以及特殊功能)I/O模块…

部署k8s 1.28.9版本

继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下,需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇,完整版带截图的步骤。现在行业这么卷。离…

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

前言 我们在编写上位机与倍福PLC通信的过程中,有时候我们没有真实的Plc,但是我们又想提前测试与倍福PLC的通信,那么这个时候我们就可以使用倍福的仿真软件模拟PLC,然后我们上位机就可以与仿真PLC进行通信了,下面进行详细介绍: 1、下载并安装倍福PLC编程软件TwinCAT 安…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件,可以gif格式,也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue);组件中含有“动态接收图片路径”,“10秒超时未false则自动断开关闭Loading”;在全…

基于STC8H4K64TL单片机的触摸功能调试

基于STC8H4K64TL单片机的触摸功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

在MoneyPrinterPlus中使用本地chatTTS语音模型

之前MoneyPrinterPlus在批量混剪,一键AI生成视频这些功能上的语音合成功能都用的是云厂商的语音服务,比阿里云,腾讯云和微软云。 云厂商虽然提供了优质的语音服务,但是用起来还是要收费。 为了各位小伙伴的钱包,现在特意给Money…

基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)…

【Springboot】新增profile环境配置应用启动失败

RT 最近接手了一个新的项目,为了不污染别人的环境,我新增了一个自己的环境配置。结果,在启动的时候总是失败,就算是反复mvn clean install也是无效。 问题现象 卡住无法进行下一步 解决思路 由于之前都是能启动的&#xff0c…