redis之哨兵集群搭建
一:哨兵集群工作概览图

1.监控:sentinel通过心跳监控redis的master和slave实例是否正常工作
2.故障转移:假如master出现故障,sentinel会选举一个slave作为新的master,当故障实例恢复后身份会变成slave,会以新的master为主
二:哨兵的选举机制原理

sentinel基于心跳形式监控redis集群服务,每秒向每个redis实例发送ping命令
1:主观下线:sentinel发现某redis实例在规定时间内没有心跳响应则认为该实例下线
2:客观下线:超过配置的指定数量(quorum) 的sentinel都认为该redis主观下线,则该实例为客观下线,quorum的数量最好为sentinel数量的一半,例如这里3个sentinel实例,quorum则应该配置为2
三:sentinel故障转移原理

1:sentinel向选举的slave节点发送slaveof no one命令使其变为master节点
2:sentinel向其他slave节点发送slaveof ip port,使其他slave节点认新的master节点为主节点,之后开始同步数据
3:sentinel把故障节点标记为slave节点,故障节点恢复后成为新master节点的从节点
四:使用docker compose搭建哨兵集群(三redis实例三哨兵)
redis1配置文件
#绑定端口
bind 0.0.0.0
#端口
port 63799
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#从节点与主节点通信的密码
masterauth ming
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1
save 300 10
save 60 10000
#开启aof持久化,关闭为no
appendonly yes
#aof持久化刷盘策略
appendfsync everysec
redis2配置文件
bind 0.0.0.0
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#端口
port 63800
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1
save 300 10
save 60 10000
#开启aof持久化,关闭为no
appendonly yes
#master实例地址
slaveof 192.168.1.9 63799
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#这个密码用于主从节点间的连接
masterauth ming
redis3配置文件
bind 0.0.0.0
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#端口
port 63801
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1
save 300 10
save 60 10000
#开启aof持久化,关闭为no
appendonly yes
#master实例地址
slaveof 192.168.1.9 63799
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#这个密码用于主从节点间的连接
masterauth ming
sentinel1配置文件
# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26379
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#日志文件
logfile /logs/sentinel26379.log
#指定别名 主节点地址 端口 哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming
sentinel2配置文件
# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26380
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#日志文件
logfile /logs/sentinel26380.log
#指定别名 主节点地址 端口 哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming
sentinel3配置文件
# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26381
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#日志文件
logfile /logs/sentinel26381.log
#指定别名 主节点地址 端口 哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming
本人docker挂载目录结构如下,按需创建即可

docker-compose-redis-sentinel.yml文件内容,文件名,文件中内容的目录路径换成自己的即可
version: '3.7'
services:redie-1:environment:- TZ=Asia/Shanghaiimage: "redis:7.4"container_name: redis1restart: alwaysports:- 63799:63799command: redis-server /usr/local/etc/redis/redis.conf volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/redis1/data:/data - /Applications/java_dev_util/dockerData/redis-sentinel/redis1/logs:/var/log/redis - /Applications/java_dev_util/dockerData/redis-sentinel/redis1/redis.conf:/usr/local/etc/redis/redis.conf redie-2:environment:- TZ=Asia/Shanghaiimage: "redis:7.4"container_name: redis2restart: alwaysports:- 63800:63800volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/redis2/data:/data - /Applications/java_dev_util/dockerData/redis-sentinel/redis2/logs:/var/log/redis - /Applications/java_dev_util/dockerData/redis-sentinel/redis2/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.confredie-3:environment:- TZ=Asia/Shanghaiimage: "redis:7.4"container_name: redis3restart: alwaysports:- 63801:63801volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/redis3/data:/data - /Applications/java_dev_util/dockerData/redis-sentinel/redis3/logs:/var/log/redis - /Applications/java_dev_util/dockerData/redis-sentinel/redis3/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.confsentinel-1:environment:- TZ=Asia/Shanghai # 设置时区image: "redis:7.4" #redis 镜像源container_name: sentinel1 # 容器的名字restart: alwayscommand: redis-sentinel /usr/local/etc/redis/conf/sentinel.confports:- 26379:26379 volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/data:/data- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/logs:/logs- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/sentinel.conf:/usr/local/etc/redis/conf/sentinel.conf sentinel-2:environment:- TZ=Asia/Shanghaiimage: "redis:7.4"container_name: sentinel2restart: alwayscommand: redis-sentinel /usr/local/etc/redis/conf/sentinel.confports:- 26380:26380volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/data:/data- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/logs:/logs- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/sentinel.conf:/usr/local/etc/redis/conf/sentinel.confsentinel-3:environment:- TZ=Asia/Shanghaiimage: "redis:7.4"container_name: sentinel3restart: alwayscommand: redis-sentinel /usr/local/etc/redis/conf/sentinel.confports:- 26381:26381volumes:- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/data:/data- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/logs:/logs- /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/sentinel.conf:/usr/local/etc/redis/conf/sentinel.conf
docker compose启动
#进入到docker-compose-redis-sentinel.yml文件目录运行
docker compose -f ./docker-compose-redis-sentinel.yml up -d
已经跑起来了

redis命令查看信息

