Redis --- 第八讲 --- 关于主从复制哨兵
主从复制的补充问题
从节点和主节点之间断开连接,有两种情况:
1、从节点和主节点断开连接
slaveof no one 命令。这个时候,从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。,
2、主节点挂了
这个时候从节点不会晋升成主节点的。必须通过人工干预的方式恢复主节点。
这个是脱离咱们掌控的。
Redis主节点无法重启的问题:
通过service redis-server start 启动的redis服务器,是通过一个redis这样的用户,来启动的。而redis server需要按照可读可写的方式打开aof文件,而这个文件对于root之外的用户只有读权限。因此service redis-server start启动的redis服务器无法打开appendonly.aof文件。因为这里我们的三个服务器是使用的同一个appendonly.aof文件。
解决方案:把三个redis服务器的生成的文件,也给区分开。更靠谱的是,直接把三个redis服务器的工作目录区分开。(修改配置文件中的dir选项)
1、停止之前的redis服务器
2、删除之前工作目录下,已经生成的aof文件或者通过也可以通过chown命令修改以下所属用户。
3、给从节点创建出新的目录,用来作为从节点的工作目录。并且修改从节点的配置文件,设定成新的目录为工作目录。
4、启动redis服务器。
一、哨兵机制
人工,大部分是不太靠谱的。通过自动化的手段来解决主节点挂了的问题。也就是哨兵机制。
更哨兵机制有关的概念
哨兵机制是通过独立的进程来体现的和之前的redis-server是不同的进程。redis-sentinel不负责存储数据,只是对其他的redis-server起到监控的作用。通常哨兵节点,也会搞一个集合。单个哨兵节点挂了咋办。

Redis sentinel架构

单独的redis sentinel进程,提供了多个。并且这三个哨兵进程就会自动监控现有的redis master和slave。监控:这些进程之间,会建立tcp长连接,通过这样的长连接,定期发送心跳包。借助上述的监控机制,就可以即使发现某个主机是否是挂了。如果是从节点挂了,其实没有关系。如果是主节点挂了,哨兵就要发挥作用了。
第一步:此时一个哨兵节点发现主节点挂了,还不够,需要多个哨兵节点来共同认同这件事情,主要是为了防止出现误判。
第二步:主节点确实是挂了,这些哨兵节点中,就会推举一个leader,有这个leader负责从现有从节点中挑一个作为新的主节点。
第三步:挑选出新的主节点之后,哨兵节点,就会自动控制该被选中的节点,执行slaveof no one,并且控制其他从节点,修改slaveof到新的主节点上。
第四步:哨兵节点会自动的通知客户端程序,告知新的主节点是谁,并且后续客户端再进行写操作,就会针对新的主节点进行操作了。
Redis哨兵的核心功能:
1、监控
2、自动的故障转移
3、进行通知
注意,redis哨兵节点有一个也是可以的。
1、如果哨兵节点只有一个,它自身也是容易出现问题的。万一这个哨兵节点挂了,后续redis节点也挂了,就无法进行自动的恢复过程了。
2、出现误判的概率也比较高。毕竟网络传输数据也是容易出现抖动或者延迟或者丢包的。如果只有一个哨兵节点,出现上述问题之后,影响就比较大了。
基本原则:在分布式系统中,应该避免使用单点。也就是冗余。哨兵节点最后要搞奇数个,最少也应该是3个。
使用docker搭建环境
一个主节点和两个从节点,和三个哨兵的节点。
按理说,这6个节点,是要在6个不同的服务器主机上的。此时,只有一个云服务器,就在一个云服务器上,来完成这里的环境搭建。在实际工作中,把上述节点放到一个服务器上,是没有意义的。当前这么做只是迫于无奈的。
由于这些节点还挺多的,相互之间容易打架,依赖的端口号/配置文件/数据文件。如果咱们直接部署,就需要小心翼翼的去避开这些冲突。这种方式比较繁琐。也会和不同主机上部署,存在较大差异。
但是我们使用docker就可以有效的解决上述的问题。
简单介绍:虚拟机,通过软件,在一个电脑上模拟出另外的一些硬件。构造了另一个虚拟的电脑。虚拟机这样的软件就可以使用一个计算机。来模拟出多个电脑的情况。但是虚拟机有一个很大的问题,比较吃配置。这个事情对咱们的云服务器来说,压力山大。docker可以认为是一个轻量级的虚拟机,起到了虚拟机这样的隔离环境的效果,但是又没有吃很多的硬件资源。即使是配置比较拉跨的云服务器,也能构造出好几个这样的虚拟的环境。docker现在后端开发这块非常流行的组件。
docker中关键概念:容器,看作一个轻量级的虚拟机。
1、需要安装docker和docker-compose。
2、停止之前的redis服务器。
3、使用docker获取到redis的镜像。docker中的镜像和容器类似于可执行程序和进程的关系。镜像可以自己构建,也可以直接拿别人已经构建好的。docker hub。包含了很多其他大佬们构建好的镜像。
![]()
git pull使用git从中央仓库拉取代码。docker pull使用docker从中央仓库(默认是从docker hub)来拉取镜像。拉取到的镜像,里面包含一个精简的Linux操作系统,并且上面会安装redis。只要直接基于这个镜像创建一个容器跑起来,此时,redis服务器就搭建好了。
查看镜像。
基于docker来搭建redis哨兵环境了。
通过docker-compose来进行容器编排,此处涉及到多个redis server 也有多个redis哨兵节点。每一个redis server或者每一个redis哨兵节点都是作为一个单独的容器了。我们现在又6个容器了。
通过一个配置文件,把具体创建哪些容器,每个容器运行的各种参数,描述清楚。后续通过一个简单的命令,就能够批量的启动/停止这些容器了。使用yml这样的格式来作为配置文件。经典的配置文件格式:xml通过标签的格式进行组织的。

