浅谈 Redis 主从复制原理(二)

大家好,我是此林。

【浅谈 Redis 主从集群原理(一) 】

上一篇文章中,说到了 Redis 主从复制的全量同步和增量同步,repl_baklog 复制缓冲区,以及 slave 挂掉之后数据同步的措施。

下面介绍的上一篇遗留问题,主节点 master 宕机了,怎么办?

1. 哨兵(Sentinel)

这里贴一张网上的图,对哨兵有个整体了解。

 哨兵的作用有三个:

1. 监控:不断地检查 master 和 slave 是否按照预期工作。

2. 自动故障恢复:如果 master 宕机,哨兵会选举一个 slave 提升为 master。

3. 通知:当集群发生故障转移时,会将最新信息推送给 Redis 客户端(如:RedisTemplate)

2. 服务监控

哨兵基于心跳机制监测服务状态,每隔 1 秒向集群的每个实例发送 ping 命令。

  • 主观下线:如果某一个哨兵发现有节点没有在规定时间内相应,认为该节点主观下线。
  • 客观下线:一般如果超过一半数量的哨兵都认为该节点宕机,那么该节点客观下线。

3. master 选举

如果发现 master 宕机了,需要在 slave 中选举一个作为新的 master。

选举优先级规则:

1. 先根据 slave 和 master 断开时间的长短,剔除掉超过指定阈值的 slave。

2. 然后在剩余的节点中,比较 slave-priority 的大小,越小优先级越高(可以通过配置文件配置)

3. 如果 slave-priority 一样,就比较 slave 的 offset,就是同步进度,越大的代表数据越新。

4. 最后比较 slave 节点的 id 大小,越小优先级越高。

4. 故障转移

当选了一个 slave 作为新的 master 后,开始进行故障转移。

1. 哨兵向新的 master 发送 slaveof no one 命令,让 slave 变成 master。

2. 哨兵再向其他节点发送 slaveof  新master的IP  新master的端口,让其他节点成为新 master 的 slave。

3. 最后,把故障节点标记为 master,这样故障节点恢复后就会成为新 master 的 slave。

5. 哨兵集群搭建

哨兵集群信息如下:

哨兵节点IP地址端口号
s1192.168.183.12827001
s2192.168.183.12827002
s3192.168.183.12827003

主从集群信息如下:

节点IP地址端口号
master192.168.183.1287001
slave1192.168.183.1287002
slave2192.168.183.1287003

目录信息如下:

在s1、s2、s3目录下创建 sentinel.conf,这是 s1 的。

注:vi 命令编辑,:wq 保存,:q! 不保存退出,键盘按下 i 是insert 模式,\+关键字是搜索

配置解释:

port 27001:指定哨兵端口

sentinel announce-ip :声明当前哨兵的IP地址

sentinel monitor:指定主节点信息。mymaster 是主节点名称,IP 和 端口也是主节点的,2 是当超过两个哨兵认为某个节点主观下线的时候,那么该节点客观下线。

为什么只要配置 master:master 上可以通过 info replication 命令查询到 slave 的信息,所以实际上还是会监控整个集群的。

sentinel down-after-milliseconds:slave 和 master 断开的最大时长

sentinel failover-timeout:slave 故障恢复的超时时间

哨兵启动:

redis-sentinel s1/sentinel.conf
redis-sentinel s2/sentinel.conf
redis-sentinel s3/sentinel.conf

 

6. RedisTemplate 哨兵模式

RedisTemplate 作为 Redis 的一个客户端,底层利用 lettuce 实现节点的感知和自动切换。

在application.yml 里配置如下:

这里我们发现只要配置哨兵节点即可。

所以总结之前的,可知哨兵有如下作用:

1. 服务监控

2. master 选举和 slave 故障转移

3. 通知 Redis 客户端节点变化

主从读写配置:

