Redis | 哨兵模式

Redis | 哨兵模式

1. 简介

Redis Sentinel(哨兵)是Redis提供的一种高可用性解决方案。它是一个独立的进程,用于监控和管理Redis主从模式的节点,并在主节点故障时自动进行故障转移。哨兵模式可以确保Redis集群的高可用性和数据一致性。

在哨兵模式中,有一个主节点(Master)和多个从节点(Slave),以及一个或多个哨兵(Sentinel)。主节点负责接收写操作和复制数据到从节点,而从节点负责复制主节点的数据。哨兵负责监控主节点和从节点的状态,并在主节点故障时自动将一个从节点提升为新的主节点。

以下是Redis哨兵模式的一些特点和工作原理:

  1. 哨兵选举:在启动时,每个哨兵都会对主节点进行投票选举,选出一个领头哨兵(Leader Sentinel)。领头哨兵负责协调故障转移过程。
  2. 监控:哨兵会定期检查Redis节点的健康状态,包括主节点和从节点的状态。如果发现主节点不可用,哨兵会触发故障转移。
  3. 故障转移:当主节点不可用时,领头哨兵会选出新的主节点,并通知其他哨兵和从节点进行切换。在故障转移期间,客户端的请求会被暂时拒绝,直到新的主节点选举完成。
  4. 数据一致性:在进行故障转移时,哨兵会确保新的主节点和从节点与旧的主节点数据保持一致。因此,即使主节点故障,数据不会丢失。

2. 配置

  1. 配置Redis主节点:

    在主节点的配置文件(redis.conf)中,设置requirepass选项为主节点的密码。例如:

    requirepass your_redis_password
    
  2. 配置Redis从节点:

    在从节点的配置文件(redis.conf)中,设置masterauth选项为主节点的密码,并使用replicaof选项将从节点连接到主节点。例如:

    masterauth your_redis_password
    replicaof <master-ip> <master-port>
    

    <master-ip><master-port>分别是主节点的IP地址和端口号。

  3. 配置Redis Sentinel:

    创建一个名为sentinel.conf的新文件,其中指定以下选项:

    bind *
    sentinel resolve-hostnames yes
    sentinel monitor mymaster <master-ip> <master-port> <quorum>
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 10000
    sentinel auth-pass mymaster <master-password>
    

    sentinel monitor中,mymaster是Redis实例的名称,<master-ip> <master-port>是主节点的IP地址和端口号,<quorum>是哨兵执行故障转移所需的最少哨兵数目。

    sentinel auth-pass配置了连接到主节点的密码,以便哨兵能够正确连接到Redis主节点。

  4. 启动Redis服务器和哨兵:

    首先,启动带密码的Redis主节点和从节点。然后,分别启动哨兵进程,并使用配置文件启动:

    redis-sentinel /path/to/sentinel.conf
    

3. 演示

注意:因为每启动redis都会修改sentinel.conf,如果之前测试过想重新开始测试,要将sentinel.conf内容恢复。

下面以1个主节点,2个从节点,1个哨兵节点演示。

文件树

hello-redis
├── docker-compose.yaml
└── sentinel
    └── sentinel.conf

文件

sentinel.conf

bind 127.0.0.1
sentinel resolve-hostnames yes
sentinel monitor mymaster 192.168.200.2 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel auth-pass mymaster 123456

docker-compose.yaml

yaml 复制代码
version: "3.8"
networks:
  network:
    ipam:
      driver: default
      config:
        - subnet: '192.168.200.0/24'
services:
  master:
    container_name: master
    image: redis:7.0
    networks:
      network:
        ipv4_address: 192.168.200.2
    command:
      - redis-server
      - --replicaof no one
      - --requirepass 123456
      - --masterauth 123456
      - --bind * -::*
  replica1:
    container_name: replica1
    image: redis:7.0
    networks:
      network:
        ipv4_address: 192.168.200.3
    command:
      - redis-server
      - --requirepass 123456
      - --bind * -::*
      - --masterauth 123456
      - --replicaof 192.168.200.2 6379
    depends_on:
      - master
  replica2:
    container_name: replica2
    image: redis:7.0
    networks:
      network:
        ipv4_address: 192.168.200.4
    command:
      - redis-server
      - --requirepass 123456
      - --bind * -::*
      - --masterauth 123456
      - --replicaof 192.168.200.2 6379
    depends_on:
      - master
  sentinel1:
    container_name: sentinel1
    image: redis:7.0
    networks:
      network:
        ipv4_address: 192.168.200.5
    volumes:
      - ./sentinel:/root/sentinel
    command:
      - redis-sentinel
      - /root/sentinel/sentinel.conf
      - --sentinel
    depends_on:
      - master
  • 启动:在hello-go文件夹下输入docker compose up启动。
  • 测试故障转移:docker stop master停止主节点,等待5秒就能从控制台或sentinel.conf中看到主节点发生切换。
  • 恢复故障主节点:docker start master就能看到master节点又加入集群,并且以从节点身份。

4. 注意

  1. 在生产环境中,建议使用多个哨兵和Redis Cluster等高级解决方案来实现更可靠和自动化的高可用性。
  2. 主节点也要指定masterauth(主节点授权),防止主节点意外中止恢复正常后以无法以从节点身份连接到集群。
相关推荐
哭哭啼2 小时前
Redis环境部署(主从模式、哨兵模式、集群模式)
数据库·redis·缓存
明志致远淡泊宁静4 小时前
记录一次服务器redis被入侵
运维·服务器·redis
WuMingf_4 小时前
redis
数据库·redis
精进攻城狮@6 小时前
Redis(value的数据类型)
数据库·redis
jwybobo20077 小时前
redis7.x源码分析:(3) dict字典
linux·redis
simpleGq7 小时前
Redis知识点整理 - 脑图
数据库·redis·缓存
李少兄9 小时前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
日里安9 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
sam-12318 小时前
k8s上部署redis高可用集群
redis·docker·k8s
看山还是山,看水还是。18 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率