首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【redis】哨兵:搭建主从/哨兵节点详解和细节

【redis】哨兵:搭建主从/哨兵节点详解和细节

作者头像
椰椰椰耶
发布于 2025-03-26 05:59:39
发布于 2025-03-26 05:59:39
22100
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

编排步骤

分为两组 yml,先后启动

我们其实也可以用于一个 yml 文件,直接启动 6 个容器,但是:

  • 如果把这六个容器同时启动,可能是哨兵先启动完成,数据节点后启动完成,哨兵就可能会先认为是数据节点挂了
  • 虽然对大局不影响,但是会影响到观察执行日志的过程

搭建主从节点

创建容器

  1. 创建三个容器,作为 redis 的数据节点(一主两从)
    • 这个名字不能改
    image.png|359
    image.png|359

将下面的配置复制进去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.7'
services:
  master:
    image: 'redis:5.0.9'
    container_name: redis-master
    restart: always
    command: redis-server --appendonly yes
    ports: 
      - 6379:6379
  slave1:
    image: 'redis:5.0.9'
    container_name: redis-slave1
    restart: always
    command: redis-server --appendonly yes --slaveof redis-master 6379
    ports:
      - 6380:6379
  slave2:
    image: 'redis:5.0.9'
    container_name: redis-slave2
    restart: always
    commandcommand: redis-server --appendonly yes --slaveof redis-master 6379
    ports:
      - 6381:6379
  • sevices:我们将要启动哪几个容器
    • masterslave1slave2 (这些名字自定义)
  • image:当前的容器是基于哪个镜像创建的
  • container_name:容器名字
  • restart异常情况终止后,是否重启
  • command:在启动 redis 服务器的时候,所用到的命令行选项
    • slaveof 后面不必写主节点 ip,直接写主节点的容器名就行了
    • 容器启动之后,被分配的 ip 是什么,也不知道
  • ports端口映射宿主机:容器内部端口
    • docker 容器可以理解成一个轻量的虚拟机。在这个容器里,端口号和外面宿主机的端口号,是两个体系。如果容器外面用了个 5000 端口,容器内也能用 5000 端口,并不冲突
    • 三个容器,每个容器的内部端口号都是自成一个小天地,容器 1 的 6379 和容器 2 的 6379 之间是不会有冲突的
    • 但是有时候,我们希望在容器外面能访问到容器里面的端口号,就可以把容器内部的端口映射成宿主机的端口。后续访问宿主机的这个端口,就相当于在访问对应容器的对应容器的对应端口了
    • 站在宿主的角度,访问上述几个端口的时候,也不知道这个端口实际上是一个宿主机上的服务,还是来自与容器内部的服务,只要正常去使用即可

这种映射过程,就非常像 NAT

  • 宿主机就像带有 NAT 功能的路由器,这个路由器能管理好几个局域网里面的机器
  • 正常来说,外面的没法访问局域网里面的设备,但是可以通过访问 NAT 设备上的某个端口,从而访问到局域网内部的某个设备的某个端口了

启动容器

  1. 启动容器 使用命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up -d
image.png
image.png
image.png
image.png
image.png
image.png
  • 启动 6379 端口的 redis 服务器之后,可以看到这是个主节点,下面还有两个从节点
image.png
image.png

搭建哨兵节点

创建容器

  1. 创建三个容器,作为 redis 的哨兵节点

redis 哨兵节点,是单独的 redis 服务器进程

  • 用哨兵节点,监控服务器进程
image.png
image.png

在哨兵节点的配置文件中,粘贴下面的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.7'
services:
  sentinel1:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-1
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/etc/redis/sentinel.conf
    ports:
      - 26379:26379
  sentinel2:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-2
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/etc/redis/sentinel.conf
    ports:
      - 26380:26379
  sentinel3:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-3
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/etc/redis/sentinel.conf
    ports:
      - 26381:26379
  • volumes:在当前目录下创建出 sentinel1.confsentinel2.confsentinel3.conf 这三个配置文件,然后把这三个配置文件映射到即将创建的这三个容器中
    • 哨兵节点,会在运行过程中,对配置文件进行自动修改。因此,就不能拿一个配置文件,给三个容器分别进行映射
  • portdocker 的一个核心功能,能够进行端口的映射,容器内部乐意使用什么端口都行,映射出去之后,还是需要确保端口不能重复

哨兵节点配置文件

