当前位置: 首页 > news >正文

【Java八股学习】Redis高可用 思维导图

在这里插入图片描述

说明

文章内容通过学习小林Coding内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下:

  • 主从复制是怎么实现的?
  • 为什么要有哨兵?

思维导图会不断修改完善,下方的文字内容不一定会跟着修改,请大家以思维导图的内容为准。

Redis高可用

Redis部署方式

单服务器部署

  • 宕机,需要时间恢复,期间无法提供服务
  • 硬盘损坏,数据丢失

多服务器部署

  • 一台服务器出问题,其他服务器还能提供服务

  • 有什么问题

    • 服务器之间的数据如何保持一致
    • 数据的读写操作在服务器间如何分配
  • 问题如何解决

    • 交给主从复制

主从复制

是什么

  • 主从服务器使用读写分离方式,主可读写,从只读
  • 主发生写操作时自动将写操作同步给从

有什么用

  • 保证主从服务器的数据一致性

怎么确定主从关系

  • B服务器执行下面命令,就变成A服务器的从节点
  • replicaof <A 的 IP 地址> < A 的 Redis 端口号>

第一次同步

  • 为什么

    • 刚建立主从关系时,主从服务器的数据不一致,需要进行第一次同步
  • 什么步骤

      1. 建立链接、协商同步
      • 从执行 replicaof 命令后,就会给主发送 psync 命令

        • psync表示要进行数据同步

        • psync包含两参数

          • runID

            • 每个Redis服务器在启动时会生成一个随机runID来标识自己
            • 第一次同步,从不知道主的runID,因此设置为 ?
          • offset

            • 表示复制的进度
            • 第一次同步设置为-1
      • 主收到psync命令后,将 FULLRESYNC 作为响应命令返回给对方

        • FULLRESYNC返回两参数

          • 主的runID
          • 主的复制进度offset
      • 从收到响应之后,记录相应的参数

      1. 主同步全量数据给从
      • 步骤

        • 主执行 bgsave 命令fork子进程来生成 RDB 文件并发送给从
        • 从收到 RDB 文件后,先清空当前数据,后载入 RDB 文件
      • 问题

        • 在生产RDB文件期间,主收到的写操作不会写到RDB文件中,主从数据会不一致

        • 解决

          • 主在这三个时间间隙中将收到的写操作命令,写入到replication buffer里

            • 主生成RDB文件期间
            • 主发送RDB给从期间
            • 从加载RDB文件期间
      1. 主发送新写操作命令给从
      • 从载入RDB文件后,回复一个确认消息给主
      • 主将replication buffer里的写操作命令发送给从来执行,这时主从的数据就一致了

命令传播

  • 是什么

    • 主从完成第一次同步后,双方会维护一个 TCP 长连接,后续主通过该连接继续将写操作命令传播给从来执行,使主从数据一致

增量复制

  • 为什么需要增量复制

    • 主从服务器在命令传播时,网络连接不一定永远稳定,若网络不稳定,部分写操作命令同步失败,主从的数据就会不一致

    • 断开的网络恢复正常后,怎么重新保证主从的数据一致

      • Redis2.8前:主从重新进行数据全量复制,性能不好
      • Redis2.8后:使用增量复制,把网络断开期间的写操作命令同步给从
  • 过程

      1. 从恢复网络后,发送 psync 命令给主,此时 psync 命令里的offset不是 -1
      1. 主收到 psync 命令后,用 CONTINUE 响应命令告诉从将采用增量复制的方式同步数据
      1. 主将主从服务器断线期间,所执行的写命令发送给从执行
  • 问题

    • 主怎么知道那些是增量数据

      • 存储相关信息

        • repl_backlog_buffer

          • 一个环形缓冲区,用于主从断连后,从中找到差异的数据
        • replication offset

          • 标记环形缓冲区的同步进度

            • 主使用 master_repl_offset 记录自己写到的位置
            • 从使用 slave_repl_offset 记录自己读到的位置
      • 主进行命令传播时,不仅会将写命令发送给从,还会将写命令写入到 repl_backlog_buffer ,因此缓冲区里会保存着最近传播的写命令

      • 当从重新连上主服务器时,从通过 psync 命令将slave_repl_offset 发送给主,主根据 master_repl_offset 和 slave_repl_offset 之间的差距来决定对从服务器执行哪种同步操作

        • 从要读取的数据还在 repl_backlog_buffer 里,使用增量同步
        • 从要读取的数据不在 repl_backlog_buffer 里,使用全量同步
      • repl_backlog_buffer 默认大小是 1M,因其是环形缓冲区,当缓冲区写满后,主继续写入的话,就会覆盖之前的数据。若从想读的数据被覆盖,就只能进行全量同步,性能损耗较大

        • 优化:调整repl_backlog_buffer大小,降低覆盖概率

        • 设置多大?

          • sw(保险起见,可以设置为2sw)
          • s:从断线后重新连接主所需的平均秒数
          • w:主平均每秒产生的写命令数据量大小
        • 怎么设置

          • 修改redis.conf
          • repl-backlog-size 1mb

