文章目录
- Redis哨兵
- Redis哨兵搭建指南
-
- Redis哨兵模式搭建指南
-
- [1. 准备工作](#1. 准备工作)
- [2. 修改Redis哨兵模式的配置文件(所有节点操作)](#2. 修改Redis哨兵模式的配置文件(所有节点操作))
- [3. 启动哨兵模式](#3. 启动哨兵模式)
- [4. 查看哨兵信息](#4. 查看哨兵信息)
- [5. 故障模拟](#5. 故障模拟)
- 注意
- 哨兵failover
Redis哨兵
在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡;存储能力受到单机的限制;哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。
核心功能
- 监控:哨兵节点会不断地检查主节点和从节点的状态,包括它们的健康情况和配置信息。
- 自动故障转移:当主节点出现故障时,哨兵会自动选择一个从节点作为新的主节点,并更新其他从节点的配置,使它们指向新的主节点。这个过程是自动完成的,无需人工干预。
- 通知:哨兵可以将故障转移的结果通知给客户端,使客户端能够及时更新连接信息。
结构
哨兵模式由两部分组成:哨兵节点和数据节点。
- 哨兵节点:哨兵节点是特殊的Redis节点,它们不存储数据,而是专注于监控和故障转移。哨兵节点之间通过相互通信来共享信息和协调行动。
- 数据节点:数据节点包括主节点和从节点,它们存储实际的数据。主节点负责处理写操作,而从节点则复制主节点的数据,负责处理读操作。
故障转移机制
故障转移机制是哨兵模式的核心功能之一,它包括以下几个步骤:
- 主观下线:每个哨兵节点都会定期向主节点和从节点发送心跳检测(通常是PING命令)。如果主节点在一定时间范围内没有响应,哨兵节点就会认为主节点已经主观下线。
- 客观下线:当超过半数哨兵节点认为主节点主观下线时,主节点就会被标记为客观下线。这意味着主节点确实已经出现故障,需要进行故障转移。
- 选举Leader:在确认主节点客观下线后,哨兵节点会通过Raft算法(或其他选举算法)选举出一个Leader哨兵节点。Leader哨兵节点负责执行故障转移操作。
- 执行故障转移:Leader哨兵节点会选择一个合适的从节点作为新的主节点,并更新其他从节点的配置信息。同时,如果原主节点恢复,它会被重新配置为从节点,并指向新的主节点。
- 通知客户端:最后,哨兵会将故障转移的结果通知给客户端,使客户端能够更新连接信息并继续访问Redis服务。
主节点的选举
在选择新的主节点时,哨兵会遵循以下原则:
- 健康性:首先排除那些已经下线的从节点。
- 优先级 :然后选择配置文件中优先级最高的从节点。优先级可以通过
replica-priority
配置项进行设置。 - 复制偏移量:如果多个从节点具有相同的优先级,哨兵会选择复制偏移量最大的从节点作为新的主节点。复制偏移量反映了从节点复制主节点数据的进度和完整性。
哨兵的启动
哨兵模式的启动依赖于主从模式的配置。因此,在配置哨兵模式之前,必须确保主从模式已经正确安装和配置。然后,可以通过启动哨兵节点来监控和保护Redis集群的高可用性。
Redis哨兵搭建指南
Redis哨兵模式搭建指南
1. 准备工作
-
Master节点:IP地址为192.168.80.10
-
Slave1节点:IP地址为192.168.80.11
-
Slave2节点:IP地址为192.168.80.12
-
在所有节点上停止防火墙服务并设置SELinux为宽容模式:
bashsystemctl stop firewalld setenforce 0
2. 修改Redis哨兵模式的配置文件(所有节点操作)
-
复制哨兵配置文件到指定目录并更改所有权:
bashcp /opt/redis-7.0.9/sentinel.conf /usr/local/redis/conf/ chown redis.redis /usr/local/redis/conf/sentinel.conf
-
编辑哨兵配置文件(
/usr/local/redis/conf/sentinel.conf
),进行以下更改:conf# 关闭保护模式 protected-mode no # Redis哨兵默认的监听端口 port 26379 # 指定sentinel为后台启动 daemonize yes # 指定PID文件 pidfile /usr/local/redis/log/redis-sentinel.pid # 指定日志存放路径 logfile "/usr/local/redis/log/sentinel.log" # 指定数据库存放路径 dir /usr/local/redis/data # 配置哨兵监控主节点 # 格式:sentinel monitor <master-name> <ip> <port> <quorum> # 其中<quorum>表示判定主节点故障所需的哨兵节点数 sentinel monitor mymaster 192.168.80.10 6379 2 # 如果主节点设置了密码,则取消以下行的注释并设置密码 # sentinel auth-pass mymaster abc123 # 判定服务器down掉的时间周期,默认30000毫秒(30秒) sentinel down-after-milliseconds mymaster 3000 # 同一个sentinel对同一个master两次failover之间的间隔时间(180秒) sentinel failover-timeout mymaster 180000
3. 启动哨兵模式
-
先启动Master节点上的Redis服务,再启动Slave节点上的Redis服务。
-
在所有节点上启动哨兵服务:
bashcd /usr/local/redis/conf/ redis-sentinel sentinel.conf &
4. 查看哨兵信息
-
使用以下命令查看哨兵信息:
bashredis-cli -p 26379 info Sentinel
预期输出示例:
# Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.80.10:6379,slaves=2,sentinels=3
5. 故障模拟
-
查看Redis服务进程号 :
bashps -ef | grep redis
-
杀死Master节点上的Redis服务进程 :
bash# 替换为实际的Master节点Redis服务进程号 kill -9 <Master_Redis_PID>
-
验证故障转移结果 :
-
查看哨兵日志以确认故障转移过程:
bashtail -f /usr/local/redis/log/sentinel.log
-
再次使用
redis-cli -p 26379 info Sentinel
查看哨兵信息,确认新的主节点。
-
预期输出示例(故障转移后):
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.11:6379,slaves=2,sentinels=3
注意
- 哨兵数量:为确保故障转移的有效性,哨兵节点的数量应至少为3个。
- 网络配置:确保所有节点之间的网络连接正常。
- 安全性 :如果主节点设置了密码,请确保在哨兵配置文件中正确配置了
sentinel auth-pass
。 - 监控与日志:定期监控哨兵日志和Redis服务状态,以确保系统健康运行。
哨兵failover
vim sentinel.conf
sentinel client-reconfig-script mymaster /etc/redis/failover.sh
Sentinel 在做 failover 的时候会执行这个脚本,并且传递 7 个参数 master-name、role、state、from-ip、from-port、to-ip、to-port,其中 to-ip 是新主 Redis 的 IP 地址,可以在这个脚本里做 VIP 漂移操作。
vim /etc/redis/failover.sh
#!/bin/bash
#新master的ip地址
MASTER_IP=${6}
#当前服务器IP
LOCAL_IP='192.168.80.13'
VIP='192.168.80.200'
NETMASK='24'
INTERFACE='ens33'
if [ "${MASTER_IP}" = "${LOCAL_IP}" ]; then
#将VIP绑定到该服务器上
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
#将VIP从该服务器上删除
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
#如果返回1,sentinel会一直执行这个脚本
exit 1
chmod +x /etc/redis/failover.sh
#手动绑定VIP到当前主redis服务器上
/sbin/ip addr add 192.168.80.200/24 dev ens33
/sbin/arping -q -c 3 -A 192.168.80.200 -I ens33