<>中成对出现的标签。html中的标签,都是标准规定的。xml中的标签,都是自定义的。写起来特别啰嗦。并且也比较占用空间。后来,又有了json这样的格式。

yml格式和json有一些相似之处,yml虽然没有json格式这么火,也还是挺广泛使用的。
和json都是这种比较直观的键值对结构,json是使用{}来表示层级结构,yml则是使用缩进来表示。yml相对于json的优势。对于格式要求的更严格,可读性会更好。更有助于人来理解。
编排工作:
1)创建三个容器,作为redis的数据节点(一个主,两个从)
2)创建三个容器,作为redis的哨兵节点。

文件名必须是固定的。
![]()
书写以下信息

version版本号
services启动哪些服务器
master,slave1,slave2 主从服务器名。
image:容器基于哪一个镜像。
command:启动redis服务器的选项。
ports:端口映射,docker容器,可以理解成是一个轻量的虚拟机。在这个容器里,端口号和外面宿主机的端口号是两个体系。如果容器外面使用了5000端口,在容器内部也可以使用5000彼此不会冲突。有的时候,希望在容器外面能够访问到容器里面的端口号。就可以把容器内部的端口映射成宿主机的端口。

有的端口,希望在容器外访问容器内部的端口,需要进行端口映射,把容器里的端口映射到宿舍主机上,后续访问宿主机的这个端口,就相当于在访问对应容器的对应端口了。站在宿主的角度,访问上述几个端口的时候,也不知道这个端口实际上是一个宿主机上的服务,还是一个来自于一个容器内部的服务。只要正常去使用即可。这里的映射过程非常像NAT一样。
启动容器。
查看对应的日志。
redis哨兵节点,是单独的redis服务器进程。

文件映射:哨兵节点,会在运行过程中,对配置文件进行自动的修改。因此,就不能拿一个配置文件,给三个容器分别映射。
接下里再来看这三个配置文件的具体细节。初始情况下,这三个配置文件内容可以是一样的。

bind 绑定ip,port 端口号,sentinel monitor告诉哨兵节点监控哪个redis服务器。ip,端口号,法定票数。这里的票数就是为了更稳健的确认当前redis-server是否挂了,不能只听一个哨兵的一面之词。
down-after-milliseconds 心跳包的超时时间。
创建redis-sentinel1文件。把上述的内容写到该文件中。复制出2和3文件。但是这里报了一个错误。

docker-compose以下启动了N个容器。此时N个容器都处于同一个局域网中,可以使者N个容器之间可以相互访问。三个redis-server节点是一个局域网。三个哨兵节点,是另一个局域网。默认情况下,这两网络似乎不能互通的。解决方案:可以使用docker-compose把此处的两组服务给放到同一个局域网中,docker network ls 列出当前docker中的局域网。

