Redis 哨兵模式部署--docker版本

redis sentinel 简介

Redis Sentinel 是 Redis 官方提供的高可用(HA)解决方案,用于监控主从架构中的故障并自动完成故障转移。当主节点(Master)宕机时,Sentinel 能自动选举新的主节点,通知从节点(Slave)和客户端更新配置,实现服务无缝切换。其核心功能包括:

  1. 监控:持续检查 Redis 主从节点的健康状态
  2. 自动故障转移:主节点故障时,自动将从节点提升为主节点。
  3. 配置提供:为客户端动态推送最新的主节点地址。
  4. 通知:通过 API 通知管理员节点故障信息。

本次使用 1主 + 2从 + 3 Sentinel 的架构进行部署。

准备环境

  • 获取 redis docker 镜像

    docker pull redis:7.4.4
    docker images
    
  • 创建目录 /home/docker/redis-sentinel,将后续相关的配置文件都集中存放在该目录

    mkdir -p /home/docker/redis-sentinel
    
  • 依次创建 master、salve、sentinel的目录文件夹

    mkdir -p /home/docker/redis-sentinel/master-data
    mkdir -p /home/docker/redis-sentinel/salve1-data
    mkdir -p /home/docker/redis-sentinel/salve2-data
    mkdir -p /home/docker/redis-sentinel/sentinel1-data
    mkdir -p /home/docker/redis-sentinel/sentinel2-data
    mkdir -p /home/docker/redis-sentinel/sentinel3-data
    
  • 创建用于 redis 通信的专属 bridge

    docker network create --driver bridge --subnet 172.16.0.0/24 --gateway 172.16.0.1 redis-bridge
    
  • 查看是否创建成功

    docker network ls
    

关于 docker 网络

参考文档:https://outmanzzq.github.io/2019/10/22/docker-network/

docker 默认有三个网络,可以通过 docker network ls 查看

NETWORK ID     NAME           DRIVER    SCOPE
9ac8281b182c   bridge         bridge    local
99abdb470354   host           host      local
8e983d1c7d86   none           null      local

Docker 内置这三个网络,运行容器时,你可以使用该 –network 标志来指定容器应连接到哪些网络;如果不指定,则docker默认使用--network=bridge

docker run --network=host
  • Host:与宿主机在同一个网络,没有独立IP;
  • None:该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。相当于关闭了容器的网络功能;
  • Bridge:容器连接到 docker0 虚拟网卡,通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信;

通过 ifconfig 可以查看到 docker0

在这里插入图片描述

在 bridge 模式下,连在同一网桥上的容器可以相互通信,本文的 docker 配置将基于 bridge 模式。

单个容器分开部署

启动 master

  • 创建主节点启动配置文件,vim /home/docker/redis-sentinel/redis-master.conf

    # redis-master.conf# 是否为守护进程
    daemonize no
    # 指定 redis 启动端口
    port 6379
    bind 0.0.0.0# 设置连接密码
    requirepass 123456
    # 从节点连接主节点时使用的密码
    masterauth 123456# 使用 aop 持久化
    appendonly yes
    
  • 启动 redis 镜像

    docker run -it -d --name redis-master \--net=redis-bridge \--ip 172.16.0.10 \-p 6379:6379 \-v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/master-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf# -it:允许在启动时附加终端查看日志或调试(如未配置 -d 时),但此处与 -d 共存,实际以守护模式运行,可能用于保留日志输出能力。
    # -d: 后台运行容器,返回容器 ID,不阻塞当前终端。
    # --name redis-master: 指定容器的名称
    # --network redis-bridge:指定容器启动网络,方便后续容器之间的通信
    # -p 6379:6379:端口映射,将宿主机 6379 端口映射到容器的 6379 端口
    # -v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf:挂载宿主机文件到容器内,将宿主机配置文件挂载至容器内 Redis 默认配置路径,覆盖镜像默认配置;修改宿主机配置后,重启容器即可生效。
    # -v /home/docker/redis-sentinel/master-data:/data:挂载宿主机目录到容器内的 /data 目录,Redis 持久化文件(如 dump.rdb)存储在宿主机目录,避免容器删除后数据丢失
    # redis:7.4.4:指定使用的 Docker 镜像及版本
    # redis-server /etc/redis/redis.conf:覆盖镜像默认的启动命令,指定 Redis 启动时加载的配置文件
    
  • 查看是否成功启动

    docker ps
    
  • 进入容器

    docker exec -it redis-master redis-cli -a 123456
    

