【Java八股学习】Redis高可用 思维导图
说明
文章内容通过学习小林Coding内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下:
- 主从复制是怎么实现的?
- 为什么要有哨兵?
思维导图会不断修改完善,下方的文字内容不一定会跟着修改,请大家以思维导图的内容为准。
Redis高可用
Redis部署方式
单服务器部署
- 宕机,需要时间恢复,期间无法提供服务
- 硬盘损坏,数据丢失
多服务器部署
-
一台服务器出问题,其他服务器还能提供服务
-
有什么问题
- 服务器之间的数据如何保持一致
- 数据的读写操作在服务器间如何分配
-
问题如何解决
- 交给主从复制
主从复制
是什么
- 主从服务器使用读写分离方式,主可读写,从只读
- 主发生写操作时自动将写操作同步给从
有什么用
- 保证主从服务器的数据一致性
怎么确定主从关系
- B服务器执行下面命令,就变成A服务器的从节点
- replicaof <A 的 IP 地址> < A 的 Redis 端口号>
第一次同步
-
为什么
- 刚建立主从关系时,主从服务器的数据不一致,需要进行第一次同步
-
什么步骤
-
- 建立链接、协商同步
-
从执行 replicaof 命令后,就会给主发送 psync 命令
-
psync表示要进行数据同步
-
psync包含两参数
-
runID
- 每个Redis服务器在启动时会生成一个随机runID来标识自己
- 第一次同步,从不知道主的runID,因此设置为 ?
-
offset
- 表示复制的进度
- 第一次同步设置为-1
-
-
-
主收到psync命令后,将 FULLRESYNC 作为响应命令返回给对方
-
FULLRESYNC返回两参数
- 主的runID
- 主的复制进度offset
-
-
从收到响应之后,记录相应的参数
-
- 主同步全量数据给从
-
步骤
- 主执行 bgsave 命令fork子进程来生成 RDB 文件并发送给从
- 从收到 RDB 文件后,先清空当前数据,后载入 RDB 文件
-
问题
-
在生产RDB文件期间,主收到的写操作不会写到RDB文件中,主从数据会不一致
-
解决
-
主在这三个时间间隙中将收到的写操作命令,写入到replication buffer里
- 主生成RDB文件期间
- 主发送RDB给从期间
- 从加载RDB文件期间
-
-
-
- 主发送新写操作命令给从
- 从载入RDB文件后,回复一个确认消息给主
- 主将replication buffer里的写操作命令发送给从来执行,这时主从的数据就一致了
-
命令传播
-
是什么
- 主从完成第一次同步后,双方会维护一个 TCP 长连接,后续主通过该连接继续将写操作命令传播给从来执行,使主从数据一致
增量复制
-
为什么需要增量复制
-
主从服务器在命令传播时,网络连接不一定永远稳定,若网络不稳定,部分写操作命令同步失败,主从的数据就会不一致
-
断开的网络恢复正常后,怎么重新保证主从的数据一致
- Redis2.8前:主从重新进行数据全量复制,性能不好
- Redis2.8后:使用增量复制,把网络断开期间的写操作命令同步给从
-
-
过程
-
- 从恢复网络后,发送 psync 命令给主,此时 psync 命令里的offset不是 -1
-
- 主收到 psync 命令后,用 CONTINUE 响应命令告诉从将采用增量复制的方式同步数据
-
- 主将主从服务器断线期间,所执行的写命令发送给从执行
-
-
问题
-
主怎么知道那些是增量数据
-
存储相关信息
-
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选举
-
候选者会让其他哨兵对它进行投票,每个哨兵只有一次投票机会,候选者可以投给自己
-
多个候选者,哨兵投给谁?
- 先收到谁的命令,就投给谁(先到先得)
-
需要满足
-
- 拿到半数以上(大于半数)的赞成票
-
- 拿到的票数需要大于等于哨兵配置文件中的 quorum 值
- 注意:候选者会默认给自己投一票,没有则需要重新选举
-
-
为什么哨兵节点至少要有 3 个
- 哨兵集群中只有 2 个哨兵节点,此时如果一个哨兵想要成功成为 Leader,必须获得 2 票,只要挂一个,就没办法进行主从节点切换
- 哨兵集群中有 3 个哨兵节点,要挂一个,还是有机会投票成功。挂两个就需要人工介入
-
为什么 quorum 设置为(哨兵个数/2)+ 1
- 如集群有三个节点,其中两个节点宕机,quorum设置为1
- 这时可以完成客观下线,却不能完成主从切换,因此quorum设置为1没有意义
-
主从故障转移的过程
-
挑选从节点
-
做什么
- 在已下线主节点属下的所有从节点里面,挑选出一个状态良好、数据完整的从节点,给其发送SLAVEOF no one命令将其转换为主节点
-
怎么做
-
- 过滤掉下线和网络状态不好的节点
- Redis 有个叫 down-after-milliseconds * 10 配置项,其 down-after-milliseconds 是主从节点断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内,主从节点都没有通过网络联系上,我们就可以认为主从节点断连了。如果发生断连的次数超过了 10 次,就说明这个从节点的网络状况不好,不适合作为新主节点
-
- 优先级最高的从节点胜出
- Redis 有个叫 slave-priority 配置项,可以根据服务器配置给从节点设置优先级
-
- 复制进度最靠前的从节点胜出
- 如果某个从节点的 slave_repl_offset 最接近 master_repl_offset,说明它的复制进度是最靠前的
-
- 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内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下: 主从复制是怎么实现的?为什么要有哨…...

