当前位置: 首页 > news >正文

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和自动故障转移。在本篇文章中,我将带大家了解如何在 Docker 环境中搭建一个 Redis 哨兵模式集群,并解决在连接时遇到的一些问题。

一、准备工作
  1. Docker 环境
    首先确保你的机器已经安装并配置了 Docker 和 Docker Compose。

  2. 网络配置
    我们将创建一个 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 节点都需要配置相应的配置文件,以下是关键配置内容:

  1. 主节点(Master)配置:
port 6379
protected-mode no
slave-serve-stale-data yes
replicaof no one
appendonly yes
  1. 从节点(Slave)配置(2个slave配置文件一致):
port 6379
bind 0.0.0.0
protected-mode no
replicaof 172.25.0.101 6379
appendonly yes
dir /data
  1. 哨兵(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 哨兵集群连接时,遇到了以下问题:

  1. 问题描述:
    在尝试通过 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 客户端无法直接连接该地址。

  1. 原因分析:
    由于容器内的 IP 地址在宿主机和外部环境中不可访问,因此客户端无法通过这些 IP 地址与 Redis 集群进行通信。为了确保 Redis 哨兵能够返回宿主机可以访问的 IP 地址,我们需要在 Redis 配置和 Sentinel 配置中做一些调整。

五、问题解决方案

为了解决以上问题,我们需要确保 Redis 哨兵返回正确的主节点 IP 地址。以下是解决方案:

  1. 修改 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 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…...

【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 文档&#xff1a; https://github.com/DaveGamble/cJSON 项目结构 . ├── libs │ ├── cJSON.c │ └── cJSON.h └── main.c示例 struct 转 json #include "libs/cJSON.h" #include <stdio.h>// defi…...

在Linux中,如何查看和修改网络接口配置?

在Linux中&#xff0c;查看和修改网络接口配置主要依赖于几个命令行工具。这里详细介绍两种传统的命令行方式以及一些图形化工具&#xff08;前提&#xff1a;系统支持&#xff09;&#xff1a; 一、临时性修改 1. 使用ifconfig命令&#xff08;部分系统已被弃用&#xff09;…...

使用深度学习来实现图像超分辨率 综述!

今天给大家介绍一篇图像超分辨率邻域的综述&#xff0c;这篇综述总结了图像超分辨率领域的几方面&#xff1a;problem settings、数据集、performance metrics、SR方法、特定领域应用以结构组件形式&#xff0c;同时&#xff0c;总结超分方法的优点与限制。讨论了存在的问题和挑…...

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…...

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础&#xff0c;整合OkhttpRxJavaRetrofitGlide等流行…...

在Linux中,如何配置负载均衡器以分配网络流量?

NGINX NGINX是一款高性能的HTTP和反向代理服务器&#xff0c;也常用作负载均衡器。它支持多种负载均衡算法&#xff0c;如轮询、加权轮询、IP哈希等。 配置步骤&#xff1a; 安装NGINX&#xff1a;根据您的Linux发行版&#xff0c;使用相应的包管理器安装NGINX。配置负载均衡…...

告别U盘!手把手教你用NFS在IMX6ULL开发板和Ubuntu虚拟机间共享驱动代码

告别U盘&#xff01;手把手教你用NFS在IMX6ULL开发板和Ubuntu虚拟机间共享驱动代码 嵌入式Linux驱动开发过程中&#xff0c;频繁在开发环境和目标板之间传输文件是每个工程师的日常。传统U盘拷贝或手动传输不仅效率低下&#xff0c;还容易打断开发节奏。本文将带你用NFS&#x…...

Path of Building:流放之路Build规划器的三大创新突破

Path of Building&#xff1a;流放之路Build规划器的三大创新突破 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 在《流放之路》这款以复杂数值系统著称的动作RPG中&…...

[Sci Rep 2024]Spatial-temporal attention for video-based assessment of intraoperative surgical skill

论文网址&#xff1a;Spatial-temporal attention for video-based assessment of intraoperative surgical skill | Scientific Reports 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2.2. Introduction 2.2.1. Related work 2.3. Method 2.3.1. Supervised spatial at…...

python pre-commit-hooks

## 关于Python pre-commit hooks&#xff0c;一些实际工作中的思考 在团队协作开发Python项目时&#xff0c;经常会遇到这样的场景&#xff1a;有人提交了代码&#xff0c;但忘记格式化&#xff0c;或者引入了语法错误&#xff0c;或者提交了调试用的print语句。这些问题虽然不…...

Linux系统遭挖矿入侵:从异常告警到根因定位的实战排查指南

1. 告警触发&#xff1a;CPU异常飙升的第一反应 那天凌晨3点&#xff0c;我正在睡梦中&#xff0c;手机突然疯狂震动。打开一看&#xff0c;监控系统连续发了十几条告警&#xff1a;某台线上服务器的CPU使用率突破95%&#xff0c;持续时间已超过15分钟。这种半夜告警最让人头疼…...

1TB流量可支撑多少订单数据

要预估 1TB 网络流量能支撑多少订单数据量&#xff0c;核心在于分析单个订单请求的平均数据流量&#xff0c;然后进行除法计算。这是一个典型的系统容量与资源估算问题&#xff0c;涉及对请求链路、数据格式和压缩情况的深入分析 。 问题解构与核心变量 此问题的答案并非固定…...

别再盲目升级GPU!92%的代码生成延迟其实源于AST解析器阻塞——一线大厂内部性能压测文档首次公开

第一章&#xff1a;智能代码生成性能优化技巧 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成模型&#xff08;如基于LLM的Copilot类工具&#xff09;在实际工程落地中常面临响应延迟高、上下文吞吐低、生成结果不稳定等问题。优化其端到端性能需兼顾推理效率、缓…...

2025届毕业生推荐的五大降重复率方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当人工智能生成内容被广泛运用的时候&#xff0c;把 AIGC 痕迹降低成为了内容创作者最为核心…...

【仅限首批技术负责人开放】:Gartner认证的「生成-审查」双闭环成熟度模型(含自评矩阵与6个月跃迁路径图)

第一章&#xff1a;智能代码生成与代码审查流程整合 2026奇点智能技术大会(https://ml-summit.org) 现代软件工程实践中&#xff0c;智能代码生成已不再孤立运行于开发环境边缘&#xff0c;而是深度嵌入持续集成与代码审查&#xff08;CI/CR&#xff09;主干流程。当开发者提交…...

【全网首发】2026 第十七届蓝桥杯 C/C++ C 组省赛真题逐题满分解析 | 附省一备考攻略

2026年4月11日&#xff0c;第十七届蓝桥杯全国软件和信息技术专业人才大赛省赛落下帷幕。作为国内参赛规模最大、影响力最广的算法竞赛之一&#xff0c;本届大赛吸引了全国超过30万名选手参赛&#xff0c;其中C/C软件赛C组作为面向高职高专院校学生和普通本科低年级初学者的入门…...