[Redis][哨兵][下]详细讲解

目录

  • 1.安装部署(基于Docker)
    • 1.编排Redis主从节点
    • 2.编排Redis-Sentinel节点
  • 2.重新选举
    • 1.redis-master宕机之后
    • 2.redis-master重启之后
    • 3.总结
  • 3.选举原理
  • 4.总结


1.安装部署(基于Docker)

1.编排Redis主从节点

  • 编写docker-compose.yml
    • 创建/root/redis/docker-compose.yml,同时cdyml所在⽬录中
    • 说明:docker中可以通过容器名字作为ip地址,进⾏相互之间的访问
    version: '3.7'
    services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports: - 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379
    
  • 启动所有容器docker-compose up -d
  • 查看运行日志docker-compose logs

2.编排Redis-Sentinel节点

  • 说明:可以把redis-sentinel放到和上⾯的Redis的同⼀个yml中进⾏容器编排,但此处分成两组,主要是为了两⽅⾯
    • 观察⽇志⽅便
    • 确保Redis主从节点启动之后才启动redis-sentinel
      • 如果先启动redis-sentinel的话,可能触发额外的选举过程,混淆视听
      • 不是说先启动哨兵不⾏,⽽是观察的结果可能存在⼀定随机性
  • 编写docker-compose.yml
    • 创建/root/redis-sentinel/docker-compose.yml ,同时cdyml所在⽬录中
    version: '3.7'
    services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
    networks:default:external:name: redis-data_default
    
  • 创建配置文件:创建sentinel1.confsentinel2.confsentinel3.conf,三分文件的内容是完全相同的,都放在/root/redis-sentinel/⽬录中
    bind 0.0.0.0
    port 26379
    sentinel monitor redis-master redis-master 6379 2
    sentinel down-after-milliseconds redis-master 1000
    
    • 理解sentinel monitor
      • 主节点名:这个是哨兵内部⾃⼰起的名字
      • 主节点ip:部署redis-master的设备ip
        • 此处由于是使⽤docker,可以直接写docker的容器名,会被⾃动DNS成对应的容器ip
      • 法定票数:哨兵需要判定主节点是否挂了,但是有的时候可能因为特殊情况
        • ⽐如主节点仍然⼯作正常,但是哨兵节点⾃⼰⽹络出问题了,⽆法访问到主节点了
        • 此时就可能会使该哨兵节点认为主节点下线,出现误判
        • 使⽤投票的⽅式来确定主节点是否真的挂了是更稳妥的做法
        • 需要多个哨兵都认为主节点挂了,票数 >= 法定票数之后,才会真的认为主节点是挂了
      sentinel monitor 主节点名 主节点 ip 主节点端⼝ 法定票数
      
    • 理解sentinel down-after-milliseconds
      • 主节点和哨兵之间通过⼼跳包来进⾏沟通
      • 如果⼼跳包在指定的时间内还没回来,就视为是节点出现故障
    • 既然内容相同,为啥要创建多份配置⽂件?
      • redis-sentinel在运⾏中可能会对配置进⾏rewrite,修改⽂件内容
      • 如果⽤⼀份⽂件,就可能出现修改混乱的情况
  • 启动所有容器docker-compose up -d
  • 查看运行日志docker-compose logs

2.重新选举

1.redis-master宕机之后

  • 哨兵发现了主节点sdown,进⼀步的由于主节点宕机得票达到 2 / 3 2/3 2/3,达到法定得票,于是master被判定为odown

    • 主观下线(Subjectively Down,SDown):哨兵感知到主节点没⼼跳了,判定为主观下线
    • 客观下线(Objectively Down,ODown):多个哨兵达成⼀致意⻅,才能认为master确实下线了
      请添加图片描述
  • 接下来,哨兵们挑选出了⼀个新的master,上图中,是172.22.04:6379这个节点
    请添加图片描述

  • 此时,对于Redis来说仍然是可以继续使用的


2.redis-master重启之后

  • 哨兵日志:刚才新启动的redis-master被当成了slave
    请添加图片描述

3.总结

  • Redis主节点如果宕机,哨兵会把其中的⼀个从节点,提拔成主节点
  • 当之前的Redis主节点重启之后,这个主节点被加⼊到哨兵的监控中,但是只会被作为从节点使⽤

