在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.rhkb.cn/news/466168.html

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

相关文章

职场高手揭秘,细节如何左右你的成败与升迁之路

身在职场,每一个人都想得到老板的器重,能不断地加薪、升职,从而获得职场的成功。但你知道,影响一个人职场成功,或者说影响升职加薪的最重要因素是什么吗? 许多人会说那要靠运气,也有人认为工作…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色,分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

RNN中的梯度消失与梯度爆炸问题

梯度消失与梯度爆炸问题 循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络.在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

ENSP GVRP动态学习VLAN

手工配置的VLAN称为静态VLAN,通过GVRP协议创建的VLAN称为动态VLAN。 GVRP有三种注册模式,不同的模式对静态VLAN和动态VLAN的处理方式也不同。 GVRP的三种注册模式分别定义如下: Normal模式:允许动态VLAN在端口上进行注册…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…

大语言模型鼻祖Transformer的模型架构和底层原理

Transformer 模型的出现标志着自然语言处理(NLP)技术的一次重大进步。这个概念最初是针对机器翻译等任务而提出的,Transformer 后来被拓展成各种形式——每种形式都针对特定的应用,包括原始的编码器-解码器(encoder-de…

解决vue3导出.xlsx的blob文件受损问题

1、 首先要设置get或者post请求的类型。这里我用到post请求 eg&#xff1a;在http.ts中添加公共的方法。 export function post1(url: string, params: any): Promise<AxiosResponse> | Promise<AxiosResponse<any>> {return new Promise((resolve, reject…

Jest项目实战(6):搭建文档网站

搭建文档网站 创建 API 文档可以选择如下的 3 种方式&#xff1a; 功能较少&#xff0c;可以直接写在 README.md 文件里面内容较多&#xff0c;可以单独写一个文件API 数量众多&#xff08;Vue、React 这种级别&#xff09;&#xff0c;需要考虑单独拿一个网站来做详细的文档…

STM32项目---水质水位检测

1 项目简介 1.1 项目需求 本项目通过测量水体的TDS来反映水体的质量。并同时可以测量水位&#xff08;水深&#xff09;。 1.2 系统总体设计 2 硬件模块 2.1 硬件选型 水位测量模块 TDS采集模块 外置ADC模块&#xff08;ADS1115&#xff09; 2.2 水位测量模块使用方法 …

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron )&#xff0c;又名感知机( Perceptron )&#xff0c;在模型结构上与 逻辑回归 一致&#xff0c;这里以一个二维输入量的例子对其进行进一步 的解释&#xff1a; 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

银行信贷风控专题&#xff1a;Python、R 语言机器学习数据挖掘应用实例合集&#xff1a;xgboost、决策树、随机森林、贝叶斯等 原创 拓端研究室 全文链接&#xff1a;https://tecdat.cn/?p38026 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘…

某华迪加现场大屏互动系统mobile.do.php任意文件上传

免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 该系统是实现现场大屏互动&#xff0c;里面功能众多&#xff0c;但在mobile.do.php接口处存在任意文件上传漏洞 搜索语法 fof…

基于Python的学生宿舍管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的应用已经渗透到了我们生活的方方面面&#xff0c;从日常的语音助手到复杂的图像处理&#xff0c;无不体现着AI技术的魅力。特别是在娱乐和创意领域&#xff0c;AI技术更是展现出了惊人的潜力。其中&a…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大&#xff0c;容错率…

EV录屏好用吗?盘点2024年10款专业好用的录屏软件。

EV录屏的方式有很多种&#xff0c;它设置了很多模式&#xff0c;并且录制高清&#xff0c;可以免费使用。但是现在很多的录屏工具都有着与这个软件相似的功能&#xff0c;在这里我可以给大家列举一些。 1、福昕电脑录屏 这个软件为用户提供了多种录制模式&#xff0c;让视频录…

【网易云插件】听首歌放松放松

先看效果&#xff1a; 网易云有两种类似的插件。 第一种 &#xff1a; iframe 优点&#xff1a;可以自己调整插件的高度、宽度 缺点&#xff1a;很多博客网站不支持嵌入iframe&#xff0c;请试一下您的网站是否支持 登录可直接复制代码。 也可以在我这里 <iframe fram…

Java的Object类常用的方法(详述版本)

文章目录 一、什么是Object类二、常用方法&#xff1a;toString&#xff08;&#xff09;三、常用方法&#xff1a;对象比较equals&#xff08;&#xff09;四、常用方法&#xff1a;hashcode&#xff08;&#xff09;五、总结 一、什么是Object类 顾名思义&#xff0c;Object类…