经理角色分摊主服务器的压力

  • 为什么要分摊

    • 主从在第一次数据同步的过程中,主会生成 RDB 文件和传输 RDB 文件,这两个操作比较耗时

      • 主生成 RDB 文件时,会忙于使用 fork() 创建子进程,如果主的内存数据非常大,执行 fork() 函数时会阻塞主线程,使得 Redis 无法正常处理请求
      • 传输 RDB 文件会占用主的网络带宽,影响主响应命令请求
  • 怎么分摊

    • 从有自己的从节点,将拥有从节点的从当作经理角色,它不仅接收主的同步数据,同时作为主将数据同步给自己的从节点
  • 怎么操作

    • 服务器执行下面命令,将其作为经理服务器的从节点。执行完成之后,经理就会将数据同步给自己的从节点
    • replicaof <想作为经理的IP> <Redis端口>

哨兵机制

为什么需要哨兵机制

  • 主从模式是读写分离的,如果主节点挂了,则没法服务客户端的写请求,也没有主节点给从节点同步数据。
  • 如果需要恢复服务,需要人工介入,恢复主节点或将一个从节点改为主节点。需要一套更加智能的方式
  • Redis2.8后提供哨兵模式,可检测主节点是否存活,若主节点挂了,则重新推举一个从节点成为主节点,并且把新主节点的相关信息通知给从节点和客户端(主从故障迁移)

哨兵介绍

  • 是什么

    • 哨兵其实是一个运行在特殊模式下的 Redis 进程
  • 做什么

    • 监控主从节点的状态
    • 选主
    • 通知

如何判断主节点是否故障

  • 主节点主观下线

    • 哨兵节点每隔 1 秒给所有主从节点发送 PING 命令,当主从节点收到 PING 命令后,会发送一个响应命令给哨兵,如果主节点或者从节点没有在规定的时间内响应,哨兵就会将它们标记为【主观下线】
    • 规定时间设置: 修改哨兵配置文件的down-after-milliseconds,单位是毫秒
  • 主节点客观下线

    • 可能主节点没有故障,只是因为主节点的系统压力比较大或者网络发送了拥塞,导致没有在规定时间内响应哨兵的 PING 命令(会造成误判)

    • 为了减少误判,针对主节点还设置了【客观下线】状态,即经过集群投票(让多个哨兵一起判断,避免单个哨兵自身网络不好误判主节点下线)认定的下线为【客观下线】(单个节点判断的为【主观下线】)

    • 投票步骤

      • 当一个哨兵判断主节点为【主观下线】后,向其他哨兵发起is-master-down-by-addr 命令,其他哨兵收到这个命令后,就会根据自身和主节点的网络状况,做出赞成投票或者拒绝投票的响应
      • 当这个哨兵的赞同票数达到哨兵配置文件中的 quorum 配置项设定的值后,这时主节点就会被【该哨兵】标记为【客观下线】(如集群中有三个哨兵,quorum为2,则三个哨兵中至少需要两个赞成,发起投票者也算赞成)
      • quorum 一般设置为(哨兵个数/2)+ 1

哪个哨兵进行主从故障转移

  • 在判断主节点客观下线后,由哪个节点(Leader)来进行主从故障转移?

  • 候选者

    • 那个将主节点标记为【客观下线】的节点,其实就是第一个判断主节点为【主观下线】的节点
    • 如果某个时间点有两个哨兵节点判断到主节点为客观下线,则有两个候选者
  • Leader选举

    • 候选者会让其他哨兵对它进行投票,每个哨兵只有一次投票机会,候选者可以投给自己

    • 多个候选者,哨兵投给谁?

      • 先收到谁的命令,就投给谁(先到先得)
    • 需要满足

        1. 拿到半数以上(大于半数)的赞成票
        1. 拿到的票数需要大于等于哨兵配置文件中的 quorum 值
      • 注意:候选者会默认给自己投一票,没有则需要重新选举
    • 为什么哨兵节点至少要有 3 个

      • 哨兵集群中只有 2 个哨兵节点,此时如果一个哨兵想要成功成为 Leader,必须获得 2 票,只要挂一个,就没办法进行主从节点切换
      • 哨兵集群中有 3 个哨兵节点,要挂一个,还是有机会投票成功。挂两个就需要人工介入
    • 为什么 quorum 设置为(哨兵个数/2)+ 1

      • 如集群有三个节点,其中两个节点宕机,quorum设置为1
      • 这时可以完成客观下线,却不能完成主从切换,因此quorum设置为1没有意义

