在docker中搭建redis哨兵环境

文章目录

  • 一、引言
  • 二、环境准备
    • 前提条件
    • 目录结构
  • 三、配置文件
    • 1. 主节点配置文件 sentinel-master.conf
    • 2. 从节点配置文件
    • 3. 哨兵配置文件 sentinel.conf
    • 4. Docker Compose 文件
  • 四、启动 Docker Compose
  • 五、验证哨兵机制
    • 1. 检查主节点状态
    • 2. 检查从节点状态
    • 3. 检查哨兵状态
    • 4. 测试故障转移
  • 六、常见问题及解决方法
  • 七、结论
  • 八、参考资料

一、引言

Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列等场景。为了提高系统的可用性和容错能力,Redis 提供了哨兵(Sentinel)机制。哨兵可以监控主节点和从节点的状态,并在主节点失效时自动进行故障转移。本文将详细介绍如何使用 Docker 搭建 Redis 哨兵环境,确保你的 Redis 集群在出现故障时能够自动恢复。

二、环境准备

前提条件

  • 已安装 Docker 和 Docker Compose。
  • 基本的 Docker 和 Redis 知识。

目录结构

假设我们在 redis-sentinel 目录下进行操作,目录结构如下:

redis-sentinel/
├── conf
│   ├── sentinel-master.conf
│   ├── sentinel-slave1.conf
│   ├── sentinel-slave2.conf
│   └── sentinel-slave3.conf
├── docker-compose.yml
├── sentinel1
│   └── sentinel.conf
├── sentinel2
│   └── sentinel.conf
└── sentinel3└── sentinel.conf

三、配置文件

1. 主节点配置文件 sentinel-master.conf

# 绑定 IP 地址
bind 0.0.0.0# 配置端口号
port 6379# 开启 AOF 持久化
appendonly yes# 设置密码
# requirepass your_master_password

2. 从节点配置文件

  • sentinel-slave1.conf
# 绑定 IP 地址
bind 0.0.0.0# 配置端口号
port 6379# 开启 AOF 持久化
appendonly yes# 指定主节点的地址和端口
replicaof 172.30.1.2 6379# 设置密码(如果主节点设置了密码)
# masterauth your_master_password# 设置密码(可选)
# requirepass your_slave_password
  • sentinel-slave2.conf
# 绑定 IP 地址,允许远程连接
bind 0.0.0.0# 配置端口号
port 6379# 开启 AOF 持久化(可选)
appendonly yes# 指定主节点的地址和端口
replicaof 172.30.1.2 6379# 设置密码(如果主节点设置了密码)
# masterauth your_master_password# 设置密码(可选)
# requirepass your_slave_password
  • sentinel-slave3.conf
# 绑定 IP 地址,允许远程连接
bind 0.0.0.0# 配置端口号
port 6379# 开启 AOF 持久化(可选)
appendonly yes# 指定主节点的地址和端口
replicaof 172.30.1.2 6379# 设置密码(如果主节点设置了密码)
# masterauth your_master_password# 设置密码(可选)
# requirepass your_slave_password

3. 哨兵配置文件 sentinel.conf

# 哨兵端口号
port 26379# 哨兵监控的主节点信息 mymaster是哨兵监控的主节点名称,可以自定义
sentinel monitor redis-sentinel 172.30.1.2 6379 2# 哨兵的 quorum 数值,表示多少个哨兵节点认为主节点不可用时才进行故障转移
sentinel down-after-milliseconds redis-sentinel 5000# 故障转移超时时间
sentinel failover-timeout redis-sentinel 60000# 使用主机名解析
# sentinel resolve-hostnames yes# 使用主机名广播
# sentinel announce-hostnames yes# 主节点的密码(如果设置了密码)
# sentinel auth-pass redis-sentinel your_master_password# 哨兵之间的认证密码(可选)
# sentinel auth-pass sentinel your_sentinel_password

sentinel resolve-hostnames yes:哨兵在报告主节点和从节点的地址时,会使用主机名而不是 IP 地址。
sentinel announce-hostnames yes:哨兵在向其他哨兵或客户端报告自己的地址时,会使用主机名而不是 IP 地址。

4. Docker Compose 文件

