当前位置: 首页 > news >正文

Linux使用docker搭建Redis 哨兵模式

1. Redis Sentinel 简介

Redis Sentinel 是 Redis 高可用解决方案的一部分。它提供了监控、通知和自动故障转移功能,确保 Redis 集群在主节点发生故障时仍然可以继续工作。以下是 Redis Sentinel 的主要功能和作用:
监控: Sentinel 会不断检查每个 Redis 主节点和从节点的运行状态,以确保它们正常工作。
通知: 如果 Redis 实例出现故障,Sentinel 会通知系统管理员或其他应用程序,告知故障情况。
自动故障转移: 当主节点发生故障时,Sentinel 会将其中一个从节点提升为新的主节点,并通知其他从节点更新它们的配置,从而完成故障转移。
配置提供者: Sentinel 可以作为客户端的配置提供者,向客户端提供当前主节点的信息,以确保客户端能够始终连接到主节点。

2. Sentinel 配置示例

以下是一个典型的 Sentinel 配置文件示例:

port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster yourpassword
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000

  • port 26379:指定 Sentinel 监听的端口。
  • sentinel monitor mymaster 127.0.0.1 6379 2
    • mymaster 是主节点的名称,可以自定义。
    • 127.0.0.1 是主节点的 IP 地址或主机名。
    • 6379 是主节点的端口。
    • 2 是 Sentinel 判断主节点失效所需的最小 Sentinel 数量。
  • sentinel auth-pass mymaster yourpassword:设置访问主节点的密码。
  • sentinel down-after-milliseconds mymaster 5000:如果主节点在 5000 毫秒内没有响应,Sentinel 会认为它已下线。
  • sentinel parallel-syncs mymaster 1:在故障转移期间,同时可以有多少个从节点与新的主节点进行同步。
  • sentinel failover-timeout mymaster 60000:设置故障转移操作的超时时间为 60000 毫秒。

3. 使用 Docker 和 Docker Compose 来配置 Redis 哨兵模式

1. 创建目录结构

redis-sentinel/
├── docker-compose.yml
├── master/
│   ├── redis.conf
├── slave1/
│   ├── redis.conf
├── slave2/
│   ├── redis.conf
├── sentinel/
    ├── sentinel.conf

2. 配置 Redis 主服务器和从服务器

master/redis.conf 中配置主服务器:

port 6379
bind 0.0.0.0
daemonize no
requirepass m123456
save 900 1
save 300 10
save 60 10000
dir /data
appendonly yes
appendfilename "myappendonly.aof"
appendfsync everysec
dbfilename mydump.rdb

slave1/redis.confslave2/redis.conf 中配置从服务器:

port 6379
bind 0.0.0.0
daemonize no
requirepass m123456
save 900 1
save 300 10
save 60 10000
dir /data
appendonly yes
appendfilename "myappendonly.aof"
appendfsync everysec
dbfilename mydump.rdb
replicaof redis-master 6379
masterauth m123456

3. 配置 Redis 哨兵

sentinel/sentinel.conf 中配置哨兵:

port 26379
daemonize no
sentinel monitor mymaster 172.20.0.2 6379 2
sentinel auth-pass mymaster m123456
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000

4. 创建 docker-compose.yml

编写 docker-compose.yml 文件:

version: '3.3'

services:
  redis-master:
    image: redis:latest
    container_name: redis-master
    hostname: redis-master
    ports:
      - "8001:6379"
    volumes:
      - ./master/redis.conf:/usr/local/etc/redis/redis.conf
      - ./master/data:/data
    networks:
      redis-network:
        ipv4_address: 172.20.0.2
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

  redis-slave1:
    image: redis:latest
    container_name: redis-slave1
    hostname: redis-slave1
    depends_on:
      - redis-master
    ports:
      - "8002:6379"
    volumes:
      - ./slave1/redis.conf:/usr/local/etc/redis/redis.conf
      - ./slave1/data:/data
    networks:
      redis-network:
        ipv4_address: 172.20.0.3
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

  redis-slave2:
    image: redis:latest
    container_name: redis-slave2
    hostname: redis-slave2
    depends_on:
      - redis-master
    ports:
      - "8003:6379"
    volumes:
      - ./slave2/redis.conf:/usr/local/etc/redis/redis.conf
      - ./slave2/data:/data
    networks:
      redis-network:
        ipv4_address: 172.20.0.4
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

  sentinel1:
    image: redis:latest
    container_name: redis-sentinel1
    hostname: redis-sentinel1
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    ports:
      - "26379:26379"
    volumes:
      - ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis-network:
        ipv4_address: 172.20.0.5
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]

  sentinel2:
    image: redis:latest
    container_name: redis-sentinel2
    hostname: redis-sentinel2
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    ports:
      - "26380:26379"
    volumes:
      - ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis-network:
        ipv4_address: 172.20.0.6
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]

  sentinel3:
    image: redis:latest
    container_name: redis-sentinel3
    hostname: redis-sentinel3
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    ports:
      - "26381:26379"
    volumes:
      - ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis-network:
        ipv4_address: 172.20.0.7
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]

