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命令,获取主节点的从节点列表,随后与每个从节点建立连接并监控。# 主节点返回的示例信息(包含从节点地址) # 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__:helloPub/Sub 频道发布自身信息,其他哨兵订阅该频道以互相发现。# 哨兵发布的消息格式 [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. 哨兵的核心职责
-
主节点健康检测:
判断主节点是否客观下线(ODOWN)。 -
自动故障转移:
选举新主节点并更新集群配置。 -
配置传播:
通知客户端和其他节点新主节点的地址。 -
从节点管理:
监控从节点状态,确保数据一致性。
5. 示例场景
-
初始状态:
-
主节点:
Master:192.168.1.100:6379 -
从节点:
Slave1:192.168.1.101:6379、Slave2:192.168.1.102:6379 -
哨兵:
Sentinel1:192.168.1.200:26379、Sentinel2:192.168.1.201:26379
-
-
主节点故障后:
-
哨兵检测到主节点不可达,触发故障转移。
-
哨兵选择
Slave1为新主节点,并通知Slave2切换复制源。 -
原主节点恢复后,哨兵将其设置为
Slave1的从节点。
-
6. 配置参数
在哨兵配置文件(sentinel.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,避免误判和脑裂。
浙公网安备 33010602011771号