version: '3.8'services:redis-master:image: redis:latestcontainer_name: redis-mastercommand: ["redis-server", "/etc/redis/redis.conf"]volumes:- ./conf/sentinel-master.conf:/etc/redis/redis.confnetworks:redis-sentinel:ipv4_address: 172.30.1.2ports:- "6389:6379"- "16389:16379"redis-slave1:image: redis:latestcontainer_name: redis-slave1command: ["redis-server", "/etc/redis/redis.conf"]volumes:- ./conf/sentinel-slave1.conf:/etc/redis/redis.confnetworks:redis-sentinel:ipv4_address: 172.30.1.3ports:- "6390:6379"- "16390:16379"depends_on:- redis-masterredis-slave2:image: redis:latestcontainer_name: redis-slave2command: ["redis-server", "/etc/redis/redis.conf"]volumes:- ./conf/sentinel-slave2.conf:/etc/redis/redis.confnetworks:redis-sentinel:ipv4_address: 172.30.1.4ports:- "6391:6379"- "16391:16379"depends_on:- redis-masterredis-slave3:image: redis:latestcontainer_name: redis-slave3command: ["redis-server", "/etc/redis/redis.conf"]volumes:- ./conf/sentinel-slave3.conf:/etc/redis/redis.confnetworks:redis-sentinel:ipv4_address: 172.30.1.5ports:- "6392:6379"- "16392:16379"depends_on:- redis-masterredis-sentinel1:image: redis:latestcontainer_name: redis-sentinel1command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel1:/usr/local/etc/redisdepends_on:- redis-master- redis-slave1- redis-slave2- redis-slave3networks:redis-sentinel:ipv4_address: 172.30.1.11ports:- "26379:26379"redis-sentinel2:image: redis:latestcontainer_name: redis-sentinel2command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel2:/usr/local/etc/redisdepends_on:- redis-master- redis-slave1- redis-slave2- redis-slave3networks:redis-sentinel:ipv4_address: 172.30.1.12ports:- "26380:26379"redis-sentinel3:image: redis:latestcontainer_name: redis-sentinel3command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel3:/usr/local/etc/redisdepends_on:- redis-master- redis-slave1- redis-slave2- redis-slave3networks:redis-sentinel:ipv4_address: 172.30.1.13ports:- "26381:26379"networks:redis-sentinel:driver: bridgeipam:config:- subnet: 172.30.1.0/24

四、启动 Docker Compose

在 redis-sentinel 目录下运行以下命令来启动 Docker Compose:

docker-compose up -d

五、验证哨兵机制

1. 检查主节点状态

docker exec -it redis-master redis-cli -a your_master_password
info replication

你应该能看到 role:master 和 connected_slaves:2,表示有两个从节点连接。

2. 检查从节点状态

docker exec -it redis-slave1 redis-cli -a your_slave_password
info replication

你应该能看到 role:slave 和 master_host:redis-master,表示从节点已成功连接到主节点。

3. 检查哨兵状态

docker exec -it redis-sentinel1 redis-cli -p 26379
sentinel master redis-sentinel

你应该能看到主节点和从节点的信息,确认哨兵已经正确监控主从节点。

4. 测试故障转移

停止主节点:

docker stop redis-master

检查哨兵状态:

docker exec -it redis-sentinel1 redis-cli -p 26379
sentinel master redis-sentinel

你应该能看到新的主节点信息,确认哨兵已经成功进行了故障转移。
使用docker logs -f redis-sentinel1查看哨兵节点的日志信息,也会有如下日志输出:
+switch-master redis-sentinel 172.30.1.4 6379 172.30.1.2 637
在这里插入图片描述

六、常见问题及解决方法

  • Failed to resolve hostname
    如果未使用固定IP,而是使用桥接方式的动态IP,可能会出现哨兵节点无法解析主节点服务名的情况,这跟docker的现象如下图:
    在这里插入图片描述
    解决方案
    可以在哨兵节点的配置文件中开启如下配置:
# 绑定 IP 地址
bind 0.0.0.0# 使用主机名解析
# sentinel resolve-hostnames yes# 使用主机名广播
# sentinel announce-hostnames yes

docker桥接模式内置了DNS解析服务,它可以使用服务名直接相互访问,不用设置容器的具体ip,这样就避免了每次重新部署容器时ip发生变动造成的配置麻烦。这种方式很方便,但部分版本的redis内部对域名访问的支持并不稳定。

  • Could not rename tmp config file (Device or resource busy)
Could not rename tmp config file (Device or resource busy)
Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

在这里插入图片描述
出现该问题的原因是redis sentinel(哨兵)会更改节点和哨兵的conf文件,这涉及文件权限问题。最简单的一种处理方案:挂载文件时,选择挂载conf文件所在的目录,而不直接挂载conf文件。

  • Next failover delay: I will not start a failover before
    在这里插入图片描述
    原因待定,临时解决方案:去掉各节点配置文件中的密码信息。

七、结论

通过使用 Docker 搭建 Redis 哨兵环境,我们可以轻松地实现 Redis 集群的高可用性和故障恢复。本文详细介绍了如何在docker中配置主节点、从节点和哨兵节点,并提供了详细的步骤和示例。希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎留言交流。

八、参考资料

    1. WARNING: Sentinel was not able to save the new configuration on disk
    1. 使用docker部署redis哨兵(sentinel)时遇到的问题

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

上线不出网机器

不出网机器介绍 上线不出网机器是我们常见的问题,如何在内网中实现不出网机器的上线呢,我们分为了如下的形式,根据之前所学的内容我们开始进行实验,常见的网络拓扑如下 情况分类 上线不出网机器一般是指B区域的电脑上线到CS工具或…

Modbus解析流程全面升级:体验全新核心与终极优化!

01 前言 本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。 02 全面改进的解析流程 前面发布过的Modbus解析流程在经过多个设备测试后发现存…

Python邮差:如何用代码精确投递商品快递费用的密信

