关于redis的一主三从三哨兵的实现

news2025/2/24 8:33:48

关于redis的一主三从三哨兵的实现

  • 前言
  • docker相关的
  • docker-compose.yml
  • sentinel.conf
  • 重点解释一下上面的语句

前言

当谈到数据库管理系统时,Redis就像是那个充满魔法的巫师,能够让你的应用程序变得更快、更可靠,就像是施了魔法一样。而今天,我们将进入Redis的神奇世界,探索一种有趣而强大的架构——一主三从三哨兵(One Master, Three Slaves, Three Sentinels)。

在这个故事中,主节点是我们的英雄,它是数据的守护者,负责处理所有的写入操作。三个从节点则是主节点的忠实追随者,他们时刻准备好学习主节点的一切,并在需要时出手相助。而哨兵们则像是这个神奇世界的守护者,他们负责监控、保护主节点,以确保它永远不会倒下。

这个故事将引领我们深入Redis的奥秘,揭示一主三从三哨兵架构的神奇之处。我们将一起探索如何配置、管理和维护这个强大的架构,使你的应用程序在任何情况下都能够如临大敌,稳步前行。

所以,准备好进入Redis的神奇世界吧,让我们一起开始这段有趣而令人兴奋的冒险之旅!

【说明】使用的是docker-compose搭建的

docker相关的

1️⃣:关于虚拟网络docker0,对于mac来说它依靠的是docker desktop,然而它并没有这个docker0了。所以我们的主机并不能直接去访问docker中的容器ip。

https://docs.docker.com/desktop/networking/#i-cannot-ping-my-containers

image-20230826170531637

2️⃣:关于network的区别

  1. Bridge 模式:
    • 默认网络模式。
    • 创建一个本地的虚拟网络,使容器可以相互通信,同时又与主机隔离。
    • 容器可以通过容器名或 IP 地址进行通信。
    • 容器可以使用映射端口与外部通信。
  2. Host 模式:
    • 容器共享主机的网络命名空间。
    • 容器与主机共享 IP 地址和端口,可以直接使用主机的网络资源。
    • 容器与主机之间网络隔离较小,但也可能导致网络冲突或不稳定性。
  3. None 模式:
    • 容器不加入任何网络,完全与外部网络隔离。
    • 适用于一些特殊用例,如需要在容器内执行某些隔离的网络任务。
  4. Overlay 模式:
    • 用于在多个 Docker 宿主机上创建跨主机的虚拟网络,例如在集群环境中。
    • 可以在不同主机上的容器之间建立通信,即使这些容器位于不同的宿主机上。
  5. Macvlan 模式:
    • 允许为容器分配与主机网络接口相对应的 MAC 地址。
    • 容器可以拥有自己的 MAC 地址,就像实际物理机器一样。
  6. Bridge-Network 模式:
    • 在用户定义的 Docker 网络上创建连接的容器。
    • 用户可以通过设置网络选项来控制容器之间的通信和隔离。

【警告】 这里即使我们创建的是桥接的网络,也实现不了容器和主机互通的,但是在centos下可以,使用host模式这里我也尝试了,还是不行,我最后发现host模式下它询到的主机是docker desktop中的ip,也就是127.0.0.1是相对于docker desktop而不是你的主机

docker-compose.yml

version: '3'