启动 salve

  • 创建从节点启动配置文件,vim /home/docker/redis-sentinel/redis-salve1.conf

    # redis-salve1.conf# 是否为守护进程
    daemonize no
    # 指定 redis 启动端口
    port 6379
    bind 0.0.0.0# 设置连接密码
    requirepass 123456
    # 从节点连接主节点时使用的密码
    masterauth 123456# 使用 aop 持久化
    appendonly yes# 指定主节点的IP和端口,使用容器名称即可
    replicaof redis-master 6379
    
  • 启动从节点镜像

    docker run -it -d --name redis-salve1 \--network redis-bridge \--ip 172.16.0.11 \-p 6479:6379 \-v /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve1-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
    
  • 查看是否启动成功

    docker ps
    
  • 进入从容器,尝试 set 会被拒绝

    docker exec -it redis-salve1 redis-cli -a 123456
    

    在这里插入图片描述

  • 验证是主从是否成功

    docker exec redis-master redis-cli -a 123456 INFO replication
    

启动第二个从节点

  • 创建从节点启动配置文件,vim /home/docker/redis-sentinel/redis-salve2.conf

    # redis-salve2.conf# 是否为守护进程
    daemonize no
    # 指定 redis 启动端口
    port 6379
    bind 0.0.0.0# 设置连接密码
    requirepass 123456
    # 从节点连接主节点时使用的密码
    masterauth 123456# 使用 aop 持久化
    appendonly yes# 指定主节点的IP和端口,使用容器名称即可
    replicaof 172.16.0.10 6379
    
  • 启动从节点镜像

    docker run -it -d --name redis-salve2 \--network redis-bridge \--ip 172.16.0.12 \-p 6579:6379 \-v /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve2-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
    

启动 sentinel

  • 创建 sentinel 配置文件,vim /home/docker/redis-sentinel/redis-sentinel.conf

    # redis-sentinel.conf# 端口号
    port 26379daemonize no# 启用主机名解析
    sentinel resolve-hostnames yes
    # 监控主节点,2 个 Sentinel 同意即触发故障转移
    sentinel monitor mymaster redis-master 6379 2
    # 主节点密码
    sentinel auth-pass mymaster 123456
    # 5 秒无响应视为下线
    sentinel down-after-milliseconds mymaster 5000
    
  • 启动sentinel1

    docker run -it -d --name redis-sentinel1 \--network redis-bridge \--ip 172.16.0.20 \-p 26379:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel1-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    
  • 启动另外两个 sentinel,只需要修改映射端口和容器名称

    docker run -it -d --name redis-sentinel2 \--network redis-bridge \--ip 172.16.0.21 \-p 26479:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel2-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    
    docker run -it -d --name redis-sentinel3 \--network redis-bridge \--ip 172.16.0.22 \-p 26579:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel3-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    

验证

  • 检测主从状态

    docker exec -it redis-master redis-cli -a 123456 INFO replication
    

    在这里插入图片描述

  • 查看 Sentinel 监控

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
    

docker compose 部署

按照上述步骤,可以完整的部署 docker sentinel 集群,但是需要一个个启动和配置容器,比较麻烦,因此可以通过 docker compose 来简化操作。

配置文件使用前边单个容器部署中的配置。

  • 新建 docker compose 配置文件,vim /home/docker/redis-sentinel/docker-compose.yml

    networks:redis-bridge:  # 自定义网络,确保容器互通external: truename: redis-bridgeservices:# 主节点redis-master:image: redis:7.4.4container_name: redis-mastercommand: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.10volumes:- /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/master-data:/dataports:- "6379:6379"# 从节点(2个)redis-slave1:image: redis:7.4.4container_name: redis-slave1command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.11depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve1-data:/dataports:- "6479:6379"redis-slave2:image: redis:7.4.4container_name: redis-slave2command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.12depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve2-data:/dataports:- "6579:6379"# Sentinel节点(3个)redis-sentinel1:image: redis:7.4.4container_name: redis-sentinel1command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.20volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel1-data:/dataports:- "26379:26379"redis-sentinel2:image: redis:7.4.4container_name: redis-sentinel2command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.21volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel2-data:/dataports:- "26479:26379"redis-sentinel3:image: redis:7.4.4container_name: redis-sentinel3command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.22volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel3-data:/dataports:- "26579:26379"
    
  • 启动集群

    docker compose up -d
    
  • 查看容器启动情况

    docker ps
    
  • 进入 master 验证

    docker exec -it redis-master redis-cli -a 123456
    
  • 主从复制验证

    docker exec -it redis-master redis-cli -a 123456 INFO replication
    
  • 查看 sentinel 状态

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
    
  • 批量 停止/启动/重起 容器

    docker compose stop|start|restart
    # 也可以停止指定容器
    docker compose stop|start|restart redis-salve2
    
  • 清理并重起服务

    docker compose stop
    docker compose rm -f
    docker compose
    

