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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 关于redis的一主三从三哨兵的实现


前言

当谈到数据库管理系统时,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

2️⃣:关于network的区别

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
运维 监控 NoSQL
Redis Sentinel哨兵模式部署
Redis Sentinel哨兵模式部署
111 2
|
1月前
|
监控 NoSQL 算法
Redis Sentinel(哨兵)详解
Redis Sentinel(哨兵)详解
100 4
|
2月前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
3月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
5月前
|
监控 NoSQL Java
redis哨兵架构
不过为了高可用一般都推荐至少三个哨兵节点。为什么推荐奇数个哨兵节点跟集群奇数个master节点类似。
42 0
redis哨兵架构
|
4月前
|
消息中间件 监控 NoSQL
Redis哨兵改集群
【7月更文挑战第7天】
|
4月前
|
缓存 NoSQL Redis
Redis复制、哨兵
Redis复制、哨兵
44 0
|
5月前
|
存储 监控 NoSQL
Redis系列学习文章分享---第十二篇(搭建哨兵集群+RedisTemplate连接哨兵+搭建分片集群+-散列插槽+集群伸缩 +故障转移+RedisTemplate访问分片集群)
Redis系列学习文章分享---第十二篇(搭建哨兵集群+RedisTemplate连接哨兵+搭建分片集群+-散列插槽+集群伸缩 +故障转移+RedisTemplate访问分片集群)
241 0
|
5月前
|
监控 NoSQL Redis
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?
下一篇
无影云桌面