3.选举原理

  • 假定生产环境如下
    请添加图片描述
  1. 主观下线
    • redis-master宕机,此时redis-master和三个哨兵之间的⼼跳包就没有了
    • 此时,站在三个哨兵的⻆度来看,redis-master出现严重故障,因此三个哨兵均会把redis-master判定为主观下线(SDown)
  2. 客观下线
    • 此时,哨兵sentenal1, sentenal2, sentenal3均会对主节点故障这件事情进⾏投票
    • 当故障得票数 >= 配置的法定票数之后,意味着redid-master故障这个事情被坐实,此时触发客观下线(ODown)
      sentinel monitor redis-master 172.22.0.4 6379 2
      
  3. 选举出哨兵的leader
    • 接下来需要哨兵把剩余的slave中挑选出⼀个新的master这个⼯作不需要所有的哨兵都参与,只需要选出个代表(称为leader),由leader负责进⾏slave升级到master的提拔过程
    • 这个选举过程涉及到Raft算法,假定一共三个哨兵节点S1,S2,S3
      • 每个哨兵节点都给其他所有哨兵节点,发起⼀个"拉票请求"
        • S1 -> S2, S1 -> S3, S2 -> S1, S2 -> S3,S3 -> S1, S3 -> S2
      • 收到拉票请求的节点,会回复⼀个 “投票响应”,响应的结果有两种可能, 投or不投
        • 例如:S1给S2发了个投票请求,S2就会给S1返回投票相应
        • S2是否要投S1,取决于S2是否给别人投过票了(每个哨兵只有一票)
        • 如果没投过(S1是第一个向S2拉票的),S2就会投给S1,否则则不投
      • 一轮投票完成之后,发现得票超过半数的节点,自动成为leader
        • 如果出现平票,则重新再投一次即可
        • 这也是为啥建议哨兵节点设置成奇数个的原因,如果为偶数个,则增大了平票的概率,带来了不必要的开销
      • leader节点负责挑选⼀个slave成为新的master,当其他的sentenal发现新的master出现了,就说明选举结束了
    • 综上Raft算法的核心就是”先下手为强”,谁率先发出了拉票请求,谁就有更大的概率成为leader
      • 决定因素:网络延时,其本身就带有一定的随机性
    • 具体选出的哪个节点是leader不重要,重要的是能选出一个节点
  4. leader挑选出合适的slave成为新的master
    • 挑选规则
      1. 比较优先级,优先级高(数值小的)的上位
        • 优先级是配置文件中的配置项slave-priority或者replica-priority
      2. 比较replication offset,谁复制的数据多,高的上位
      3. **比较run id**,谁的id`小,谁上位
        • :大小全凭缘分,选谁都可以,随便挑一个
    • 当某个slave节点被指定为master之后
      • leader指定该节点执行slave no one,成为master`
      • leader指定剩余的slave节点,都依附于这个新master

4.总结

  • 上述过程,都是"⽆⼈值守",Redis ⾃动完成的,这样做就解决了主节点宕机之后需要⼈⼯⼲预的问题,提⾼了系统的稳定性和可⽤性
  • 注意事项
    • 哨兵节点不能只有一个,否则哨兵节点挂了也会影响系统可用性
      • 分布式系统中,应该避免使用“单点”,应该有冗余
    • 哨兵节点最好是奇数个,方便选举leader,得票更容易超过半数
      • 大部分情况下,3个就足够了
    • 哨兵节点不负责存储数据,仍然是Redis主从节点负责存储
      • 哨兵节点可以使用一些配置不高的机器来部署
    • 哨兵 + 主从复制解决的问题是”提高可用性”,不能解决”数据极端情况下写丢失”的问题
    • 哨兵 + 主从复制不能提高数据的存储容量,当需要存的数据接近或者超过机器的物理内存,这样的结构就不能胜任了
      • 为了能存储更多的数据,就引入了集群

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目文档】软件系统培训方案(Doc原件2024)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解答 软件全套资料部分文档清单: 工作安排任务书,可行性分析报…

JS对不同浏览器的检测问题

Navigator对象也称浏览器对象,该对象包含了浏览器的整体信息,如浏览器名称,版本号等。Navigator对象由Navigator浏览器率先使用,后来各方浏览器都开始支持Navigator对象,逐步成为一种标准。 一、Navigator对象的属性 …

自动化check是不是测试?

这篇文章是reddit上关于质量保障讨论的比较多的帖子,我把它转为中文版,供大家交流学习,由于直接用的翻译软件以及截图,大家凑合看下哈。 自动化检查并不是真正的“测试”?编写自动化检查确实很重要——但编写自动化测…

Android开发MPAndroidChart两条折线图