目录 一、准备工作 二、编写API请求脚本 三、解析与处理快递费用数据 四、案例应用:模拟电商平台的快递费用计算 五、自动化邮件通知 六、总结 在电子商务的广阔天地里,精确计算并快速传递商品快递费用是一项至关重要的任务。作为Python邮差&#…

修改sql server 数据库的排序规则Chinese_PRC_CI_AS(字符集+排序)

文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…

七十页PPT展示智驾时代来临,国产汽车零部件厂商准备几何?

u 智能汽车车身架构主要可分为感知、决策控制、执行及通信四大板块,目前国产汽车零部件供应商在感知系统已取得较强的话语权,在决策控制系统、执行系统领域亦取得一定竞争力。 u 感知系统主要硬件包括激光雷达、毫米波雷达、摄像头等;其中&a…

Springboot 整合 Java DL4J 打造自然语言处理之智能写作助手

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

moffee

https://github.com/BMPixel/moffee Moffee:一键将Markdown转换为专业PPT,支持多主题与实时预览 文章目录 1-安装1.1-环境1.2-编码 2-使用2.1-语法 moffee 演示让 Markdown 准备好演示为什么选择 moffee?展示用 Markdown 设置样式媒体布局 1-…

玩转「HF/魔搭/魔乐」平台

模型下载 Hugging Face 下载到 GitHub CodeSpace CodeSpace创建环境: # 安装transformers pip install transformers4.38 pip install sentencepiece0.1.99 pip install einops0.8.0 pip install protobuf5.27.2 pip install accelerate0.33.0下载internlm2_5-7b…

运维高可用架构设计

一、硬件 1、服务器 2、网络架构 二、软件 1、基础组件 组件名称 高可用方式 最少节点数 负载均衡(Tenginx) corsyncpacemaker互为主备 多组集群通过DNS轮循实现一个大集群 2DNS主从集群2RabbitMQ原生HA镜像集群3Zookeeper原生分布式集群3Kafka原生分布式集群3ES原生分布式集…

DICOM标准:MR图像模块属性详解——磁共振成像(MR)在DICOM中的应用

目录 引言 磁共振成像(MR) 一、MR图像模块 二、MR图像属性描述 1、图像类型 (Image Type) 2、抽样每个象素 (Sampling per Pixel) 3、光度插值 (Photometric Interpretation) 4、位分配 (Bits Allocated) 结论 引言 数字成像和通信在医学&#xff08…

SpringBoot在线教育系统:多语言支持

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

Cursor和GitHub Copilot之间的竞争

大家好,今天我们要聊聊一个在开发者圈子里引起热议的话题:GitHub Copilot和Cursor之间的竞争,以及Copilot最近宣布的新功能,这可能会改变我们对编程辅助工具的看法。 GitHub Copilot将支持来自Anthropic、Google和OpenAI的模型&am…

Python酷库之旅-第三方库Pandas(181)

目录 一、用法精讲 836、pandas.api.types.is_file_like函数 836-1、语法 836-2、参数 836-3、功能 836-4、返回值 836-5、说明 836-6、用法 836-6-1、数据准备 836-6-2、代码示例 836-6-3、结果输出 837、pandas.api.types.is_list_like函数 837-1、语法 837-2、…

软件测试必会:cookie、session和token的区别~

今天就来说说session、cookie、token这三者之间的关系!最近这仨玩意搞得头有点大🤣 01、为什么会有它们三个 我们都知道 HTTP 协议是无状态的,所谓的无状态就是客户端每次想要与服务端通信,都必须重新与服务端链接,意…

Vue3+vite 加载优化

公司项目,技术栈:vue3viteelementPLusecharts。首屏加载有点慢,针对这个做了一些优化措施,记录一下。之前写过关于vue2版本的优化,有兴趣的可以了解下 定位问题 f12打开控制台,然后Network看下那些包占比大…

Nvidia突袭AI江湖!悄悄发布新模型,完爆OpenAI和Anthropic?

你以为Nvidia只会造芯片?太天真了!这家GPU巨头刚刚在AI语言模型领域上演了一出惊天逆袭,让OpenAI和Anthropic都措手不及。 没有轰轰烈烈的发布会,没有铺天盖地的宣传,Nvidia就这么静悄悄地在Hugging Face平台上扔出了一…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

jQuery选择器

目录 一、基本选择器 1. 标签选择器(元素选择器) 2. ID 选择器 3. 类选择器 4. 通配符选择器 二、层次选择器 1. 后代选择器 2. 子选择器 3. 相邻兄弟选择器 4. 一般兄弟选择器 三、属性选择器 1. 简单属性选择器 2. 属性值等于选择器 3.属…

kafka如何获取 topic 主题的列表?

大家好,我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表?】面试题?希望对大家有帮助; kafka如何获取 topic 主题的列表? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中,可以…

π0——用于通用机器人控制的流匹配VLA模型:一套框架控制7种机械臂(基于PaliGemma和ACT的3B模型)

前言 在此文之前,我花了一天半,详细解读了清华一研究团队发布的机器人扩散大模型RDT,包括其每一个附录,并在该文中预告说:​下一篇是一个3B的机器人大模型打通7种不同品牌的机械臂,这几个工作宣告机器人真…