networks:
  redis-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

5. 启动服务

redis-sentinel 目录下,运行以下命令启动 Redis 和 Sentinel 服务:

[root@icoolkj redis-sentinel]# docker-compose up -d
Creating network "redis-sentinel_redis-network" with driver "bridge"
Creating redis-master ... done
Creating redis-slave1 ... done
Creating redis-slave2 ... done
Creating redis-sentinel2 ... done
Creating redis-sentinel3 ... done
Creating redis-sentinel1 ... done

6. 检查服务状态

确保所有容器都已启动并正常运行:

[root@icoolkj redis-sentinel]# docker-compose ps
     Name                    Command               State                 Ports               
---------------------------------------------------------------------------------------------
redis-master      docker-entrypoint.sh redis ...   Up      0.0.0.0:8001->6379/tcp            
redis-sentinel1   docker-entrypoint.sh redis ...   Up      0.0.0.0:26379->26379/tcp, 6379/tcp
redis-sentinel2   docker-entrypoint.sh redis ...   Up      0.0.0.0:26380->26379/tcp, 6379/tcp
redis-sentinel3   docker-entrypoint.sh redis ...   Up      0.0.0.0:26381->26379/tcp, 6379/tcp
redis-slave1      docker-entrypoint.sh redis ...   Up      0.0.0.0:8002->6379/tcp            
redis-slave2      docker-entrypoint.sh redis ...   Up      0.0.0.0:8003->6379/tcp            
[root@icoolkj redis-sentinel]# 

7. 测试哨兵模式

可以通过停止 Redis 主服务器来测试哨兵模式:

[root@icoolkj redis-sentinel]# docker stop redis-master
redis-master
[root@icoolkj redis-sentinel]# 

此时,哨兵应该会检测到主服务器故障并将其中一个从服务器提升为新的主服务器。可以通过查看哨兵日志来确认故障转移是否成功:

[root@icoolkj redis-sentinel]# docker logs redis-sentinel1
......
1:X 08 Aug 2024 00:29:30.783 * +slave slave 172.20.0.2:6379 172.20.0.2 6379 @ mymaster 172.20.0.4 6379
1:X 08 Aug 2024 00:29:30.786 # Could not rename tmp config file (Device or resource busy)
1:X 08 Aug 2024 00:29:30.786 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 08 Aug 2024 00:29:35.831 # +sdown slave 172.20.0.2:6379 172.20.0.2 6379 @ mymaster 172.20.0.4 6379
[root@icoolkj redis-sentinel]# 

8. 配置持久化数据和日志

确保 Redis 数据和日志被持久化到本地,以防止容器重启时数据丢失。在 docker-compose.yml 文件中已经配置了持久化卷:

volumes:
  - ./master/data:/data
  - ./master/log:/var/log/redis

同样的配置适用于从服务器和哨兵。

这样,你就完成了使用 Docker Compose 配置 Redis 哨兵模式的步骤,并确保了数据和日志的持久化。 

===============================================

4. 常见问题

1. 查看容器日志以诊断问题

[root@icoolkj redis-sentinel]# docker-compose logs redis-slave1
......
redis-slave1    | 1:S 08 Aug 2024 00:42:42.019 * 1 changes in 900 seconds. Saving...
redis-slave1    | 1:S 08 Aug 2024 00:42:42.020 * Background saving started by pid 22
redis-slave1    | 22:C 08 Aug 2024 00:42:42.024 * DB saved on disk
redis-slave1    | 22:C 08 Aug 2024 00:42:42.024 * RDB: 2 MB of memory used by copy-on-write
redis-slave1    | 1:S 08 Aug 2024 00:42:42.121 * Background saving terminated with success
[root@icoolkj redis-sentinel]# 
 

2. 使用 docker inspect 查询容器的详细信息,并使用 grep 过滤网络信息