services:
  # Redis 主节点配置
  redis-master:
    image: myredis:latest
    container_name: redis-master
    ports:
      - "6399:6379" # 将主节点的6379端口映射到宿主机的6379端口
    command: redis-server --appendonly yes --save 900 1 --save 300 10 --save 60 10000
    volumes:
      - ./data/master:/data # 将主节点的数据持久化到宿主机的./data/master目录
    networks:
      - redis-network

  # Redis 从节点1配置
  redis-slave-1:
    image: myredis:latest
    container_name: redis-slave-1
    ports:
      - "6398:6379"
    command: redis-server --slaveof redis-master 6379 # 设置从节点1为主节点的从节点
    volumes:
      - ./data/slave-1:/data # 将从节点1的数据持久化到宿主机的./data/slave-1目录
    networks:
      - redis-network
    extra_hosts:
      - "host.docker.internal:192.168.1.75"  # 设置自定义网络别名

  # Redis 从节点2配置
  redis-slave-2:
    image: myredis:latest
    container_name: redis-slave-2
    ports:
      - "6397:6379"
    command: redis-server --slaveof redis-master 6379 # 设置从节点2为主节点的从节点
    volumes:
      - ./data/slave-2:/data # 将从节点2的数据持久化到宿主机的./data/slave-2目录
    networks:
      - redis-network
    extra_hosts:
      - "host.docker.internal:192.168.1.75"  # 设置自定义网络别名

  # Redis 从节点3配置
  redis-slave-3:
    image: myredis:latest
    container_name: redis-slave-3
    ports:
      - "6396:6379"
    command: redis-server --slaveof redis-master 6379  # 设置从节点3为主节点的从节点
    volumes:
      - ./data/slave-3:/data # 将从节点3的数据持久化到宿主机的./data/slave-3目录
    networks:
      - redis-network
    extra_hosts:
      - "host.docker.internal:192.168.1.75"  # 设置自定义网络别名

  # Redis 哨兵配置
  sentinel-1:
    image: myredis:latest
    container_name: redis-sentinel-1
    ports:
      - "26379:26379"
    command: redis-sentinel /sentinel.conf # 启动哨兵服务并加载sentinel.conf配置
    volumes:
      - ./sentinel.conf:/sentinel.conf # 将哨兵的配置文件挂载到容器中
      - ./redis.conf:/redis.conf # 添加 Redis 配置文件挂载
      - ./sentinel-logs-1:/var/log # 挂载哨兵的日志目录
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
      - redis-slave-3
    networks:
      - redis-network

  # Redis 哨兵配置
  sentinel-2:
    image: myredis:latest
    container_name: redis-sentinel-2
    ports:
      - "26378:26379"
    command: redis-sentinel /sentinel.conf # 启动哨兵服务并加载sentinel.conf配置
    volumes:
      - ./sentinel.conf:/sentinel.conf # 将哨兵的配置文件挂载到容器中
      - ./redis.conf:/redis.conf # 添加 Redis 配置文件挂载
      - ./sentinel-logs-2:/var/log # 挂载哨兵的日志目录
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
      - redis-slave-3
    networks:
      - redis-network
  # Redis 哨兵配置
  sentinel-3:
    image: myredis:latest
    container_name: redis-sentinel-3
    command: redis-sentinel /sentinel.conf # 启动哨兵服务并加载sentinel.conf配置
    volumes:
      - ./sentinel.conf:/sentinel.conf # 将哨兵的配置文件挂载到容器中
      - ./redis.conf:/redis.conf # 添加 Redis 配置文件挂载
      - ./sentinel-logs-3:/var/log # 挂载哨兵的日志目录
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
      - redis-slave-3
    networks:
      - redis-network
networks:
  redis-network:
    driver: bridge


【说明】如果想用host模式,可以直接将networks删除掉,然后在各个配置中的command中加入port 指定的端口,如下图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sentinel.conf

# 哨兵监控的主节点名称,后面的参数2代表的是quorum,表示需要两个哨兵的时候才可以进行故障转移
sentinel monitor mymaster 127.0.0.1 6399 2

# 哨兵配置文件的名称
sentinel config-epoch mymaster 0

# 哨兵当前的配置版本号
sentinel leader-epoch mymaster 0

# 选举超时时间
sentinel down-after-milliseconds mymaster 5000

# 故障判定下线阈值和判定上线阈值
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

重点解释一下上面的语句

redis-server --appendonly yes --save 900 1 --save 300 10 --save 60 10000

  • --appendonly yes:

这个参数用于启用 Redis 的持久化方式中的"Append Only File"(AOF)机制。
当 AOF 启用时,Redis 会将每个写操作追加到一个文件中,以便在服务器重新启动时重放这些操作,从而达到数据持久化的目的。

  • --save 900 1 --save 300 10 --save 60 10000:

这个参数用于配置 Redis 数据快照的条件。
每个 --save 参数指定一个时间(以秒为单位)和一个更改的键数阈值。
在指定的时间内,如果更改的键数达到指定的阈值,Redis 就会触发一个数据快照,将当前内存中的数据保存到磁盘中。
在这个例子中,有三个 --save 参数:
如果在 900 秒内有至少 1 个键被更改,就触发一次数据快照。
如果在 300 秒内有至少 10 个键被更改,就触发一次数据快照。
如果在 60 秒内有至少 10000 个键被更改,就触发一次数据快照。

【说明】这里为什么要使用AOF和RDB呢,其实也是可以只使用默认的RDB模式的,但是如果想实现更加好的持久化,可以使用AOF+RDB,也就是在两个RDB直接加入AOF

sentinel monitor mymaster 127.0.0.1 6399 2

  1. sentinel:表示这是 Redis Sentinel 的配置。
  2. monitor mymaster:这是一个指令,用于告诉 Sentinel 要监控一个名为 “mymaster” 的主节点。
  3. 127.0.0.1:这是主节点的 IP 地址或主机名。在这里,它设置为 127.0.0.1,意味着主节点是在本地(同一台机器)上运行。
  4. 6399:这是主节点的端口号。在这个例子中,主节点的 Redis 服务监听在端口 6399。
  5. 2:这是一个故障判断的配置参数,表示 Sentinel 在判断主节点是否宕机时需要多少个 Sentinel 同意。如果 Sentinel 发现主节点失效,至少有 2 个 Sentinel 同意认为主节点宕机,才会执行故障转移操作。

【注意】这里的2是最少2个Sentinel同意才行,一般的哨兵是3,5,7,

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

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

相关文章

HONEYWELL 05704-A-0145

HONEYWELL 05704-A-0145电源模块通常用于为其他设备或系统提供电力供应,以确保它们正常运行。HONEYWELL 05704-A-0145电源模块的应用领域可以非常广泛,包括但不限于以下几个领域: 工业自动化:HONEYWELL 05704-A-0145电源模块用于工…

NEON优化:性能优化经验总结

NEON优化:性能优化经验总结 1. 什么是 NEONArm Adv SIMD 历史 2. 寄存器3. NEON 命名方式4. 优化技巧 Reference: NEON优化:性能优化经验总结NEON官方内联函数Arm NEON programming quick referenceLearn the architecture - Neon programmers’ guide …

Windows server 2022(2023年9月 映像更新 - 20348.1970)安装测试

