Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【redis】哨兵相关知识超详解(覆盖面试考点)
Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应⽤来说,这种⽅案是⽆法接受的,于是 Redis 从 2.8 开始提供了 Redis Sentinel(哨兵)加个来解决这个问题。本章主要内容如下:
椰椰椰耶
2025/03/28
1500
【redis】哨兵相关知识超详解(覆盖面试考点)
初识Redis · 哨兵机制
在前文我们介绍了Redis的主从复制有一个最大的缺点就是,主节点挂了之后没有办法迅速重启,毕竟即便主节点挂了,人工干预恢复的话,也要花费许多时间,想必各位程序员也不想在夜深人静的时候突然去公司加班就为了修复一下主节点吧?
_lazy
2025/04/26
1260
初识Redis · 哨兵机制
使用docker 搭建redis的哨兵机制
实现了Redis的主从复制,在一定程度上保证了数据的可用性,但是如果主从复制中的master 节点挂掉,Redis将不再对外提供读写操作。假设当主从复制中的master节点挂掉后,如果能够从它的slave节点中重新选举一个节点作为master节点,那么系统就可以恢复了,因此就有了Redis的哨兵(sentinel)模式。
酒馆丁老师
2020/09/08
7290
使用docker 搭建redis的哨兵机制
使用Docker-Compose搭建高可用redis哨兵集群
出于学习目的,您可以很轻松地在docker环境下运行redis的单个实例,但是如果您需要在生产环境中运行它,那么必须将Redis部署为HA(High Avaliable)模式。
有态度的马甲
2020/04/16
3.5K0
使用Docker-Compose搭建高可用redis哨兵集群
docker-compose搭建redis集群之哨兵模式
本文基于上一篇主从模式文章docker-compose搭建redis集群之主从复制
gang_luo
2020/08/13
1.1K0
docker-compose搭建redis集群之哨兵模式
关于redis的一主三从三哨兵的实现
当谈到数据库管理系统时,Redis就像是那个充满魔法的巫师,能够让你的应用程序变得更快、更可靠,就像是施了魔法一样。而今天,我们将进入Redis的神奇世界,探索一种有趣而强大的架构——一主三从三哨兵(One Master, Three Slaves, Three Sentinels)。
一只牛博
2025/05/31
730
关于redis的一主三从三哨兵的实现
Redis Sentinel-深入浅出原理和实战
之前的文章聊到了Redis的主从复制,聊到了其相关的原理和缺点,具体的建议可以看看我之前写的文章Redis的主从复制。
SH的全栈笔记
2022/08/17
3660
Redis Sentinel-深入浅出原理和实战
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
本篇文章笔者推荐一个笔者最常用的docker图形化管理工具——Portainer。
良月柒
2024/04/16
50.6K0
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
Docker下redis与springboot三部曲之二:安装redis主从和哨兵
在上一章《 Docker下redis与springboot三部曲之一:极速体验》我们快速体验了springboot访问单机版redis,今天的实战中我们在Docker下搭建redis主从和哨兵服务;
程序员欣宸
2022/05/06
3100
Docker下redis与springboot三部曲之二:安装redis主从和哨兵
Redis高级知识
方式二:在不修改Redis配置文件的前提下,在第一次连接redis时,输入命名 Config set requirepass 密码 后再次操作操作redis时,需要做auth校验。auth 123456
乐心湖
2021/01/18
6180
Redis高级知识
基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)
    我们知道,Redis的集群方案大致有三种:1)redis cluster集群方案;2)master/slave主从方案;3)哨兵模式来进行主从替换以及故障恢复。
用户9127725
2022/08/08
8310
基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)
C#两大知名Redis客户端连接哨兵集群的姿势
前面《Docker-Compose搭建Redis高可用哨兵集群》, 我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。
有态度的马甲
2020/04/16
2.4K0
《Redis入门这一篇就够了》
通过Nginx代理到某一个服务器上时,会造成在8080或者8081的Tomcat服务器上登录,Tomcat服务器会给客户端返回一个JSessionID的Cookie值,客户端再次请求时,会携带这个JSessionID,并且会通过JSessionID去Tomcat中找Session,如果找到Session,直接使用,如果找不到,重新创建一个Session,并且需要返回一个全新的JSessionID。
2020/11/24
6630
《Redis入门这一篇就够了》
主机Redis服务迁移到现有Docker Overlay网络
hello, 好久不见,之前文章记录了一个实战的2C分布式项目的改造过程,结果如下:
有态度的马甲
2020/06/29
7120
主机Redis服务迁移到现有Docker Overlay网络
Redis进阶学习06--分布式缓存--上
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
大忽悠爱学习
2022/05/09
5360
Redis进阶学习06--分布式缓存--上
Docker方式Redis主从复制及Sentinel哨兵模式实现
主从复制,这里是一台主(master)两台从(slave),master主节点可读可写,slave只具备读的权限 我们将 192.168.100.1 作为master主节点,其余两台为slave从节点
itze
2022/10/31
4820
Docker方式Redis主从复制及Sentinel哨兵模式实现
基于Docker的Redis高可用集群搭建(redis-sentinel)
  之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该redis主从集群并非是高可用的。   目前来说,高可用(主从复制、主从切换)redis集群有两种方案,一种是redis-sentinel,只有一个master,各实例数据保持一致;一种是redis-cluster,也叫分布式redis集群,可以有多个master,数据分片分布在这些master上。   本文介绍基于docker和redis-sentinel的高可用redis集群搭建,大多数情况下,redis-sentinel也需要做高可用,这里先对redis搭建一主二从环境,另外需要3个redis-sentinel监控redis master。
happyJared
2018/09/20
2.9K0
基于Docker的Redis高可用集群搭建(redis-sentinel)
Docker下redis与springboot三部曲之三:springboot下访问redis哨兵
在《 Docker下redis与springboot三部曲之二:安装redis主从和哨兵》一文中,我们在docker下搭建了redis主从和哨兵,本章我们开发一个基于springboot的web工程,体验springboot下如何使用redis高可用服务;
程序员欣宸
2022/05/06
4340
Docker下redis与springboot三部曲之三:springboot下访问redis哨兵
从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路
我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的,没有做集群模式部署,为了提高整体的可用性,对项目的部署架构进行了升级,支持高可用。相关内容可参考之前的两篇:
悟空聊架构
2022/07/01
7810
从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路
使用 Docker Compose 部署 Redis Sentinel 高可用架构
在现代应用中,无法容忍系统中断或数据丢失。Redis 作为一种高性能的内存数据库,被广泛应用于缓存、会话管理等场景。然而,即使我们拥有可伸缩的 Redis Cluster 集群,也需要考虑在主节点故障时自动切换到从节点的机制。这时候 Redis Sentinel 就派上用场了。高可用性是分布式应用的核心需求之一。我们在之前的文章中介绍了redis cluster 3主3从集群的搭建,本文将为您介绍如何在现有的 Redis 3 主 3 从 Cluster 集群基础上,使用 Docker Compose 部署 Redis Sentinel,为您的应用构建一个强大的高可用性方案。
修己xj
2023/08/25
6400
使用 Docker Compose 部署 Redis Sentinel 高可用架构
相关推荐
【redis】哨兵相关知识超详解(覆盖面试考点)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验