Android开发MPAndroidChart两条折线图 Android开发两条折线图效果,还是有一定难度的,难点它的起点不是坐标0的开始,还有数值上有背景图 一、思路: 用的是MPAndroidChart的BarChart 二、效果图: 三、关键代码&#…

原生代理IP是什么?

代理IP的各个类型称呼有很多,且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别,帮助大家更好地理解这两者的概念和实际应用,并选择适合自己的IP类型。 一、什么是原生IP? 原…

Netty 与 WebSocket之间的关系

WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色,但它们通常是一起使用的,尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别,我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…

11年408考研真题解析-计算机网络

第一题: 解析:网络层虚电路服务和数据报服务 传输服务只有:有连接可靠和无连接不可靠两种,直接排除BC。 网络层指的是IP协议,由图二可知:运输层,网际层,网络接口层唯一有连接可靠的协…

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法: 一、远程访问软路由的方法 通过Web管理界面访问: 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

MySQl查询分析工具 Optimizer Trace

文章目录 什么是Optimizer Trace如何使用可跟踪哪些sql 相关系统变量optimizer_traceoptimizer_trace_offset和optimizer_trace_limitoptimizer_trace_featuresoptimizer_trace_max_mem_sizeend_markers_in_json information_schema.OPTIMIZER_TRACETRACE列内容解读join_prepar…

观测云链路追踪分析最佳实践

背景 如果要在开发、运维和工程层面持续改进一个涉及多服务的应用,以链路追踪、日志检索、指标收集、用户体验监测、性能剖析、关联分析等作为代表性技术的可观测性必不可少,这一看法已成为共识,但在采用这项技术的过程中,如何分…

设备管理与点巡检系统

在现代企业管理中,设备的高效运作至关重要。为此,我们推出了设备管理与点巡检系统,通过自动化管理提升设备使用效率,保障生产安全。 系统特点 设备全生命周期管理 系统涵盖设备的各个阶段,从设备管理、点检、巡检、保…

vue.js 原生js app端实现图片旋转、放大、缩小、拖拽

效果图&#xff1a; 旋转 放大&#xff1a;手机上可以双指放大缩小 拖拽 代码实现&#xff1a; html <div id"home" class"" v-cloak><!-- 上面三个按钮 图片自己解决 --><div class"headImage" v-if"showBtn">&l…

【机器学习】---深入探讨图神经网络(GNN)

深入探讨图神经网络 1. 图的基本构成示例图邻接矩阵 2. GNN的基本原理消息传递机制更新公式 3. GNN的类型及应用3.1 Graph Convolutional Networks (GCN)GCN实现示例 3.2 Graph Attention Networks (GAT)GAT实现示例 3.3 GraphSAGEGraphSAGE实现示例 4. GNN的应用场景5. GNN的挑…

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…

NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)

文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序&#xff0c;主要功能是接受用户输入的字符串作为“flag”&#xff0c;然后通过对输入的字符串进行一些处理和比较来验证是否输…

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司&#xff0c;专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造&#xff0c;立足于香港这一国际金融中心&#xff0c;放眼全球&#xff0c;汇聚了华…

Python获取百度翻译的两种方法

一、引言 百度是我们常用的搜索工具&#xff0c;其翻译是与爱词霸合作&#xff0c;总体看其反应速度较快&#xff0c;可以作为项目中重要的翻译工具。根据大家的需要&#xff0c;现提供两种Python获取百度翻译的两种办法&#xff1a; 二、requests法 我们引用requests模块&a…

智能Ai语音机器人的应用价值有哪些?

随着时间的推移&#xff0c;人工智能的发展越来越成熟&#xff0c;智能时代也离人们越来越近&#xff0c;近几年人工智能越来越火爆&#xff0c;人工智能的应用已经开始渗透到各行各业&#xff0c;与生活交融&#xff0c;成为人们无法拒绝&#xff0c;无法失去的一个重要存在。…

SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法

目录 0 需求描述 1 数据准备 2 问题分析 方法1&#xff1a;最大、最小值法&#xff08;技巧&#xff09; 方法2&#xff1a;常规思路 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通…

Trie树之字符串统计问题

这是C算法基础-数据结构专栏的第二十七篇文章&#xff0c;专栏详情请见此处。 引入 Trie树&#xff0c;即字典树&#xff0c;顾名思义&#xff0c;就是用类似字典的方式存储数据&#xff0c;而Trie树最经典也是最简单的一个应用就是字符串统计问题。 字符串统计问题就是维护一个…