主从故障转移的过程

  • 挑选从节点

    • 做什么

      • 在已下线主节点属下的所有从节点里面,挑选出一个状态良好、数据完整的从节点,给其发送SLAVEOF no one命令将其转换为主节点
    • 怎么做

        1. 过滤掉下线和网络状态不好的节点
        • Redis 有个叫 down-after-milliseconds * 10 配置项,其 down-after-milliseconds 是主从节点断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内,主从节点都没有通过网络联系上,我们就可以认为主从节点断连了。如果发生断连的次数超过了 10 次,就说明这个从节点的网络状况不好,不适合作为新主节点
        1. 优先级最高的从节点胜出
        • Redis 有个叫 slave-priority 配置项,可以根据服务器配置给从节点设置优先级
        1. 复制进度最靠前的从节点胜出
        • 如果某个从节点的 slave_repl_offset 最接近 master_repl_offset,说明它的复制进度是最靠前的
        1. ID 号小的从节点胜出
        • 每个从节点都有一个编号,这个编号就是 ID 号,是用来唯一标识从节点的
  • 被挑选从节点转化为主节点

    • 哨兵 leader 向被选中的从节点发送 SLAVEOF no one 命令,让这个从节点解除从节点的身份,将其变为新主节点
    • 在发送 SLAVEOF no one 命令之后,leader 会以每秒一次的频率向被升级的从节点发送 INFO 命令(没进行故障转移之前,INFO 命令的频率是每十秒一次),并观察命令回复中的角色信息,当被升级节点的角色信息从原来的 slave 变为 master 时, leader 就知道从节点顺利升级为主节点了
  • 将从节点指向新主节点

    • 哨兵 leader 向所有从节点发送 SLAVEOF 命令让它们成为新主节点的从节点
  • 通知客户端主节点更换信息

    • 通过 Redis 的发布者/订阅者机制来实现。每个哨兵节点提供发布者/订阅者机制,客户端可以从哨兵订阅消息
    • 主从切换完成后,哨兵就会向 +switch-master 频道发布新主节点的 IP 地址和端口的消息,客户端收到信息,然后用新主节点的 IP 地址和端口进行通信
    • 通过发布者/订阅者机制机制,客户端不仅可以在主从切换后得到新主节点的连接信息,还可以监控到主从节点切换过程中发生的各个重要事件。有助于客户端了解主从切换进度
    • 事件通知有哪些?
  • 旧主节点上线,将其变为从节点

    • 主从切换后,哨兵集群继续监视旧主节点,当旧主节点重新上线时,哨兵集群就会向它发送 SLAVEOF 命令,让它成为新主节点的从节点

哨兵集群是如何组成

  • 配置哨兵

    • sentinel monitor
  • 哨兵之间相互感知

    • 配置哨兵时,不需要填其他哨兵信息,哨兵节点之间可以通过 Redis 的发布者/订阅者机制来相互发现
    • 在主从集群中,主节点上有一个名为sentinel:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的
  • 哨兵集群如何知道从节点信息

    • 主节点知道所有从节点信息,所以哨兵会每 10 秒一次的频率向主节点发送 INFO 命令来获取所有从节点的信息

相关文章:

【Java八股学习】Redis高可用 思维导图

说明 文章内容通过学习小林Coding内的优质文章后整理而来&#xff0c;整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除&#xff0c;再次对小林Coding内的优质文章表示感谢。参考文章如下&#xff1a; 主从复制是怎么实现的&#xff1f;为什么要有哨…...

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…...

JavaScript构造函数(new构造js对象与原型链prototype)

构造函数详解 铺垫&#xff1a;面向对象编程一、构造函数是什么&#xff1f;二、构造函数的作用&#xff1f;三、构造函数的执行过程&#xff1f;四、构造函数的返回值&#xff1f;五、构造函数为什么要用new关键字调用&#xff1f;六、构造函数的实例成员和静态成员&#xff1…...

【WPF应用31】WPF基本控件-ListView的详解与示例

WPF&#xff08;Windows Presentation Foundation&#xff09;是.NET框架的一个组成部分&#xff0c;它用于构建桌面应用程序的用户界面。ListView是WPF中一个非常强大的数据展示控件&#xff0c;它可以用来显示一系列的项&#xff0c;类似于Windows资源管理器中的文件列表。Li…...

【动态】江西省小型水库安全监测能力提升试点项目通过验收

近日&#xff0c;由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下&#xff0c;省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…...

