《Redis》哨兵模式

文章目录

  • 为什么要有哨兵模式呢?
  • 哨兵自动恢复故障主节点
  • 使用docker搭建分布式系统
    • 查看哨兵节点工作
    • 哨兵选举新的主节点的流程
  • 总结


为什么要有哨兵模式呢?

主从复制的问题
Redis 的主从复制模式可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作⽤:
第⼀,作为主节点的⼀个备份,⼀旦主节点出了故障不可达的情况,从节点可以作为后备 “顶” 上
来,并且保证数据尽量不丢失(主从复制表现为最终⼀致性)。第⼆,从节点可以分担主节点上的读
压⼒,让主节点只承担写请求的处理,将所有的读请求负载均衡到各个从节点上。
但是主从复制模式并不是万能的,它同样遗留下以下⼏个问题:

  1. 主节点发⽣故障时,进⾏主备切换的过程是复杂的,需要完全的⼈⼯参与,导致故障恢复时间⽆法保障。
  2. 主节点可以将读压⼒分散出去,但写压⼒/存储压⼒是⽆法被分担的,还是受到单机的限制。
    其中第⼀个问题是⾼可⽤问题,即 Redis 哨兵主要解决的问题。第⼆个问题是属于存储分布式的问题,后面Redis集群就是解决这个问题的。目前先解决第一个问题。

所以当主节点由于死机等问题,无法为客户端提供服务时,就需要通知大量的客户端,要更换主节点了。这对于已经部署好一定规模的客户端集群来说,是无法接受的,且更换主节点需要人工干预,耗时长,对效率大打折扣,所以,就引入了哨兵(Redis Sentinel)来解决这个问题。

哨兵机制是一个独立的redis-sentinel进程,不用来存储数据,而是用来监控redis的数据节点。

人工干预情况下:在这里插入图片描述
依然有许多问题,如果引入了哨兵机制自动修复节点,会大大提高效率。

哨兵自动恢复故障主节点

单独的哨兵(redis sentinel)进程,提供了多个,这里以三个为例。(哨兵节点,最好是搞奇数个,最少是3个,一般情况下,都是搞三个。)
提供多个哨兵来监控主从节点的原因是防止单独的哨兵出现误判某个主节点挂了的情况。
还有如果单独一个哨兵节点,如果它自己本身都挂了,那就无法自动恢复故障的主节点了。

这些哨兵会对所有要监控的主从节点进行TCP的长连接,连接成功后,定期向节点发送心跳检测(这里的心跳检测是应用层实现的,不是tcp中的keep-alive,应用层实现的心跳检测一般是简单的ping,pong)

如果发现某一个主节点不回复心跳检测了,说明有可能挂了,此时多个哨兵讨论一致后,如果认为该主节点真的挂了,则会挑选出一个哨兵节点,由这个哨兵节点按照某些挑选规则,挑选出一个新的主节点。

挑选出新的主节点后,哨兵节点会自动控制该被选中的节点,执行slaveof no one,让他直接称为新的主节点,并控制其他从节点,修改slaveof到新的主节点上。

哨兵节点会自动通知所有客户端,告诉他们新的主节点是谁,后续客户端再进行写操作,就会针对新的主节点进行操作了。

在这里插入图片描述

使用docker搭建分布式系统

按理说,上面的6个节点是要部署在6台不同的服务器主机上的。
一方面为了高可用,不至于一台主机挂了,影响到其他主机。
一方面就是为了多使用其他主机的硬件资源,来提高效率。

在这里插入图片描述
虚拟机可以解决,但是非常吃硬件性能,一般的电脑是搞不起的。

所以使用docker,就能解决上述问题。
docker是一个轻量级虚拟机,既能起到像虚拟机一样的隔离环境作用,又不会吃太多硬件资源。


docker关键字:”容器“,容器就是一个轻量级的虚拟机。

操作步骤:

  • 1.安装docker和docker-compose
    ubuntu下:apt install docker, apt install docker-compose
  • 2.停止之前的redis服务器
    service redis-server stop ,或者ps axu | grep redis,查看redis服务器进程的pid,kill -9 pid 即可。
  • 3.使用docker获取到redis的镜像

简单解释一下docker的镜像和容器的关系。