到此为止哨兵集群搭建成功,生产环境redis实例应该部署在单独服务器上,这样才能真正的分担读写压力,而且哨兵集群模式虽然可以实现高可用,解决高并发读的问题,但高并发写和海量数据存储的问题依然没有解决
相关文章:
redis之哨兵集群搭建
一:哨兵集群工作概览图 1.监控:sentinel通过心跳监控redis的master和slave实例是否正常工作 2.故障转移:假如master出现故障,sentinel会选举一个slave作为新的master,当故障实例恢复后身份会变成slave,会以…...
保姆级AI开发环境搭建
目录 windows下环境搭建1. Python环境搭建2. 下载vLLM2.1 安装CUDA2.2 安装Pytorch2.3 安装vllm 3. 部署Deepseek(huggingface)3.1 DeepSeek的优化建议 4. ollama快速部署Deepseek4.1 下载Ollama4.2 配置Ollma4.2 运行模型4.3 其他Ollama命令 linux下环境…...
Arduino 型号的对比
常见 Arduino 型号的对比表格 涵盖了不同型号的关键参数和特点,方便你根据项目需求进行选择: 型号Arduino UnoArduino Mega 2560Arduino LeonardoArduino NanoArduino Due微控制器ATmega328PATmega2560ATmega32U4ATmega328P 或 ATmega168SAM3X8E&#…...
Kafka系列之:定位topic只能保存最新数据的原因
Kafka系列之:定位topic只能保存最新数据的原因 一、背景二、定位排查方向三、深入排查一、背景 kafka topic保存的数据少,topic只能保存最新的数据二、定位排查方向 能想到的定位排查方向:topic能存储的数据量、topic数据保存的时间、topic数据大小./bin/kafka-configs.sh -…...
AtCoder Beginner Contest 391(A~E题题解)
A - Lucky Direction 思路:纯模拟的一个水题 #include <bits/stdc.h> using namespace std; #define int long long string s; signed main() { cin>>s;for(int i0;i<s.size();i){char cs[i];if(cN){cout<<"S";}else if(c…...
mysql mvcc 锁 关系
多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化&a…...
安卓手机基于 Termux 安装 AList 并设置开机自启的详细教程
安装 AList 安装 Termux: 点击下载 更新软件包:打开 Termux,运行以下命令以更新软件包列表并升级已安装的软件包: bash复制 pkg update && pkg upgrade安装 AList:运行以下命令安装 AList: bash复…...
LeetCode:503.下一个更大元素II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:503.下一个更大元素II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[…...
实验5 配置OSPFv2验证
实验5 配置OSPFv2验证 1.实验目的 (1)OSPFv2 验证的类型和意义。 (2)配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 (3)配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…...
第二节 docker基础之---镜像构建及挂载
查看当前镜像: [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [rootdocker ~]#很明显docker是咱们新搭建的所以目前还没有镜像 1,搜索镜像: [rootdocker ~]# docker search centos 搜索镜像并过滤是官…...
论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding
MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码(Masked Autoencoding)在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略࿰…...
记录一下 在Mac下用pyinstallter 打包 Django项目
安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…...
【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)
偏差和方差的权衡(Bias-Variance Tradeoff) 1. 引言 在机器学习模型的训练过程中,我们常常面临一个重要的挑战:如何平衡 偏差(Bias) 和 方差(Variance),以提升模型的泛…...
deepseek本地部署-linux
1、官网推荐安装方法(使用脚本,我绕不过github,未采用) 登录ollama下载网站https://ollama.com/download/linux,linux下有下载脚本。 正常来说,在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ol…...
解决使用python提取word文档中所有的图片时图片丢失的问题
python解析word文档,提取文档中所有的图片并保存,并将原图位置用占位符替换。 问题描述 利用python-dox库解析word文档,并提取里面的所有图片时发现会出现一摸一样的图片只解析一次,导致图片丢失,数量不对的情况。 …...
【Spring相关知识】Spring应用如何优雅使用消息队列
文章目录 概述**核心概念****使用场景****快速入门**1. 添加依赖2. 配置 Binder3. 定义消息通道4. 发送和接收消息5. 运行应用 **高级特性****优点****适用场景** 概述 Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Inte…...
人工智能:从概念到未来
人工智能:从概念到未来 一、引言 在当今数字化时代,人工智能(Artificial Intelligence,AI)已从科幻小说和电影中的幻想逐渐走进现实,成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…...
CUDA Graph
cudaGraphLaunch 是 NVIDIA CUDA API 中的一个函数,用于在 CUDA Graphs 中启动一个已实例化的图。 CUDA Graphs 简介 CUDA Graphs 是 NVIDIA CUDA 编程模型中的一种技术,旨在优化 GPU 程序的性能。它允许将一系列连续的 GPU 操作(如计算和数…...
1343. 大小为 K 且平均值大于等于阈值的子数组数目
目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 在遍历时维护一个统计的变量,用来统计满足条件的子数组个数 2.2 代码尝试 class Solution { public:int numOfSubarrays(vec…...
IDEA+DeepSeek让Java开发起飞
1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台,第一次需要注册一个账号 进去之后需要创建一个API KEY,然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址,点击左边的:接口…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