本文记录了Windows server 2022(2023年9月 映像更新 - 20348.1970)的安装测试过程。 一、检查ISO 简体中文 - Windows Server 2022(2023年9月更新 - 20348.1970) 内含版本(Windows Server 2022 Standard、Windows Server 2022 Standard (D…

期权定价模型系列【6】:欧式期权、百慕大期权、美式期权的定价模型与对比【蒙特卡洛模拟、二叉树模型】

期权定价模型系列第6篇文章 1. 前言 对于欧式期权,最常用的是BS模型,此外,也可也用蒙特卡洛模拟方法求解欧式期权的价格。当然,对于美式期权,也同样可以用蒙特卡洛模拟方法来求解,一般对美式更多用的是二叉…

Kubernetes(K8s):未来云原生应用的引擎

文章目录 Kubernetes的核心概念和架构为什么K8s是构建云原生应用的首选工具?云原生应用的好处和挑战容器编排的重要性:Docker和KubernetesKubernetes生态系统:核心组件和附加工具实际应用:企业如何在生产环境中使用K8s未来展望&am…

基于大语言模型扬长避短架构服务

秘诀: 扬泛化之长, 避时延之短

Linux socket 字节序

socket介绍 字节序 验证什么字节序 #include<stdio.h> int main() {union {short value;char btypes[sizeof(short)];} test;test.value 0x0102;if(test.btypes[0] 1 && test.btypes[1] 2) {printf("大端字节序\n");}else{printf("小端字节序…

postman的使用

感觉自己对于postman 的使用其实还是入门级别的 因为新公司的都是微服务调用所以需要使用本地postman进行调用。 接口大概是这个样子&#xff0c;截图的最下面就是接口的具体情况了 首先看PostMapping判断是否是get或者post 然后RequestHeader参数就是为了在postman中添加head…

安卓玩机-----教你修改微信的启动图 让心中的“她“成为微信沟通的第一屏【仅供参考】

微信已经成为我们生活中必不可少的安装必装软件之一。但单调的启动第一屏让人感到乏味。那么今天只给大家做个教程演示是怎么修改这个启动第一屏、其实任何的app都可以进行修改图标 启动界面等等的操作。需要替换的图片可以任意选择&#xff0c;我前面很多博文介绍过apk的反编译…

Mac 电脑查看本地maven,及私有仓库的搭建与使用【nexus的配置与使用】

查看本地maven 查看状态如果要查看本地maven&#xff0c;使用命令行&#xff1a; mvn help:effective-settings 如下如localRepository标签 nexus下载 官网地址 解压后如下图 启动服务器/停止服务器 bin 目录下 执行命令&#xff1a; ./nexus start 如下图表面启动成功…

java常用API(Math,System,Runtime)

Math Math的常用方法 package myMath;public class myMath {public static void main(String[] args) {System.out.println(Math.abs(-99));//这个表示取绝对值的 打印结果为99//但是他有个bug.int最大取值范围是-2,147,483,648 到2,147,483,647System.out.println(Math.abs(-…

经典垃圾回收器

Serial收集器 Serial 是一种新生代的收集器。顾名思义“serial 串行”&#xff0c;它是一种单线程工作的收集器&#xff0c;它的“单线程”并不仅仅指的只有一个处理器或一个线程来实现垃圾的收集工作&#xff0c;更重要的是他在垃圾收集的过程中会暂停所有的用户线程&#xf…

算法通过村第九关-二分(中序遍历)黄金笔记|手撕二分

文章目录 前言1. 基本查找2. 二分查找与分治2.1 循环的方式2.2 递归的方式 3. 元素中的重复的二分查找总结 前言 提示&#xff1a;有些人&#xff0c;远看是灯塔&#xff0c;靠近是悬崖。 --任明信《别人》 二分查找是非常重要的算法之一&#xff0c;不仅要掌握&#xff0c;更要…

印章篆刻小程序商城的作用是什么

印章的需求度也有很高市场需求&#xff0c;处理办公印章外&#xff0c;还有艺术类的&#xff0c;而对爱好者来说&#xff0c;需要找到一家靠谱的品牌制作&#xff0c;包括材料、样式、内容等都有较高要求&#xff0c;线上可以接触到更多雕刻商家。 而对品牌来说&#xff0c;需…

常见应用层协议

一.HTTP&#xff08;超文本传输协议&#xff09; HTTP 和 HTTPS 二.FTP&#xff08;文件传输协议&#xff09; 三.SMTP&#xff08;简单邮件传输协议&#xff09; 四.POP3&#xff08;邮局协议版本3&#xff09; 五.IMAP&#xff08;互联网消息访问协议&#xff09; 六.DNS&am…

GitHub 基本操作

目录 1、创建库 2、上传项目 3、获取token 4、 删除库 1、创建库 登录github&#xff0c;点击“Create repository”创建库&#xff0c;点击右上方绿色的“New”&#xff0c;Repository name处填写你的项目名&#xff0c;可选“Add a README file"默认创建一个说明文…

基于SSM的保险业务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

480万商品,如何架构商品治理平台?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿高薪&#xff0c;完成架构的升级&#xff0c;进入架构师赛道&#xff0c;打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…

Fortinet 2023上半年全球威胁态势研究报告:勒索软件检测成下降趋势,针对性攻击持续升温

近日&#xff0c;专注于推动网络与安全融合的全球网络安全领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;发布《2023上半年全球威胁态势研究报告》。报告显示&#xff0c;2023 年上半年勒索软件检出数量继续下降、高级持续性威胁&#xff08;APT&a…

机器人中的数值优化|【六】线性共轭梯度法,牛顿共轭梯度法

机器人中的数值优化|【六】线性共轭梯度法&#xff0c;牛顿共轭梯度法 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化…