@Bean
public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer() {
    return configBuilder -> configBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

这里的 ReadFrom 是配置 Redis 的读取策略:

MASTER:从主节点读取

MASTER_PERFERRED:优先从 MASTER 读取,MASTER 不可用才读取 slave。

REPLICA:从从节点读取

REPLICA_PERFERRED:优先从从节点读取,slave 不可用才读取 MASTER。

主从切换、读写分离、故障转移通知接收由 RedisTemplate 全自动完成,底层已经封装好了,我们无需关注。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接雨水的算法

题目 代码 # 接雨水算法 def trap(height):# 1. 特殊情况:数组为空 则返回0if not height:return 0n len(height)# 2. 初始化左右指针,左右最大值,结果left, right 0, n - 1# maxleft代表左边最大值,maxright代表右边最大值max…

【C++】list 链表的使用+模拟实现

目录 文章目录 前言 一、list的简介 二、list的使用方法 三、list的模拟实现 1.基本框架: 2.迭代器实现 3.常用接口实现 四、完整代码 总结 前言 本文主要介绍C【STL】容器中的 list,包括接口说明和模拟实现。其中讲解了迭代器功能上的分类&am…

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动,当玩家点击键盘上的左右按键时,汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中,第20行代码通过pygame.key.get_pressed()函数获…

RT-Thread+STM32L475VET6——ADC采集电压

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开ADC1的通道3,并配置为连续采集模式(ADC根据自己需求调整)1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…

Jupyter Notebook切换虚拟环境(Kernel管理)

我们在使用Jupyter Notebook的时候,打开文件发现只有一个Python3(ipykernel),我们自己在conda中创建的虚拟环境为什么没有显示出来,今天我就来和大家一起讨论一下! 在 Jupyter Notebook 中,kernel 是执行代码的核心。管…

Ubuntu 22.04 Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能,可以与用户进行自然语言交互,回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括: 强大的语言理解能力:能够理解和生成自然语言,与用户进行流畅的对话。多领域知识&…

Transformer LLaMA

一、Transformer Transformer:一种基于自注意力机制的神经网络结构,通过并行计算和多层特征抽取,有效解决了长序列依赖问题,实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs,完全依靠 Attention的优…

mysql的源码包安装

安装方式一:(编译好的直接安装) 1.添加一块10G的硬盘,给root逻辑卷扩容 (下面安装方式二有,一模一样的装就行,我就不写了,再写的话篇幅就太长了) 2.下载编译好的源码包…

内网网络安全的解决之道

本文简要分析了企业内部网络所面临的主要分析,阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状,并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全&#xff…

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

Orange 单体架构 - 快速启动

1 后端服务 1.1 基础设施 组件说明版本MySQLMySQL数据库服务5.7/8JavaJava17redis-stackRedis向量数据库最新版本Node安装Node22.11.0 1.2 orange-dependencies-parent 项目Maven依赖版本管理 1.2.1 项目克隆 GitHub git clone https://github.com/hengzq/orange-depende…

在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)

在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 安全性风险:内外网直连可能导致病毒传播、数据泄露。 操作繁琐:传统方式需频繁切换网络环境&…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么? Unity 是一款广受欢迎的跨平台游戏开发引擎,由 Unity Technologies 公司开发并推出。它以强大的功能和易用性,在游戏开发领域占据着举足轻重的地位,甚至可以说,它改变了游戏开发的格局。凭借其出色的跨…

骁勇善战的量化利器:多因子模型【量化理论】

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 风险模型雏形 股票因子受多种因素影响,其价格由多种因素决定,所谓的多因子策略就是要发掘诸如此类的因子,以一种合理的方…

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门:DeepSeek 在这里主要介绍DeepSeek的两种部署方法,一种是调用API,一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘,不要放c盘 3.进入软件后…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候,用户会使用多个编辑器打开同一个文件,如果在A编辑器修改保存,但是B编辑器没有重新打开,直接在B编辑器修改再保存,则可能造成在A编辑器中修改的内容丢失,因此&#x…

【Linux】【网络】不同子网下的客户端和服务器通信

【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时,发现在不同wifi下两个电脑无法进行连接,大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试 这部分内容参考并搬运自 q1mi 老师的技术博客,原文的链接为:https://liwenzhou.com/posts/Go/benchmark-tools/。 压测相关术语 响应时间(RT):指系…