C++万物起源:类与对象(三)拷贝构造、赋值重载
目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中,我们可以将一个变量赋值给…...
JavaScript构造函数(new构造js对象与原型链prototype)
构造函数详解 铺垫:面向对象编程一、构造函数是什么?二、构造函数的作用?三、构造函数的执行过程?四、构造函数的返回值?五、构造函数为什么要用new关键字调用?六、构造函数的实例成员和静态成员࿱…...
【WPF应用31】WPF基本控件-ListView的详解与示例
WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,它用于构建桌面应用程序的用户界面。ListView是WPF中一个非常强大的数据展示控件,它可以用来显示一系列的项,类似于Windows资源管理器中的文件列表。Li…...

【动态】江西省小型水库安全监测能力提升试点项目通过验收
近日,由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下,省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…...
前视声呐目标识别定位(九)-声呐驱动
前视声呐目标识别定位(一)-基础知识 前视声呐目标识别定位(二)-目标识别定位模块 前视声呐目标识别定位(三)-部署至机器人 前视声呐目标识别定位(四)-代码解析之启动识别模块 …...

【详解】Windows系统安装Nginx及简单使用
【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么? “Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…...
WebGPU vs. WebGL:前端图形技术的进化与数字孪生的崭新前景
在现代互联网时代,图形渲染在网页应用和数字孪生的开发中起着至关重要的作用。WebGL和WebGPU是两种前端图形技术,它们在处理图形和计算密集型任务时发挥着关键作用。本文将深入研究这两种技术,探讨它们的区别、WebGPU的优势,以及它…...

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

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

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

网络原理 - HTTP / HTTPS(3)——http响应
目录 一、认识 “状态码”(status code) 常见的状态码 (1)200 OK (2)404 Not Found (3)403 ForBidden (4)405 Method Not Allowed (5&…...

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

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

梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码
源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题,把接口本地化,但是集成外链播放器…...
如何通过Spring提供的EL表达式执行bean的属性或方法?
如何通过Spring提供的EL表达式执行bean的属性或方法? 关键两个bean: org.springframework.expression.Expression org.springframework.expression.spel.support.StandardEvaluationContext 实例: import cn.hutool.extra.spring.Spring…...

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

Vue.js---------Vue基础
能够说出Vue的概念和作用能够使用vue/cli脚手架工程化开发能够熟练Vue指令 一.vue基本概念 1.学习vue Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 渐进…...
力扣经典150题第一题:合并两个有序数组
目录 合并两个有序数组问题详解与解决方法1. 介绍2. 问题描述3. 解题思路4. 算法实现5. 复杂度分析6. 测试和验证7. 扩展如何处理特殊情况和边界条件?如何处理数组中可能存在的重复元素?如何优化算法以减少内存使用或提高执行效率? 8. 总结9.…...

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

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...