测试故障转移

  • 查看原始主节点信息

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
    

    在这里插入图片描述

  • 停止主节点

    docker stop redis-master
    
  • 通过容器查看是否成功停止

    docker ps
    

    在这里插入图片描述

  • 等待10s后,再通过 sentinel 查看是否切换为新的主节点

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
    

    在这里插入图片描述

  • 登录到该从节点确认是否可以执行写入操作

    docker exec -it redis-salve2 redis-cli -a 123456
    

    在这里插入图片描述

  • 最后,再重新启动 redis-master 节点,确认是否加入集群

    docker restart redis-master
    

r ps


[外链图片转存中...(img-gimuVGTV-1751711594422)]- 等待10s后,再通过 sentinel 查看是否切换为新的主节点```bash
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

[外链图片转存中…(img-OWCrEdIU-1751711594422)]

  • 登录到该从节点确认是否可以执行写入操作

    docker exec -it redis-salve2 redis-cli -a 123456
    

    [外链图片转存中…(img-abF4A76f-1751711594422)]

  • 最后,再重新启动 redis-master 节点,确认是否加入集群

    docker restart redis-master
    

    在这里插入图片描述

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

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

相关文章

Java线程中的守护线程

Java线程中的守护线程在Java中,守护线程(Daemon Thread)是一种特殊类型的线程,它在后台运行,主要用于支持其他线程(如用户线程)的工作。守护线程不会阻止JVM(Java虚拟机)…

Flink-状态恢复-isRestore分析

isRestored 方法返回值依赖 restoredCheckpointId 是否为空:restoredCheckpointId 在算子状态句柄(StreamOperatorStateHandler)中从 StreamOperatorStateContext 获取并赋值给 StateInitializationContext(该 context 就是 initi…

rk3128 emmc显示剩余容量为0

机器emmc 容量显示异常,显示剩余容量为0,这时候做了一个让 系统不检测GPP分区部分的操作,此问题才得以解决,如下: system/vold/DirectVolume.cpp -33,6 33,8 #include "VolumeManager.h"#include "Re…

WebAssembly国际化多语种支持

icu linux数据裁剪 先linux编译出所有的工具 mkdir build && cd build ../configure --prefix=$(pwd)/build_wasm/install --enable-static --disable-shared --with-data-packaging=static --enable-tools=yes --enable-extras=yes --e…

Ubuntu 安装 etcd 与 etcd-cpp-apiv3

目录 安装 etcd 安装 etcd-cpp-apiv3 安装 etcd sudo apt update sudo apt install etcd-server sudo apt install -y etcd-client 在 /etc/default/etcd 配置文件中配置,下面示例是单个服务器内进程之间交换信息且只有一个etcd节点。 #节点名称,默认为…

Spring Boot 集成 GeoTools 详解

目录 一、概述二、集成优势三、集成步骤四、使用场景五、案例:周边设施查询系统六、注意事项七、总结 一、概述 什么是 Spring Boot? Spring Boot 是由 Pivotal 团队开发的基于 Spring 框架的快速开发工具,它通过自动配置、起步依赖等特性简…

基础知识:mysql-connector-j依赖

mysql-connector-j 是 MySQL 官方提供的 Java 数据库连接驱动(JDBC Driver),用于在 Java 应用程序中连接和操作 MySQL 数据库。它是 MySQL 8.0 版本之后的标准驱动名称,替代了旧的 mysql-connector-java。 一、新旧版本对比 驱动…

vscode remote-ssh 拓展免密访问 linux虚拟机

前置步骤,在linux安装好ssh并且win可以使用密码登录linux sudo apt install openssh-server -y 在win上检查密钥是否存在 检查公钥和私钥cat ~/.ssh/id_rsa.pubcat ~/.ssh/id_rsa 如果不存在,重新生成 ssh-keygen -t rsa -b 4096 重新执行 cat ~/.ssh/…

动手学深度学习-学习笔记【二】(基础知识)

文章目录 1、概述2、课程学习2.1、深度学习介绍2.2、安装2.3、数据操作2.4、数据预处理2.5、线性代数2.6、微积分2.7、自动微分2.8、概率2.8.1、基本概率论2.8.2、处理多个随机变量2.8.3、期望和方差 2.9、查阅文档 1、概述 本篇博客用来记录我学习深度学习的学习笔记&#xf…

瑞盟MS4554N/MS4554N1双向电平转换器重新定义混合电压系统连接

在电子设备的“心脏”——电路系统里,不同功能模块常因性能需求差异,采用差异化的供电电压:传感器用1.8V低功耗运行,主控芯片选3.3V高效处理,传统接口保留5V稳定传输……当这些“电压孤岛”需要互联时,一个…

二叉树题解——验证二叉搜索树【LeetCode】后序遍历

98. 验证二叉搜索树 一、算法逻辑(逐步通顺讲解每一步思路) 这段算法使用了一种递归的思路: 每个节点返回它所在子树的 最小值和最大值,并在返回的过程中检查 BST 的合法性。 ✅ 1️⃣ 定义递归函数 dfs(node),其含…

Flink-Source算子点位提交问题(Earliest)

背景 最近在做 Flink 任务数据源切换时遇到 offset 消费问题,遂写篇文章记录下来。 切换时只修改了 source 算子的 topic,uid 等其他信息保持不变: 发布时,发现算子的消费者点位重置为earliest,导致消息积压。消息积…

如何录制带备注的演示文稿(LaTex Beamer + Pympress)

参考文献: Pympress 官网Avidemux 官网Audacity 官网FFmpeg 官网2025年度25大视频剪辑软件推荐2025最新音频降噪软件盘点,从入门到专业的6个高效工具如何用一段音频替换mp4视频格式的原有音频?免费简单易用的视频剪切编辑工具—AvidemuxFFmp…

VS Code 的 Copilot Chat 扩展程序

安装与启用 Copilot Chat 扩展 在 VS Code 中打开扩展市场(快捷键 CtrlShiftX 或点击左侧活动栏的扩展图标)。搜索“GitHub Copilot Chat”,点击安装。安装完成后需登录 GitHub 账户并授权 Copilot 权限。确保已订阅 GitHub Copilot 服务&am…

bash 脚本比较 100 个程序运行时间,精确到毫秒,脚本

脚本如下: #!/bin/bash# 设置测试次数 NUM_TESTS100 # 设置要测试的程序路径 PROGRAM"./your_program" # 替换为你的程序路径 # 设置程序参数(如果没有参数则留空) ARGS"" # 例如: "input.txt output.txt"#…

【Linux学习】Linux安装并配置Redis

安装Redis在Linux系统上安装Redis可以通过包管理器或源码编译两种方式进行。以下是两种方法的详细步骤。使用包管理器安装Redis(以Ubuntu为例):sudo apt update sudo apt install redis-server通过源码编译安装Redis:wget https:/…

redis每种数据结构对应的底层数据结构原理

Redis 的每种数据结构(String、List、Hash、Set、Sorted Set)在底层都采用了不同的实现方式,根据数据规模和特性动态选择最优的编码(encoding)以节省内存和提高性能。以下是详细原理分析: 1. String(字符串) 底层实现: int:当存储整数值且可用 long 表示时,直接使用…

WPF控件大全:核心属性详解

WPF常用控件及核心属性 以下是WPF开发中最常用的控件及其关键属性(按功能分类): 基础布局控件 Grid(网格布局) RowDefinitions:行定义集合(如Height"Auto")ColumnDefinit…

马斯克脑机接口(Neuralink)技术进展,已经实现瘫痪患者通过BCI控制电脑、玩视频游戏、学习编程,未来盲人也能恢复视力了

目录 图片总结文字版总结1. 核心目标与愿景1.1 增强人类能力1.2 解决脑部疾病1.3 理解意识1.4 应对AI风险 2. 技术进展与产品2.1 Telepathy(意念操控)功能与目标技术细节参与者案例 2.2 Blindsight(视觉恢复)**功能与目标**技术细…

Vuex身份认证

虽说上一节我们实现了登录功能,但是实际上还是可以通过浏览器的地址来跳过登录访问到后台,这种可有可无的登录功能使得系统没有安全性,而且没有意义 为了让登录这个功能有意义,我们应该: 应当在用户登录成功之后给用户…