此处先启动了三个redis server节点,就相当于自动创建了第一个局域网。在启动后面三个哨兵节点,就直接让这三个节点加入到上面的局域网中,而不是创建新的局域网。

通过上述的操作,就完成了此处的配置。

启动后我们发现sentinel1文件里的内容已经被我们的程序自动配置重写了。
哨兵存在的意义,能够在redis主从结构出现问题的时候,此时哨兵节点就能够自动的帮我们重新选出一个主节点,来代替之前挂了的节点,保证整个redis仍然是可用的状态。
手动把主节点干掉
![]()
当主节点挂了之后,哨兵节点就开始工作了。

sdown主观下线,本哨兵节点,认为该主节点挂了,odown客观下线:好几个哨兵都认为该节点挂了,达成了一致,此时主节点挂了这个事情就被实锤了。
此时就需要哨兵节点选出一个从节点,作为新的主节点,此处就需要提拔出一个新的主节点。

切换过程。
如果主节点挂了之后,恢复过来,作为了一个从节点。
主从切换具体流程
哨兵重新选取主节点的流程(经典面试题)
1、主观下线
哨兵节点通过心跳包,判定redis服务器是否正常工作。如果心跳包没有如约而至,就说明redis服务器挂了。此时还不能排除网络波动的影响,因此就只能单方面认为这个redis节点挂了。
2、客观下线
多个哨兵都认为主节点挂了,认为挂了哨兵节点数目达到法定票数。哨兵们就认为这个主节点是客观下线。
3、要让多个哨兵节点,选出一个leader节点,由这个leader负责选一个从节点,作为新的主节点。
每个哨兵手里只有一票。当哨兵1第一个发现当前是客观下线之后,就立即给自己投了一票,并且告诉了2,3我来负责这个事情,2 3反应慢了半拍,才发现是客观下线,一看1乐意负责这个事情,立即投了赞成票。如果总的票数超过哨兵总数的一半,选举完成了。上面的投票过程看谁反应快。谁的网络延时小。
4、此时leader选举完毕,leader就需要挑选一个从节点,作为新的主节点。
1)比较一个优先级,每个redis数据节点,都会在配置文件中,有一个优先级的设置,slave-priority,优先级高的从节点,就会胜出。
2)offset最大,就胜出。offset从节点 从主节点同步数据的进度,数值越大,说明从节点的数据和主节点的数据就越接近。
3)run-id每个redis节点启动的时候,都会随机生成一串数字。(大小全凭缘分了)此时选谁都可以了,随便挑一个。
把新的主节点指定好了之后,leader就会控制这个节点,执行slave no one,成为master。在控制其他的节点,执行slave of,让其他节点,以新的master作为主节点了。
总结:
哨兵节点不能只有一个。
哨兵节点最好是奇数个。大部分情况下3个就够了。
哨兵节点不负责存储数据,仍然是redis主从节点负责存储。哨兵节点就可以使用一些配置不高的机器来部署。但是不能搞一个机器部署三个哨兵。
哨兵 + 主从复制 提高可用性。
哨兵 + 主从复制 不能提高数据的存储容量,当我们需要存的数据接近或者超过机器的物理内存,这样的结构就难以胜任了。redis集群可以来解决存储容量问题的有效方案。
相关文章:
Redis --- 第八讲 --- 关于主从复制哨兵
主从复制的补充问题 从节点和主节点之间断开连接,有两种情况: 1、从节点和主节点断开连接 slaveof no one 命令。这个时候,从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。, 2、主节点挂了 这个时…...
【数据结构】时间和空间复杂度-Java
如何衡量算法的好坏 根据时间复杂度和空间复杂度来判断 比较项目时间复杂度空间复杂度定义衡量算法执行时间与问题规模之间的关系衡量算法在运行过程中所占用的额外存储空间与问题规模之间的关系表达方式通常用大O符号表示,如O(n)、O(n^2&am…...
tensorRT安装详解(linux与windows)
目录 tensorRT介绍 前置准备 安装cuda与cudnn linux windows cuda版本查看 下载安装包 linux安装 安装 安装验证 windows安装 安装 环境变量配置 安装验证 tensorRT介绍 有关tensorRT的介绍见 TensorRT简介-CSDN博客 前置准备 安装cuda与cudnn linux Linux下…...
MYSQL OPTIMIZE TABLE 命令重建表和索引
在 MySQL 中,OPTIMIZE TABLE 命令用于重建表和相关索引,以及回收未使用的空间。这个命令对于维护和优化数据库表的性能非常有用,特别是在进行了大量的数据删除操作之后。OPTIMIZE TABLE 可以减少数据文件的碎片化,确保数据存储更加…...
开发指南075-各种动画效果
方法一、使用动画GIF图标 方法二、使用vue-count-to import CountTo from vue-count-to components: { CountTo }, <count-to :start-val"0" :end-val"num" :duration"num>0?num:1" class"card-panel-num" /> 方法…...
使用 el-upload 如何做到发送一次请求上传多个文件
在使用 Element UI 的 el-upload 组件时,默认情况下每次选择文件都会触发一次上传请求。如果你需要一次性上传多个文件,而不是每个文件都触发一次请求,可以通过一些配置和代码处理来实现。 方法一:通过配置file-list(…...
GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复
这两天测试GeeM2引擎的服务端,最常见的问题就是点击开始游戏出现白屏,最早还以为是服务端问题,结果是因为升级了引擎,而没有升级NewUI这份文件导致的。解决方法如下: 下载GEE引擎包最新版,(可以…...
Linux LVS 通用命令行
LVS(Linux Virtual Server)是一种基于Linux操作系统的负载均衡技术,它通过网络负载均衡技术将客户端请求分发到多台实际服务器上,以提高系统的性能和可靠性。在LVS中,常用的命令行工具主要是ipvsadm,以及一…...
laravel .env环境变量原理
介绍 对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时,.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。 使…...
Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解
title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…...
新时代AI桌宠:XGO Rider让你的办公室瞬间高大上
XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider,这款全球首创的轮腿式桌面AI机器人,正在悄然改变我们的办公环境。它不仅是一个高科技玩具,更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…...
matlab的resample函数
MATLAB中resample函数用法 - 知乎 (zhihu.com) 主要是经常忘记了重采样时哪个是原采样率,哪个是重采样后的采样率(目标采样率)。这里记录下,目标采样率在前面!...
idea怎么取消自动打开项目
idea设置不自动打开项目 选择File>> Settings 选择Appearance & Behavior >> System Settings 去掉勾选的Reopen last project on startup...
蓄电池在线监测系统 各大UPS铅酸蓄电池监测 保障安全
蓄电池的不断普及,确实推动了蓄电池监控和管理技术的持续升级。蓄电池检测系统的研发为我们带来了诸多好处,这些好处主要体现在以下几个方面: 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…...
Python基础Day13
1.字符串 count(x)统计x出现的次数 split(m,n)以括号内的m为分隔符,将字符串分开n1个字符串 strip删除两端的空格 lstrip删除左边空格 rstrip删除右边空格 join(m)以m为分隔符,将分割开的字符串组合成一个新的字符串 max()/min&am…...
有趣的css - 跷跷板加载动画
大家好,我是 Just,这里是「设计师工作日常」,今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…...
与机器学习的邂逅--自适应神经网络结构的深度解析
引言 随着人工智能的发展,神经网络已成为许多应用领域的重要工具。自适应神经网络(Adaptive Neural Networks,ANN)因其出色的学习能力和灵活性,逐渐成为研究的热点。本文将详细探讨自适应神经网络的基本概念、工作原理…...
用python怎么实现办公自动化【批量生成出货清单】
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
【Qt】控件——Qt输入类控件、常见的输入类控件、输入类控件的使用、Line Edit、Text Edit、Combo Box、Spin Box
文章目录 Qt5. Qt显示类控件Line EditText EditCombo BoxSpin BoxQDateTimeEditDialSlider Qt 5. Qt显示类控件 Line Edit QLineEdit 用于表示单行输入框。可以输入一段文本,但是不能换行。 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度…...
单臂交换知识点
要求:pc1要与pc2 ping通 命令: LSW1命令解析: system-view: 这个命令用于进入交换机的全局配置模式。在这个模式下,用户可以配置设备的全局设置。 vlan batch 10 20: 创建VLAN 10和VLAN 20。VLAN(虚拟局域网&#x…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