镜像相当于可执行程序,容器相当于进程。

要启动一个进程,那就要启动一个可执行程序,才能成功启动进程。
换句话说,要创建一个容器,那就得有描述该容器的一个模板,根据模板刻画一个容器出来,才能使用。所以获取redis镜像,就相当于获取相关的容器的可执行程序。
镜像可以自己构建,也可以拿别人构建好的(官方给的docker hub,类似github,有大量开源的镜像)

拉取镜像命令
docker pull redis(docker pull默认就是从配置好的docker hub中拉取的)

检查是否安装成功:
docker images
如果看到有redis的镜像,则说明安装成功了。

接下来则使用一些配置文件(yml)格式,来实现使用简单的命令控制多个redis节点,这些节点在docker就是一个个容器,一个节点就使用一个容器。

简单理解yml格式:
yml格式相对于xml格式来说,xml格式一般都是以标签的形式成对出现的。

<student><id>1</id><name>张三</name>
</student>

这种格式比较啰嗦,且空间大。

后来就有了json:

{id: 1,name: ”张三“
}

json格式写起来方便,还减少了空间,json以{}表示层级结构的。

而对于yml格式来说,与json格式有些相似之处:

student:id: 1,name: 张三

yml是以缩进格式来表示层级结构的。

下面创建6个容器,三个是作为redis的数据节点(一主两从)
三个是作为哨兵节点。


先创建一个目录

mkdir -p redis/
cd redis/
mkdir -p redis-data/
mkdir -p redis-setinel/
这两个目录一个是放redis的数据节点,一个是放哨兵节点的。
cd redis-data/
vim docker-compose.yml (注意:配置文件的名字是固定的,不要改)

(注意缩进表示层级)
version: '3.7'     # 版本号
services:          # services中的master,slave1是自己设定的名字master:image: 'redis'    # 要使用的镜像名container_name: redis-master    # 容器名字restart: always                 # 一些配置command: redis-server --appendonly yes       ports:   #这里重点说明- 6379:6379slave1:image: 'redis'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379#这里可以直接通过容器名字,直接被docker进行类似域名解析的操作,获取到redis服务器的ip了ports:- 6380:6379slave2:image: 'redis'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379

port重点说明,docker 中的容器就是一个轻量级的虚拟机,可以隔离环境。
容器内的端口号和容器外的端口好可以相同的。
比如容器内可以使用6379,容器外也可以使用6379。
彼此不冲突。
但是如果想在容器外能够访问到容器里面的端口号,
就可以把容器内部的端口号映射成宿主机的端口号。

ports:

  • 6380:6379
    第一个port是宿主机的端口号,第二个port是容器内的端口号
    相当于容器外(宿主机)映射后的端口号就是第一个,第二个就是容器内部自己的端口号

后续想要访问容器内的某个端口号,就可以直接通过访问宿主机这个映射的端口号,就等于访问容器内的那个端口号了。
但是也要注意,映射出去的端口号也不要再使用,防止冲突。

启动刚才配置的所有容器
docker-compose up -d

通过docker-compose logs就能看到日志信息。
netstat -anp | grep 端口号,通过grep刚才在配置文件写好的端口号:6379,6380,6381,就能看到三个redis节点已经起来了。


下面要创建三个redis哨兵节点的容器。

cd /redis/redis-sentinel/
vim docker-compose.yml文件

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

解释networks:指定当前所处的网络是redis-在这里插入图片描述
data_default。

接下来创建三个redis哨兵节点的配置文件。

sentinel1.conf,sentinel2.conf,sentinel3.conf。
都放在redis-sentinel/目录下。

.conf配置文件信息如下

bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

在这里插入图片描述

docker-compose up -d
创建三个哨兵节点
docker network ls
就能看到,只有一个局域网redis-data,而不是有redis-data又有redis-sentinel,这是因为.yml文件的network的作用。


查看哨兵节点工作

接下来就可以查看哨兵节点如何工作了。
docker ps -a,查看工作中的容器,就有三个redis的哨兵节点,三个redis主从节点。
在这里插入图片描述
接下来手动挂掉主节点

docker stop + 主节点名字(这里是redis-server)
此时主节点挂了,此时哨兵节点已经开始工作了

