1.编写redis集群主节点的配置文件

  redis-master.conf

port 6379
bind 0.0.0.0
protected-mode no

  redis-slavle1.conf

port 6379
bind 0.0.0.0
slaveof redis-master 6379
protected-mode no

redis-slavle2.conf

port 6379
bind 0.0.0.0
slaveof redis-master 6379
protected-mode no

字段解析:

1. port 6379
含义:指定 Redis 服务监听的 TCP 端口号。

默认值:6379。

作用:

客户端通过该端口连接 Redis 服务器。

同一台机器上运行多个 Redis 实例时,需为每个实例分配不同端口(如 6380、6381)。

2. bind 0.0.0.0
含义:指定 Redis 监听的 网络接口(IP 地址)。

默认值:默认仅监听本地回环地址 127.0.0.1。

作用:

0.0.0.0 表示监听所有可用网络接口(允许任意 IP 连接 Redis)。

若需限制访问来源,可指定具体 IP(如 bind 192.168.1.100)。

3. slaveof redis-master 6379
含义:将该 Redis 实例配置为 从节点(Slave),复制指定主节点(Master)的数据。

redis-master:主节点的域名或 IP 地址。

6379:主节点的端口。

作用:

从节点会自动连接主节点并同步数据(全量或增量复制)。

若主节点配置了密码,需在从节点添加 masterauth <password> 参数。

4. protected-mode no
含义:是否启用 保护模式。

yes:若未配置密码且未绑定 IP,仅允许本地连接。

no:允许远程连接,即使未设置密码。

作用:

生产环境强烈建议设为 yes,并配合 requirepass 设置密码。

在测试或内网环境中可设为 no,但需确保网络安全(如防火墙限制)


# 安全增强配置(建议生产环境启用)
requirepass your_redis_password      # 设置 Redis 访问密码
masterauth your_master_password      # 主节点密码(从节点需要)
 

 

 

2.编写sentinel配置文件

sentinel1.conf

port 26379
sentinel monitor mymaster 47.117.177.159 6379 2
logfile "sentinel1.log"
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
protected-mode no

sentinel2.conf

port 26379
sentinel monitor mymaster 47.117.177.159 6379 2
logfile "sentinel2.log"
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 180000  
protected-mode no

sentinel3.conf

port 26379
sentinel monitor mymaster 47.117.177.159 6379 2
logfile "sentinel3.log"
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 180000  
protected-mode no

配置文件解析

port 26379
daemonize yes
logfile "/var/log/redis/sentinel.log"

# 主节点配置:监控名为 mymaster 的主节点,地址为 192.168.1.100:6379,法定人数为 2
sentinel monitor mymaster 192.168.1.100 6379 2

# 主节点密码(与 Redis 的 requirepass 一致)
sentinel auth-pass mymaster your_redis_password

# 主节点 5000 毫秒无响应视为下线
sentinel down-after-milliseconds mymaster 5000

# 故障转移超时时间为 3 分钟
sentinel failover-timeout mymaster 180000

# 每次允许 1 个从节点同步新主节点
sentinel parallel-syncs mymaster 1

# 关闭保护模式(允许外部访问)
protected-mode no

# 哨兵节点间通信密码(可选)
requirepass "your_sentinel_password"

docker-compose.yaml

version: "3.7"
services:
  redis-master:
    image: redis:latest
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - redis_master_data:/data
      - ./redis-master.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf # 告诉 Docker 在启动容器时运行 redis-server 命令,并且使用 /usr/local/etc/redis/redis.conf 这个配置文件来启动 Redis 服务。
    networks:
      - redisnet

  redis-slave1:
    image: redis:latest
    container_name: redis-slave1
    ports:
      - "6380:6379"
    volumes:
      - redis_slave1_data:/data
      - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redisnet

  redis-slave2:
    image: redis:latest
    container_name: redis-slave2
    ports:
      - "6381:6379"
    volumes:
      - redis_slave2_data:/data
      - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redisnet

  redis-sentinel1:
    image: redis:latest
    container_name: redis-sentinel1
    ports:
      - "26379:26379"  
    volumes:
      - redis_sentinel1_data:/data
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    networks:
      - redisnet
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf

  redis-sentinel2:
    image: redis:latest
    container_name: redis-sentinel2
    ports:
      - "26380:26379"
    volumes:
      - redis_sentinel2_data:/data
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      - redisnet
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2

    command: redis-sentinel /usr/local/etc/redis/sentinel.conf

  redis-sentinel3:
    image: redis:latest
    container_name: redis-sentinel3
    ports:
      - "26381:26379"
    volumes:
      - redis_sentinel3_data:/data
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    networks:
      - redisnet
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf



networks:
  redisnet:
    driver: bridge

volumes:
  redis_master_data:
  redis_slave1_data:
  redis_slave2_data:
  redis_sentinel1_data:
  redis_sentinel2_data:
  redis_sentinel3_data:

 

哨兵之间的常见问题

在 Redis 哨兵(Sentinel)模式中,哨兵不仅监听主节点,还会自动发现并监控所有从节点和其他哨兵节点。以下是哨兵的监控范围和详细工作机制:


1. 哨兵的监控对象

监控对象说明
主节点(Master) 核心监控目标,哨兵通过定期心跳检测主节点健康状态。
从节点(Slave) 自动发现主节点的所有从节点,并监控其在线状态和复制延迟。
其他哨兵节点 哨兵之间互相通信,组成分布式集群,共同决策故障转移。

2. 哨兵如何发现从节点和其他哨兵?

  • 从节点的发现
    哨兵通过向主节点发送 INFO REPLICATION 命令,获取主节点的从节点列表,随后与每个从节点建立连接并监控。

    bash
    复制
    # 主节点返回的示例信息(包含从节点地址)
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
    slave1:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=1
  • 其他哨兵的发现
    哨兵通过向主节点的 __sentinel__:hello Pub/Sub 频道发布自身信息,其他哨兵订阅该频道以互相发现。

    bash
    复制
    # 哨兵发布的消息格式
    [sentinel_ip,sentinel_port,sentinel_runid,current_epoch] master_name,master_ip,master_port,config_epoch

3. 哨兵的监控行为

对主节点的监控

  • 心跳检测
    哨兵每隔 sentinel down-after-milliseconds 配置的时间(默认 30 秒)向主节点发送 PING 命令,检测其是否存活。

  • 角色验证
    哨兵定期检查主节点是否仍为 role:master,防止配置错误或手动干预导致角色异常。

对从节点的监控

  • 复制状态检查
    哨兵验证从节点是否正常复制主节点数据(通过 INFO REPLICATION 检查 master_link_status)。

  • 数据同步延迟监控
    哨兵记录从节点的复制偏移量(offset),用于选择新主节点时优先选择数据最新的从节点。

对其他哨兵的监控

  • 存活检测
    哨兵定期与其他哨兵通信,确保集群多数派存活,避免因网络分区导致脑裂。

  • 配置同步
    哨兵通过共识协议(如 Raft)同步主节点状态和故障转移决策。


4. 哨兵的核心职责

  1. 主节点健康检测
    判断主节点是否客观下线(ODOWN)。

  2. 自动故障转移
    选举新主节点并更新集群配置。

  3. 配置传播
    通知客户端和其他节点新主节点的地址。

  4. 从节点管理
    监控从节点状态,确保数据一致性。


5. 示例场景

  • 初始状态

    • 主节点:Master:192.168.1.100:6379

    • 从节点:Slave1:192.168.1.101:6379Slave2:192.168.1.102:6379

    • 哨兵:Sentinel1:192.168.1.200:26379Sentinel2:192.168.1.201:26379

  • 主节点故障后

    1. 哨兵检测到主节点不可达,触发故障转移。

    2. 哨兵选择 Slave1 为新主节点,并通知 Slave2 切换复制源。

    3. 原主节点恢复后,哨兵将其设置为 Slave1 的从节点。


6. 配置参数

在哨兵配置文件(sentinel.conf)中,以下参数控制监控行为:

conf
复制
# 监控主节点
sentinel monitor mymaster 192.168.1.100 6379 2

# 主节点无响应 5 秒后标记为“主观下线”
sentinel down-after-milliseconds mymaster 5000

# 从节点优先级(值越小优先级越高)
sentinel slave-priority mymaster 50

总结

    • 监控范围
      哨兵同时监控主节点、从节点和其他哨兵,确保集群状态全面可见。

    • 核心目标
      通过多维度监控和自动化决策,保障 Redis 集群的高可用性和数据一致性。

    • 配置要点
      合理设置 down-after-milliseconds 和 quorum,避免误判和脑裂。

 

posted on 2025-03-22 16:39  輪滑少年  阅读(168)  评论(0)    收藏  举报