前视声呐目标识别定位(九)-声呐驱动

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …...

【详解】Windows系统安装Nginx及简单使用

【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么&#xff1f; “Nginx 是一款轻量级的 HTTP 服务器&#xff0c;采用事件驱动的异步非阻塞处理方式框架&#xff0c;这让其具有极好的 IO 性能&#xff0c;时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…...

WebGPU vs. WebGL:前端图形技术的进化与数字孪生的崭新前景

在现代互联网时代&#xff0c;图形渲染在网页应用和数字孪生的开发中起着至关重要的作用。WebGL和WebGPU是两种前端图形技术&#xff0c;它们在处理图形和计算密集型任务时发挥着关键作用。本文将深入研究这两种技术&#xff0c;探讨它们的区别、WebGPU的优势&#xff0c;以及它…...

即刻体验 | 使用 Flutter 3.19 更高效地开发

我们已隆重推出全新的 Flutter 版本——Flutter 3.19。此版本引入了专为 Gemini 设计的新 Dart SDK、一个能让开发者对 Widget 动画实现精细化控制的全新 Widget&#xff0c;Impeller 更新带来的渲染性能提升、有助于实现深层链接的工具和对 Windows Arm64 的支持&#xff0c;以…...

Exchanger 怎么用J.U.C

Exchanger简介 Exchanger通常用来解决以下类似场景的问题&#xff0c;如下&#xff1a;两个线程间需要交换数据的问题&#xff0c;在多线程编程中&#xff0c;经常会有这样的场景&#xff1a;两个线程各自持有一些数据&#xff0c;并且需要在某个点上交换这些数据&#xff0c;…...

校园局域网钓鱼实例

Hello &#xff01; 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全&#xff0c;设计的钓鱼案例也是怎么简陋怎么来 注&#xff1a;本文不会外传代码&#xff0c;后端已停止使用&#xff0c;仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...

网络原理 - HTTP / HTTPS(3)——http响应

目录 一、认识 “状态码”&#xff08;status code&#xff09; 常见的状态码 &#xff08;1&#xff09;200 OK &#xff08;2&#xff09;404 Not Found &#xff08;3&#xff09;403 ForBidden &#xff08;4&#xff09;405 Method Not Allowed &#xff08;5&…...

Flask Python:模糊查询filter和filter_by,数据库多条件查询

数据库&#xff08;sqlalchemy&#xff09;多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询&#xff08;多条件查询&#xff09; 2、filter()like&#xff1a;模糊查询and&#xff1a;并且查询or&#xff1a;或者查询 二、all(),first(),get(…...

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路&#xff1a; 好久没写代码sb了&#xff0c;加上之前写的双指针并不多&#xff0c;以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i&#xff0c;j&#xff0c;初始时i,j都位于左界附近&…...

梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码

源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&#xff0c;把接口本地化&#xff0c;但是集成外链播放器…...

如何通过Spring提供的EL表达式执行bean的属性或方法?

如何通过Spring提供的EL表达式执行bean的属性或方法&#xff1f; 关键两个bean&#xff1a; org.springframework.expression.Expression org.springframework.expression.spel.support.StandardEvaluationContext 实例&#xff1a; import cn.hutool.extra.spring.Spring…...

SSTI 服务器端模板注入(Server-Side Template Injection)

1.【攻防世界】Web_python_template_injection {{}}是变量包裹标识符&#xff0c;里面存放的是一个变量&#xff0c;当你输入 http://61.147.171.105:55121/{{8*8}} 执行成功&#xff0c;说明存在模版注入。接下来&#xff0c;开始想办法编代码拿到服务器的控制台权限 。 首先…...

Vue.js---------Vue基础

能够说出Vue的概念和作用能够使用vue/cli脚手架工程化开发能够熟练Vue指令 一.vue基本概念 1.学习vue Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 渐进…...

力扣经典150题第一题:合并两个有序数组

目录 合并两个有序数组问题详解与解决方法1. 介绍2. 问题描述3. 解题思路4. 算法实现5. 复杂度分析6. 测试和验证7. 扩展如何处理特殊情况和边界条件&#xff1f;如何处理数组中可能存在的重复元素&#xff1f;如何优化算法以减少内存使用或提高执行效率&#xff1f; 8. 总结9.…...

Git:日志修改

一、问题描述 有小伙伴提出一个需求&#xff0c;为了满足某种需要&#xff0c;需要在Git日志中增加一条提交记录&#xff0c;并且需要指定提交时间。 比如&#xff0c;以下面这个only-allow项目为例&#xff0c;想在它的Git日志2023/9/26 19:08:08前插入一条2023/9/28 19:08:0…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...