我们看一下这三个配置文件的具体细节

  • 初始情况下,这三个配置文件内容可以是一样的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
  • bind:绑定一个 ip 地址,允许其他端口进行访问
  • port:主节点端口号
  • sentinel monitor:告诉 redis 节点,去监控哪个服务器
    • 服务器名字,这里其实是 ip,但是使用 dockerdocker 会自动进行域名解析
    • 服务器端口号(容器外的)
    • 法定票数。哨兵节点需要去判定当前的 redis 是否挂了,超过法定票数个哨兵意见一致,才确认挂了(更稳健,避免网络波动的影响造成误判)
  • sentinel down-after-milliseconds:心跳包的超时时间。超过超时时间之后包还没回来,就认为是挂了

配置节点
  1. 进行配置
image.png
image.png
启动容器
  1. 启动容器 按照后台启动的方式启动
image.png
image.png

启动容器后,我们使用命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose logs
  • 查看日志,发现报错了:不能解析出主节点实例的主机名(此处哨兵节点不认识 redis-master
    • redis-master 相当于一个域名,docker 会进行域名解析,将其解析成对应容器的 ip(ip 可能会变,但是容器名字是不变的)

主从/哨兵节点连入同一个局域网

使用 docker-compose 一下,启动了 N 个容器,此时 N 个容器都处于同一个“局域网”中

  • 可以使这 N 个容器之间可以相互访问
  • 三个 redis-server 节点,是一个局域网;三个哨兵节点,是另一个局域网
  • 默认情况下,这两个网络是不互通的

解决方案: 可以使用 docker-compose 把此处的两组服务放到同一个局域网中

  • docker network ls 列出当前 docker 中的局域网
image.png|366
image.png|366
  • 此处先启动了三个 redis server 节点,就相当于自动创建了第一个局域网。再启动后面三个哨兵节点,就直接让这三个节点加入到上面的局域网中,而不是创建新的局域网

在刚刚的 yml 配置文件中,最后再加上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
networks:
  default:
   	external:
   	  name: redis-data_default

完整配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.7'
services:
  sentinel1:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-1
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/etc/redis/sentinel.conf
    ports:
      - 26379:26379
  sentinel2:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-2
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/etc/redis/sentinel.conf
    ports:
      - 26380:26379
  sentinel3:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-3
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/etc/redis/sentinel.conf
    ports:
      - 26381:26379
networks:
  default:
    external:
      name: redis-data_default
image.png
image.png

使用 docker network inspect redis-data_default 命令,可以查看 redis-data_default 网络被哪些容器连接

image.png
image.png

上述的操作,就完成了此处的配置


我们再打开 sentinel.conf 这三个配置问价,发现里面发生了变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bind 0.0.0.0
port 26379
sentinel myid f1fd960a20a1ba19973fb8fee67b666e00b85f27
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
dir "/data"
sentinel monitor redis-master 172.18.0.2 6379 2
sentinel down-after-milliseconds redis-master 1000
sentinel config-epoch redis-master 0
sentinel leader-epoch redis-master 0
sentinel known-replica redis-master 172.18.0.3 6379
sentinel known-replica redis-master 172.18.0.4 6379
sentinel known-sentinel redis-master 172.18.0.7 26379 3437afc8086d37ea3204d3522a0640db2028e045
sentinel known-sentinel redis-master 172.18.0.6 26379 f1fd960a20a1ba19973fb8fee67b666e00b85f27
sentinel known-sentinel redis-master 172.18.0.5 26379 a6a389363f12cbb25085a22680575d297589c46a
sentinel current-epoch 0
  • 配置重写:这些是哨兵节点启动之后,自动进行修改的
  • 三个文件里面的具体信息都不一样
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python系列(三):语法基础之变量、数据类型与运算符
今天推荐的文章【深入解析MySQL索引与约束,提升数据库性能的秘诀】,作者【Lion Long】,二话不说上链接:https://cloud.tencent.com/developer/article/2470895 ,这篇文章内容详细,讲解细腻,我这种初学者都能很好看懂的~
Pocker_Spades_A
2024/11/26
1870
Python系列(三):语法基础之变量、数据类型与运算符
Python系列(一):语言的历史与特性全解析
今天想要介绍的一篇文章是关于Python语言的,文章标题【使用 Python 实现深度学习模型:智能食品质量控制】,作者【Echo_Wish】,二话不说上链接:https://cloud.tencent.com/developer/article/2470382 ,这篇文章展示用 Python 实现深度学习模型用于智能食品质量控制,涵盖数据准备、模型构建训练、评估部署等步骤。
Pocker_Spades_A
2024/11/24
1840
Python系列(一):语言的历史与特性全解析
总结Python的几点语言特性
Python语言简洁,优雅,扩展性强...... 这些特点常被Python程序员挂在嘴边,确实也都是Python的特点。
Python碎片公众号
2021/05/14
9280
python基础之多态
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python的多态相关知识。
jiankang666
2022/12/05
3630
python基础之多态
python之面向对象程序设计基础
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python的面向对象程序设计基础。
jiankang666
2022/12/05
2370
python之面向对象程序设计基础
​2020 GO vs Python 应该选择哪一个
Python是发展最快的编程语言之一。Python偏爱简单,易读的代码,并使用这些功能吸引那些不愿学习复杂编程语言的人。因此通过使用python,可以非常方便地将我们的思想转变为实际代码。
程序那些事儿
2023/03/07
4250
​2020 GO vs Python 应该选择哪一个
Python的一些中级用法
Python的中级用法涵盖了更复杂的编程技巧和概念,包括函数式编程、面向对象编程、模块化设计、文件操作、异常处理等。下面是Python的一些中级用法:
正在走向自律
2024/12/18
950
如何学习 Python 编程语言并快速掌握其基本语法和代码结构?
Python是一门简单易学但功能强大的编程语言,广泛应用于Web开发、数据分析、人工智能等领域。本文将介绍如何学习Python编程语言,并快速掌握其基本语法和代码结构,帮助读者迅速入门Python编程。
海拥
2023/06/27
4610
如何学习 Python 编程语言并快速掌握其基本语法和代码结构?
懂一点Python系列——快速入门
Python 英文原意为 “蟒蛇”,直到 1989 年荷兰人 Guido van Rossum (简称 Guido)发明了一种 面向对象 的 解释型 编程语言,并将其命名为 Python,才赋予了它表示一门编程语言的含义。
我没有三颗心脏
2020/03/26
5550
Python基础入门之解释器安装
Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 1 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, 2 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
江湖有缘
2023/11/10
2060
【Python】Python编程入门——教你彻底认清python
Python由Guido van Rossum于1989年底发明,并于1991年首次发布。Python以简洁和易读的语法赢得了广泛的用户基础。Python的名字来源于英国喜剧团体“蒙提·派森”(Monty Python)。
E绵绵
2025/05/25
1570
Python系列(七):Python 面向对象编程:类与对象的奥秘
今天推荐的文章【Python面向对象编程:探索代码的结构之美】,作者【忆遂愿】,二话不说上链接:https://cloud.tencent.com/developer/article/2470895 ,这篇文章深入讲解 Python 如何用贪心算法解决最优装载问题,贪心算法解最优装载,思路、实现、分析及优缺点俱全
Pocker_Spades_A
2024/11/30
1130
Python系列(七):Python 面向对象编程:类与对象的奥秘
DeepSeek 浪潮来袭,现有的编程语言能否撑住程序员职业的未来大厦?
随着 DeepSeek 的爆火,人工智能技术在编程领域的影响力日益增强。这不禁引发了人们对于现有编程语言能否支撑程序员职业未来发展的思考。
羑悻的小杀马特.
2025/02/10
3410
【Python】基础:环境配置与基础语法
Python是一种高级编程语言,由Guido van Rossum于1991年创建。它被设计成易读、简洁、可扩展的语言,具有强大的功能和广泛的应用领域。
DevFrank
2024/07/24
1420
【Python】基础:环境配置与基础语法
【JAVA-Day01】Java的介绍、特点和历史
在当今数字化时代,编程已经成为了一项至关重要的技能。与此同时,编程语言的选择也变得越来越重要,因为它直接影响到我们开发应用程序的方式和效果。在众多编程语言中,Java一直是备受欢迎的选择,不仅因为它的广泛应用,还因为它的跨平台性和强大的功能。
默 语
2024/11/20
1470
【JAVA-Day01】Java的介绍、特点和历史
Python为啥这么牛?跟其他语言相比究竟有什么优势?
导读:选择要学习的技术和选择要上的大学一样重要,如果选错了,你将来不仅得不到自己喜欢的高薪工作,反而会弄得一堆麻烦。如果你打开了这篇文章,说明你已经考虑选择Python开发作为你以后的职业了。
IT阅读排行榜
2018/08/16
9490
【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识
Python是一种高级、解释型、通用的编程语言,由Guido van Rossum于20世纪90年代初创立。Python以其简洁易读的语法和强大的功能而闻名,使其成为新手和经验丰富的开发人员的首选语言之一。
空白诗
2024/06/24
2620
python之类的单继承与多继承
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python的类的单继承与多继承。
jiankang666
2022/12/05
5290
python之类的单继承与多继承
Python以及基础语法保姆级教程(超详细)
Python 是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
爱喝兽奶的熊孩子
2024/04/10
4000
Python以及基础语法保姆级教程(超详细)
【Python】01、Python简介
高级语言:实现效率高,执行效率低,对硬件的可控性弱,目标代码大,可维护性好,可移植性好
py3study
2020/01/06
6190
相关推荐
Python系列(三):语法基础之变量、数据类型与运算符
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验