docker-compose logs ,查看日志
在这里插入图片描述
可以看到哨兵已经选出了新的主节点了。所以故障恢复完成。

哨兵选举新的主节点的流程

细节都在图中了,看图

在这里插入图片描述

总结

在这里插入图片描述

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

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

相关文章

零基础保姆级本地化部署文心大模型4.5开源系列

近两年随着大模型的迅猛崛起&#xff0c;吸引了各行各业的广泛关注&#xff0c;更对我们的工作方式与生活产生着显著积极影响。在这样一个技术范式转换的关键节点&#xff0c;百度文心大模型开源事件无疑具有里程碑意义——它不仅为中国自主研发的AI技术底座打开了通向世界的大…

【笔记】PyCharm 2025.2 EAP 创建 Poetry 和 Hatch 环境的踩坑实录与反馈

https://youtrack.jetbrains.com/issue/PY-82407/Incorrect-Python-Version-and-Virtual-Environment-Path-When-Creating-Poetry-and-Hatch-Environments-via-GUI-in-PyCharm-2025.2-EAP 在 Python 开发的道路上&#xff0c;PyCharm 一直是我们信赖的开发利器。然而&#xff0…

ASP.NET Web Pages 安装使用教程

一、ASP.NET Web Pages 简介 ASP.NET Web Pages 是微软推出的一种轻量级 Web 开发框架&#xff0c;适合快速开发动态网站。它使用 Razor 语法&#xff0c;可以将 HTML 与 C# 或 VB.NET 无缝融合&#xff0c;特别适合初学者和小型项目。 二、Web Pages 与 MVC 的区别 特性Web …

基于 ethers.js 的区块链事件处理与钱包管理

币圈工具箱 bqbot.cn 月访问量达90whttps://bqbot.cn/jms.html &#xff08;在线版地址&#xff09; Event事件 检索事件 const { ethers } require("hardhat"); async function SearchEvent() {try {const provider new ethers.JsonRpcProvider("http://1…

SpringBoot系列—入门

目录 1 第一个SpringBoot程序 1.1 创建SpringBoot项目 1.2 选择SpringBoot版本和必要依赖 1.3 项目目录结构 1.4 编写Hello World代码 1.5 运行程序 1.6 不需要IDEA也能创建SpringBoot程序 1.7 部署程序 1.8 pom.xml依赖问题 1.9 无Maven选项问题 1.10 SpringBoot版…

你的Prompt还有很大提升

与AI协作&#xff0c;Prompt&#xff08;提示词&#xff09;是沟通的桥梁。一个优秀的Prompt能让AI的输出事半功倍&#xff0c;而一个模糊的Prompt则可能导致南辕北辙的结果。如果你觉得AI的回答不够精准、缺乏深度&#xff0c;或者总带着一股“AI味”&#xff0c;那很可能是你…

3、Configuring Topics

如果您在应用程序上下文中定义了KafkaAdmin bean&#xff0c;它可以自动向代理添加主题。为此&#xff0c;您可以将每个主题的NewTopicBean添加到应用程序上下文中。2.3版本引入了一个新的类TopicBuilder&#xff0c;使创建此类bean更加方便。以下示例显示了如何执行此操作&…

FastAPI+React19开发ERP系统实战第04期

一、效果预览 1.1 首页 1.2 首页暗黑模式 1.3 登录页 1.4 登录页暗黑模式 二、搭建React开发环境 2.1 项目依赖 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系统前端 - React 19&quo…

数据库|了解达梦数据库并做安装前的准备

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 你都用过哪些数据库&#xff1f; 使用过的数据库中觉得哪个数据库最好用&#xff1f; 你使用过达梦数据库吗&#xff1f; 最近在做的一个SCADA项目&#xff0c;要求信创版本&#xff0c;其中数据库也要使用信创目录…

Java驱动AI革命:Spring AI八篇进阶指南——从架构基础到企业级智能系统实战

系列文章目录 提示&#xff1a;下面列出了整个系列的完整目录&#xff0c;建议收藏本篇作为总览入口&#xff1a;本人将在7月份更新完毕 第一篇&#xff1a;Spring AI 概述与架构设计 第二篇&#xff1a;Spring AI 基本组件详解——ChatClient、Prompt、Memory 第三篇&#x…

