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(主节点授权),防止主节点意外中止恢复正常后以无法以从节点身份连接到集群。
相关推荐
阿巴~阿巴~6 小时前
Ubuntu 20.04 安装 Redis
linux·服务器·数据库·redis·ubuntu
野犬寒鸦7 小时前
从零起步学习Redis || 第十章:主从复制的实现流程与常见问题处理方案深层解析
java·服务器·数据库·redis·后端·缓存
阿巴~阿巴~9 小时前
Centos 7/8 安装 Redis
linux·服务器·数据库·redis·centos
AI浩10 小时前
Redis中的RPOP、BRPOP、LPOP 和 BLPOP
数据库·chrome·redis
Mr.wangh12 小时前
Redis作为分布式锁
数据库·redis·分布式
胖咕噜的稞达鸭13 小时前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法
凯子坚持 c14 小时前
Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙
redis·bootstrap·哈希算法
h79971016 小时前
redis lua脚本(go)调用教程以及debug调试
redis·golang·lua
虫师c20 小时前
分布式缓存实战:Redis集群与性能优化
redis·分布式·缓存·redis集群·高可用架构·生产环境·数据分片
我真的是大笨蛋1 天前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存