【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…...
【数据库】MySQL InnoDB存储引擎详解 - 读书笔记
MySQL InnoDB存储引擎详解 - 读书笔记 InnoDB 存储引擎概述InnoDB 存储引擎的版本InnoDB 体系架构内存缓冲池LRU List、Free List 和 Flush List重做日志缓冲(redo log buffer)额外的内存池 存储结构表空间系统表空间独立表空间通用表空间undo表空间临时…...
GPT-2原理-Language Models are Unsupervised Multitask Learners
文章目录 前言GPT-1优缺点回顾GPT-1实验结果分析GPT-1缺陷分析 GPT-2训练数据OpenAI的野心预训练/微调的训练范式训练数据选择 模型结构和参数(更大的GPT-1)模型预训练训练参数 输入数据编码 总结 前言 首先强调一下,在看这篇文章之前&#…...
逆向案例十二——看准网企业信息json格式的信息
网址:【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密,返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…...
docker安装jenkins 2024版
docker 指令安装安装 docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts访问…...
输入url到页面显示过程的优化
浏览器架构 线程:操作系统能够进行运算调度的最小单位。 进程:操作系统最核心的就是进程,他是操作系统进行资源分配和调度的基本单位。 一个进程就是一个程序的运行实例。启动一个程序的时候,操作系统会为该程序创建一块内存&a…...
Linux(centos7)部署hive
前提环境: 已部署完hadoop(HDFS 、MapReduce 、YARN) 1、安装元数据服务MySQL 切换root用户 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysqL-2022 # 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm # yu…...
LeetCode | 数组 | 双指针法 | 27. 移除元素【C++】
题目链接 1. 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…...
【Apache Doris】周FAQ集锦:第 2 期
【Apache Doris】周FAQ集锦:第 2 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...
jQuery(二)
文章目录 1.jQuery操作节点1.查找节点,修改属性1.基本介绍2.切换图片案例 2.创建节点1.基本介绍2.内部插入3.外部插入4.小结1.插入方法说明2.两种插入方法的区别 5.插入元素实例6.移动元素实例 3.删除节点1.基本介绍2.代码实例 4.复制节点1.基本介绍2.代码实例 5.替…...
MIT6.828 实验环境安装教程
Thanks:mit6.828环境搭建 - 人云我不亦云的文章 - 知乎 https://zhuanlan.zhihu.com/p/489921553 sudo make && make install install -d -m 0755 "/share/qemu" install: 无法创建目录 “/share”: 权限不够 make: *** [Makefile:382:…...
网站怎样才有流量/单页关键词优化费用
1.C里大写TRUE和小写true区别 true是bool型的; TRUE是int型的,VC里这个是ms自己定义的; C规定不允许只通过返回类型不同区别两个函数 2.MFC中的”false“和 “FALSE"有没区别? 有区别。false是bool类型的值,一个…...
网络维护好学吗/网站页面优化方案
GotW #04 Class Mechanics 著者:Herb Sutter 翻译:kingofark [声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供…...
网站描述优化/做百度推广怎么做才能有电话
Activity进场和出场动画从MainActivity进入到SecondActivity,再点击返回键从SecondActivity进入到MainActivity这样一个过程中如何设置两个Activity创建和销毁的动画呢?第一步:在MainActivity设置Intent进入SecondActivity的代码:…...
北京一诺互联科技有限公司/网络优化包括
知识点: 1.HTTP请求分为俩种: GET方式和POST方式 2.负载均衡常用调度算法: RR:最简单的一种算法,轮询调度。 LC:最小连接数,根据后端的节点连接数大小动态分配前端请求。 SH:基于来…...
山西网站设计/快速排名生客seo
对于中断通俗点说:就是让单片机的cpu暂停执行当前任务转去执行引起中断的任务。刚开始学习单片机时非常排斥中断方面的东西因为要记忆很多寄存器相关的东西什么IE,IP等但是仔细一想如果不懂中断就只能写最简单的顺序执行程序而且非常浪费单片机的这些中断…...
网泰网站建设/网页设计流程步骤
Hello,大家好 这里是壹脑云科研圈,我是大胡同学~ “论文又被拒了”、“今天开组会”、“我还是个单身狗”、“导师push我了”、“国庆要准备给份子钱了”、“发际线越来越高了”、“内卷”……作为一名三年硕、四年博的“资深”科研狗来说&…...