hysAnalyser --- 支持菁彩视听双Vivid媒体信息解析

摘要 本文主要介绍 hysAnalyser 支持HDR Vivid格式的分析案例&#xff0c;满足用户分析HDR vivid 和 Audio Vivid格式的需要。 现将 hysAnalyser 新版本(v1.1.000)发布给网友使用&#xff0c;希望能帮助到更多音视频开发的爱好者。使用过程中&#xff0c;若遇到问题请您通过 G…

C++中NULL等于啥

文章目录 **一、`NULL` 的标准定义****二、常见实现方式**1. **定义为整数 `0`**2. **定义为 `0L` 或 `(void*)0`**(较少见)**三、与C语言的关键区别****四、`NULL` 在C++中的问题**1. **重载函数匹配歧义**2. **模板参数推导错误****五、C++11+ 的替代方案:`nullptr`****六…

pyhton基础【20】面向对象进阶一

目录 一.进阶 类方法和静态方法 属性(Properties) 继承和多态 抽象基类(Abstract Base Classes - ABCs) 魔术方法(Magic Methods) 组合和聚合 使用场景 二.私有属性 实现对数据的隐藏 设置私有属性 添加额外对属性操作的方法 三.私有方法 实现对方法的隐藏 直接…

渗透信息收集- Web应用漏洞与指纹信息收集以及情报收集

目录 1. 整体流程与目标概述 2. 常用工具及其用途 2.1 扫描与枚举工具 2.2 情报与数据聚合工具 2.3 流量拦截与手工验证工具 3. 详细技术手法与步骤 3.1 准备阶段 3.2 主动扫描与指纹识别 3.3 数据交叉验证与漏洞确认 3.4 进一步渗透与隐蔽操作 4. 实际工作经验与注…

ASP.NET代码审计 MVC架构 SQL注入漏洞n

接口路由 /Maintenance/GetMaintenanceList MaintenanceController.cs代码 Maintenance 控制器里面的 GetMaintenanceList 方法 接收参数 id 传进 MaintenanceManager.GetMaintenanceList 方法调用 MaintenanceManager.cs代码 这里 id 和 faultId 不一样是不影响的 C# 按顺序匹…

Python入门Day4

Python中数据的常用操作 数据拷贝 根据以下代码可以看出l1和l2实际上都是对于数据的引用&#xff0c;当l1被改变了&#xff0c;l2也会发生同样的改变&#xff0c;l2 l1只是将l2指向了l1所指向的地址。 >>> l1 [1,2,[3,4],[5,6]] >>> l2 l1 >>>…

计算机网络中的常用表项梳理

核心表项对比 表项 全称 工作层级 主要功能 涉及设备 典型生命周期 MAC表 媒体访问控制表 数据链路层&#xff08;二层&#xff09; Mac地址和端口关系 交换机、网桥 动态学习 FDB表 转发数据库 &#xff08;Forwarding DataBase&#xff09; 数据链路层&#xf…

百度轮岗:任命新CFO,崔珊珊退居业务二线

文 | 大力财经2025 年 7 月 1 日&#xff0c;百度组织再次变革&#xff0c;崔珊珊退居二线引发的行业关注。百度创始人李彦宏发布的内部信&#xff0c;宣布的新一轮组织调整里&#xff0c;崔珊珊退居二线这一变动&#xff0c;格外引人瞩目。崔珊珊&#xff0c;这位在百度人力资…

TAMPER-RTC(STM32F103) 引脚说明

我来查看ST官方手册中关于TAMPER-RTC引脚的具体说明。 Ran tool Ran tool Ran tool Read file: doc/STM32F103VGT6/STM32F103VGT6_specification.txt Read file: doc/STM32F103VGT6/STM32F103VGT6_specification.txt Ran tool Read file: doc/STM32F103VGT6/STM32F103VGT6_spec…

BUUCTF在线评测-练习场-WebCTF习题[极客大挑战 2019]HardSQL1-flag获取、解析

解题思路 打开靶场、熟悉的感觉 上次是过滤了很多字符&#xff0c;用了双写绕过进行注入即可&#xff0c;这次进阶了难度 先老规矩判断下闭合 11 123 报错提示 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version…