[root@icoolkj ~]# docker inspect redis-sentinel1 | grep -A 10 "Networks"
            "Networks": {
                "redis-sentinel_redis-network": {
                    "IPAMConfig": {
                        "IPv4Address": "172.20.0.5"
                    },
                    "Links": null,
                    "Aliases": [
                        "sentinel1"
                    ],
                    "MacAddress": "02:42:ac:14:00:05",
                    "NetworkID": "4c51ec0fd3d5c080f3b2414a87e2c029eed2bef88223d9983e4d6d6ac73dc9cc",
[root@icoolkj ~]# 

3. 遇到 Redis Sentinel 无法解析 redis-master 主机名的问题时

在 Sentinel 配置文件 sentinel.conf 中使用静态 IP 地址,而不是主机名。例如:

port 26379
daemonize no
sentinel monitor mymaster 172.20.0.2 6379 2

相关文章:

Linux使用docker搭建Redis 哨兵模式

1. Redis Sentinel 简介 Redis Sentinel 是 Redis 高可用解决方案的一部分。它提供了监控、通知和自动故障转移功能,确保 Redis 集群在主节点发生故障时仍然可以继续工作。以下是 Redis Sentinel 的主要功能和作用:监控: Sentinel 会不断检查…...

springboot给类进行赋初值的四种方式

目录 1. 使用Value和ConfigurationProperties2. 使用PropertySource创建Person.java写一个测试类 3. 使用ImportResourceStudent类创建beans.xml在主类中引入测试 其他心得 1. 使用Value和ConfigurationProperties 这里不加赘述了,前面我也发过,这里就放…...

Day32 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

语言 Java 1049. 最后一块石头的重量 II 最后一块石头的重量 II 题目 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 …...

linux 查看一个端口是否被占用

1 linux命令 要在Linux中查看一个端口是否被占用,可以按照以下步骤进行操作: 打开终端(Terminal)。 运行以下命令来列出系统上所有正在监听的端口及其对应的进程: sudo netstat -tuln | grep LISTEN这将显示所有正在…...

【Git】5. 配置 Git

配置.gitignore – 忽略特殊⽂件 在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让 Git 知道呢? 在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的…...

C语言:文件处理

文件处理 一、文件的类型(一)文本文件和二进制文件 (二)程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭(一)文件指针(二)文件的打开和关闭1、fopen2、fclose &…...

SpringBoot MybatisPlus selectOne的坑

目录 一、问题 二、问题解决 三、其他方法 一、问题 selectOne在查询多条数据时会报错,查询语句并不会加 limit 1。 One record is expected, but the query result is multiple records。 二、问题解决 在QueryWrapper上添加如下: QueryWrapper&…...

Spring源码-ClassPathXmlApplicationContext的refresh()都做了什么?

AbstractApplicationContext的refresh方法 /*** 用给定的父类创建一个新的ClassPathXmlApplicationContext* Create a new ClassPathXmlApplicationContext with the given parent,* 从给定的XML文件加载定义* loading the definitions from the given XML files.* param confi…...

网站加密和混淆技术简介

我们在爬取网站的时候,会遇到一些需要分析接口或 URL 信息的情况,这时会有各种各样类似加密的情况 1. 某个网站的URL 带有一些看不懂的长串加密字符,要抓取就必须懂的这些参数是怎么构造的,否则我们连完整的 URL 都构造不出来&am…...

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程,主要用途是为了日志采集,所以搭建相对比较简单暴力,不过也可以作为一个参考供大家学习,主打一个能用管跑(调优啊,参数解释啊,原理啊,太枯燥了&a…...

“Apple Intelligence”的“系统提示词”被曝光了

当 苹果的 Apple Intelligence 还未完全开放体验时,其提示词就已经曝光了。 苹果如何指挥 AI 干活,这次被泄露的非常彻底。我们就拿邮件来说,借助 AI,收发及回复邮件变得非常简单,但背后的逻辑是内置提示词在拿捏。 比…...

django学习-数据表操作

一、数据表操作 1. 数据新增 由模型实例化对象调用内置方法实现数据新增,比如单数据新增调用create,查询与新增调用get_or_create,修改与新增调用update_or_create,批量新增调用bulk_create。 1.1 create() # 方法一 # 使用cr…...

机器学习-决策树

决策树 决策树1. 简介2. ID3 决策树3. C4.5决策树4. CART决策树5. 决策树对比6. 正则化 剪枝 决策树 1. 简介 """ 简介一种树形结构树中每个内部节点表示一个特征的判断每个分支代表一个判断结果的输出每个叶节点代表一种分类结果建立过程1. 特征选择选取有较…...

opencascade TopoDS_Shape源码学习【重中之重】

opencascade TopoDS_Shape 前言 描述了一个形状,它 引用了一个基础形状,该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度&#xff…...

Self-study Python Fish-C Note15 P52to53

函数 (part 5) 本节主要讲函数文档、类型注释、内省、高阶函数 函数文档、类型注释、内省 (P52) 函数文档 函数是一种代码封装的方法,对于一个程序来说,函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的,更需要关注的…...

Java小白入门到实战应用教程-异常处理

Java小白入门到实战应用教程-异常处理 前言 我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况,它能打断了正常的程序执行流程。 而异常处理是一项至关重要的技术,它使得程序能够优雅地处理运行时错误,避免…...

使用Anaconda安装多个版本的Python并与Pycharm进行对接

1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示,我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单,直接安装即可: 3、设置conda.exe的…...

android系统中data下的xml乱码无法查看问题剖析及解决方法

背景: Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下: 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的,这些syste…...

​MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引

若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX.语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 ​二、实现思路 总体思路: 用户通过Gradio界面上…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...