Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和自动故障转移。在本篇文章中,我将带大家了解如何在 Docker 环境中搭建一个 Redis 哨兵模式集群,并解决在连接时遇到的一些问题。
一、准备工作
-
Docker 环境
首先确保你的机器已经安装并配置了 Docker 和 Docker Compose。 -
网络配置
我们将创建一个 Docker 网络,用于 Redis 集群中的容器间通信。在 Docker Compose 配置文件中,我们使用了bridge网络模式,并且为容器分配了静态 IP 地址,以确保容器间的稳定连接。
二、Docker Compose 配置文件
我们将通过 Docker Compose 部署 Redis 集群。以下是 docker-compose.yml 文件的配置内容:
version: "3"networks:redis-replication:driver: bridgeipam:config:- subnet: 172.25.0.0/24services:master:image: rediscontainer_name: redis-masterports:- "6371:6379"volumes:- "./master/redis.conf:/etc/redis.conf"- "./master/data:/data"command: ["redis-server", "/etc/redis.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.101slave1:image: rediscontainer_name: redis-slave-1ports:- "6372:6379"volumes:- "./slave1/redis.conf:/etc/redis.conf"- "./slave1/data:/data"command: ["redis-server", "/etc/redis.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.102slave2:image: rediscontainer_name: redis-slave-2ports:- "6373:6379"volumes:- "./slave2/redis.conf:/etc/redis.conf"- "./slave2/data:/data"command: ["redis-server", "/etc/redis.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.103sentinel1:image: rediscontainer_name: redis-sentinel-1ports:- "26380:26379"volumes:- "./sentinel1/sentinel.conf:/etc/sentinel.conf"command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.201sentinel2:image: rediscontainer_name: redis-sentinel-2ports:- "26381:26379"volumes:- "./sentinel2/sentinel.conf:/etc/sentinel.conf"command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.202sentinel3:image: rediscontainer_name: redis-sentinel-3ports:- "26382:26379"volumes:- "./sentinel3/sentinel.conf:/etc/sentinel.conf"command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]restart: alwaysnetworks:redis-replication:ipv4_address: 172.25.0.203
在这个配置文件中,我们部署了:
1 个 Redis 主节点(master)。
2 个 Redis 从节点(slave1 和 slave2)。
3 个 Redis 哨兵节点(sentinel1、sentinel2、sentinel3)。
每个 Redis 容器都有单独的配置文件,并通过 volumes 映射到宿主机。我们使用了 Docker 的 bridge 网络模式,并为每个容器分配了静态 IP 地址,确保容器之间能够稳定通信。
三、Redis 配置文件
配置文件目录结构如下:
redis-sentinel-cluster/
├── docker-compose.yml
├── master/
│ └── redis.conf
├── slave1/
│ └── redis.conf # Redis 从节点配置文件
├── slave2/
│ └── redis.conf # Redis 从节点配置文件
├── sentinel1/
│ └── sentinel.conf # Redis Sentinel 配置文件
├── sentinel2/
│ └── sentinel.conf # Redis Sentinel 配置文件
├── sentinel3/
│ └── sentinel.conf # Redis Sentinel 配置文件
└── data/ # 数据目录,用于持久化 Redis 数据
每个 Redis 节点都需要配置相应的配置文件,以下是关键配置内容:
- 主节点(Master)配置:
port 6379
protected-mode no
slave-serve-stale-data yes
replicaof no one
appendonly yes
- 从节点(Slave)配置(2个slave配置文件一致):
port 6379
bind 0.0.0.0
protected-mode no
replicaof 172.25.0.101 6379
appendonly yes
dir /data
- 哨兵(Sentinel)配置(3个sentinel配置文件一致):
sentinel monitor mymaster 10.28.145.144 6371 2
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
注意:在哨兵的配置中,我们指定了主节点的 IP 地址为 10.28.145.144(即本机地址)以及映射的端口 6371。
四、启动服务
docker-compose up -d

docker-compose ps

四、遇到的问题
连接哨兵集群的代码:
package mainimport ("context""fmt""log""time""github.com/go-redis/redis/v8"
)var rdb *redis.Clientfunc main() {// 定义 Redis 哨兵集群的地址sentinelAddrs := []string{"127.0.0.1:26380","127.0.0.1:26381","127.0.0.1:26382",}// 配置 Redis 哨兵模式连接options := &redis.FailoverOptions{MasterName: "mymaster", // 设定主节点名字SentinelAddrs: sentinelAddrs, // 哨兵地址Password: "", // 设置密码(如果有)DB: 0, // 数据库索引}// 创建 Redis 客户端rdb = redis.NewFailoverClient(options)// 测试连接ctx, cancel := context.WithTimeout(context.Background(), 25*time.Second)defer cancel()_, err := rdb.Ping(ctx).Result()if err != nil {log.Fatalf("无法连接到 Redis 哨兵集群: %v", err)}fmt.Println("成功连接到 Redis 哨兵集群")// 执行其他 Redis 操作setAndGet(ctx)
}func setAndGet(ctx context.Context) {// 示例:设置键值对并获取err := rdb.Set(ctx, "mykey", "Hello Redis!", 0).Err()if err != nil {log.Fatalf("无法设置键值对: %v", err)}val, err := rdb.Get(ctx, "mykey").Result()if err != nil {log.Fatalf("无法获取键值对: %v", err)}fmt.Printf("获取的值: %s\n", val)
}
在进行 Redis 哨兵集群连接时,遇到了以下问题:
- 问题描述:
在尝试通过 Go 语言客户端连接 Redis 哨兵集群时,报错信息为:
redis: 2025/01/03 09:58:07 sentinel.go:700: sentinel: discovered new sentinel="172.25.0.202:26379" for master="mymaster"
redis: 2025/01/03 09:58:07 sentinel.go:700: sentinel: discovered new sentinel="172.25.0.203:26379" for master="mymaster"
redis: 2025/01/03 09:58:07 sentinel.go:661: sentinel: new master="mymaster" addr="172.25.0.101:6379"
2025/01/03 09:58:32 无法连接到 Redis 哨兵集群: context deadline exceeded
经过分析,发现错误是由于 Go 客户端连接 Redis 哨兵集群时,Redis 哨兵返回的主节点地址是 Docker 内部的 IP 地址(例如:172.25.0.101:6379),而 Go 客户端无法直接连接该地址。
- 原因分析:
由于容器内的 IP 地址在宿主机和外部环境中不可访问,因此客户端无法通过这些 IP 地址与 Redis 集群进行通信。为了确保 Redis 哨兵能够返回宿主机可以访问的 IP 地址,我们需要在 Redis 配置和 Sentinel 配置中做一些调整。
五、问题解决方案
为了解决以上问题,我们需要确保 Redis 哨兵返回正确的主节点 IP 地址。以下是解决方案:
- 修改 Sentinel 配置:
在 Sentinel 的配置中,将主节点的 IP 地址改为宿主机的 IP 地址。修改如下:sentinel monitor mymaster 10.28.145.144 6371 2
这样,Redis 哨兵就会将主节点的地址返回为宿主机的 IP 地址,从而使客户端能够正确连接到 Redis 集群。

注意:此处只是临时解决方案,如果这样强制写死,虽然能正常访问,但哨兵集群发生故障迁移时,仍然会出现这个问题,最终解决方案待更新。
六、总结
通过 Docker 部署 Redis 哨兵集群,可以轻松实现 Redis 的高可用性。然而,在容器化环境下,尤其是 Docker 桥接网络模式中,我们需要特别注意容器之间的通信和外部访问。在本文中,我们分析了在连接 Redis 哨兵集群时遇到的网络问题,并给出了有效的解决方案。通过调整 Sentinel 配置,将主节点的 IP 地址设置为宿主机的 IP 地址,解决了客户端无法连接 Redis 集群的问题。最终,我们成功实现了 Docker 环境下 Redis 哨兵模式集群的高可用部署。希望本文对你在 Docker 环境下搭建 Redis 哨兵集群有所帮助。如有任何问题,欢迎留言讨论!
相关文章:
Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…...
【网页自动化】篡改猴入门教程
安装篡改猴 打开浏览器扩展商店(Edge、Chrome、Firefox 等)。搜索 Tampermonkey 并安装。 如图安装后,浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name:脚本名称。…...
【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力
目录 1 MHE的表示能力2 基于Frobenius-范数的低秩逼近3 基于CE的低秩近似 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:h…...
Github - unexpected disconnect while reading sideband packet
Open git global config: git config --global -eLet’s try to resolve the issue by increasing buffer: git config --global http.postBuffer 52428800Try to clone again. If that doesn’t work! > You can try the partial fetch method and disabling compressi…...
Ubuntu 环境安装 之 RabbitMQ 快速入手
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…...
UE5中实现右键开镜效果
右键之后添加时间轴,然后设置视野即可。Set Field Of View 时间轴设置,第一个点设置0,90度,因为默认的就是90度 第二个点看武器的类型或者倍境来设置,时间就是开镜时间,值越小开镜速度越快,第二个值就是视野…...
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
漏洞简介 pache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 漏洞环境 vulhub/httpd/CVE-2…...
Excel重新踩坑5:二级下拉列表制作;★数据透视表;
0、在excel中函数公式不仅可以写在单元格里面,还可以写在公式里面。 1、二级下拉列表制作: 2、数据透视表: 概念:通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览:在插入选项中有个数据透视表,数…...
力扣--35.搜索插入位置
题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 …...
C# 设计模式(行为型模式):模板方法模式
C# 设计模式(行为型模式):模板方法模式 在开发过程中,我们经常会遇到一类问题:一些操作的整体步骤是固定的,但某些具体步骤的实现会因为场景不同而有所变化。模板方法模式(Template Method Pat…...
Leetcode打卡:设计一个ATM机器
执行结果:通过 题目 2241 设计一个ATM机器 一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时,…...
【TCP】SYN、ACK、FIN、RST、PSH、URG的全称
在 TCP 协议中,SYN、ACK、FIN、RST、PSH 和 URG 都是控制标志位(Flags),每个标志位对应不同的功能。它们的全称如下: URG:(URGent)紧急 ACK:(ACKnowledgment)确认 PSH:(PuSH)推送 RS…...
【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析
文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…...
【通识安全】应急救护常识23则
一、异物入眼 任何细小的物体或液体,哪怕是一粒沙子或是一滴洗涤剂进入眼中,都会引起眼部疼痛,甚至损伤眼角膜。 急救办法:首先是用力且频繁地眨眼,用泪水将异物冲刷出去。如果不奏效,就将眼皮捏起&#…...
C语言:cJSON将struct结构体与JSON互相转换
文章目录 struct 转 jsonjson 转 struct 文档: https://github.com/DaveGamble/cJSON 项目结构 . ├── libs │ ├── cJSON.c │ └── cJSON.h └── main.c示例 struct 转 json #include "libs/cJSON.h" #include <stdio.h>// defi…...
在Linux中,如何查看和修改网络接口配置?
在Linux中,查看和修改网络接口配置主要依赖于几个命令行工具。这里详细介绍两种传统的命令行方式以及一些图形化工具(前提:系统支持): 一、临时性修改 1. 使用ifconfig命令(部分系统已被弃用)…...
使用深度学习来实现图像超分辨率 综述!
今天给大家介绍一篇图像超分辨率邻域的综述,这篇综述总结了图像超分辨率领域的几方面:problem settings、数据集、performance metrics、SR方法、特定领域应用以结构组件形式,同时,总结超分方法的优点与限制。讨论了存在的问题和挑…...
基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划
• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask,vueflask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送…...
【Android项目学习】3. MVVMHabit
项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础,整合OkhttpRxJavaRetrofitGlide等流行…...
在Linux中,如何配置负载均衡器以分配网络流量?
NGINX NGINX是一款高性能的HTTP和反向代理服务器,也常用作负载均衡器。它支持多种负载均衡算法,如轮询、加权轮询、IP哈希等。 配置步骤: 安装NGINX:根据您的Linux发行版,使用相应的包管理器安装NGINX。配置负载均衡…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
