[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-master
    		restart: always
    		command: redis-server --appendonly yes
    		ports: 
    			- 6379:6379
    	slave1:
    		image: 'redis:5.0.9'
    		container_name: redis-slave1
    		restart: always
    		command: redis-server --appendonly yes --slaveof redis-master 6379
    		ports:
    			- 6380:6379
    	slave2:
    		image: 'redis:5.0.9'
    		container_name: redis-slave2
    		restart: always
    		command: redis-server --appendonly yes --slaveof redis-master 6379
    		ports:
    			- 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-1
    		restart: always
    		command: redis-sentinel /etc/redis/sentinel.conf
    		volumes:
    			- ./sentinel1.conf:/etc/redis/sentinel.conf
    		ports:
    			- 26379:26379
    	sentinel2:
    		image: 'redis:5.0.9'
    		container_name: redis-sentinel-2
    		restart: always
    		command: redis-sentinel /etc/redis/sentinel.conf
    		volumes:
    			- ./sentinel2.conf:/etc/redis/sentinel.conf
    		ports:
    			- 26380:26379
    	sentinel3:
    		image: 'redis:5.0.9'
    		container_name: redis-sentinel-3
    		restart: always
    		command: redis-sentinel /etc/redis/sentinel.conf
    		volumes:
    			- ./sentinel3.conf:/etc/redis/sentinel.conf
    		ports:
    			- 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.mfbz.cn/a/884534.html

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

相关文章

【web安全】——信息收集

一、收集域名信息 1.1域名注册信息 工具:站长之家 whois查询 SEO综合查询 1.2子域名收集 原理:字典爆破,通过字典中的各种字符串与主域名拼接,尝试访问。 站长之家 直接查询子域名 ip138.com https://phpinfo.me/domain/ …

StoryMaker 在文本到图像的生成过程中实现一致的字符

StoryMaker 是一种个性化解决方案,它不仅能保持多个角色场景中面部的一致性,还能保持服装、发型和身体的一致性,从而有可能制作出由一系列图像组成的故事。 StoryMaker 生成图像的可视化。 前三行讲述的是 "上班族 "一天的生活&…

创建javaWeb项目(详细版本)2021年2月

1、新建一个java项目 2、点击工程名称,找到add framework support,并点击 建好如图 3、分别在工程目录下创建resourse文件夹和web目录下创建classes和lib文件夹 建好如图 4、file找到 project structure 5、选中resourse 将其mark as sources 6、路径改…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档:https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

godot4.2入门项目 dodge_the_creep学习记录

前言 在学习博客Godot4 你的第一个2d游戏中的项目时,遇到了点小问题,记录一下。 官方项目 传送门 问题 怪兽直接从屏幕中间部分冒出来,以及角色出现时位于屏幕外角色被设置的背景图遮挡 解决方法 1.节点的位置没有对齐,正确示例…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它…

Vue-Bag-Admin 采用漂亮的 Naive UI 构建的开源中后台系统,基于 Vue3 / Vite / TypeScript 等最新的前端技术栈

这是一款完成度很高、实用性很强的 admin 前端框架,颜值不错,推荐给大家。 Vue-Bag-Admin 在官网上也直接称为 Bag-Admin,这是一款专门为企业项目搭建中后台管理平台的前端框架,基于目前最新的前端技术栈 Vue3、Vite、TypeScript…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务&#xff0c;它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同&#xff0c;后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…

微调大模型(Finetuning Large Language Models)—Evaluation(六)

1. 微调后对模型进行评估 模型的评估目前没有统一的标准&#xff0c;有从正向角度&#xff0c;核对是否命中&#xff0c;当然也有从反向角度&#xff0c;考虑未命中的错误分析。 常见的评估方式如图所示&#xff1a; 本节学习资料地址&#xff1a;传送门 2. 代码测试 2.1 …

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

XSS闯关小游戏(前13关)

挖掘思路 1.存在可控参数 2.页面存在回显 3.使用带有特殊字符的语句去测试&#xff0c;网站是否进行了实例化 ( 例如 ">123 ) 4.构造闭合&#xff0c;实现payload的逃逸 1 name处参数可控&#xff0c;直接打即可 2 这里知道<>被实体编码了 再测试">1…

想做个WPS的自动化代码,参考如下:

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

大碗娱乐发布业务调整说明 取消艺人经纪业务

大碗娱乐今日发布业务调整说明&#xff1a;不再负责艺人业务&#xff0c;而贾玲导演将专注内容创作。据悉&#xff0c;其公司旗下艺人张小斐、许君聪、卜钰、何欢、张泰维、朱天福、曹贺军、刘宏禄的经纪合约均已到期&#xff0c;双方不再续约&#xff0c;但未来会共同寻求以其…

【HTML5】html5开篇基础(3)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…