Redis高可用架构Sentinel
1 简介
哨兵是用来解决redis高可用性的,可以监控集群中主从的变化,然后进行故障转移。
一套合理的监控机制是Sentinel节点判定节点不可达的重要保证,Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控。
1.1 Sentinel作用
Redis-Sentinel是用于管理Redis集群,主要执行如下任务:
- 监控(Monitoring) Sentinel会不断地检查你的主服务器和从服务器是否运作正常;
- 提醒(Notification) 当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知;
- 自动故障迁移(Automatic failover)
当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
1.2 定期机制
周期10秒监控
每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的主从结构,该命令有3个作用:
- 通过向主节点执行info命令,获取从节点的信息,这也是为什么 Sentinel节点不需要显式配置监控从节点
- 当有新的从节点加入时都可以立刻感知出来
- 节点不可达或者故障转移后,可以通过info命令实时更新节点结构信息
周期2秒监控
每隔2秒,每个Sentinel节点会向Redis数据节点的_sentinel_:hello 频道上发送该Sentinel节点对于主节点的 判断以及当前Sentinel节点的信息 ,同时每个Sentinel节点也会订阅该频道,来了解其他 Sentinel节点以及它们对主 节点的判断。
该定时任务主要有2个作用: - 发现新的Sentinel节点:通过订阅主节点的_sentinel_:hello了解其他的Sentinel节点信息,如果是新加入的 Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
- Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。
周期1秒监控
每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些 节点当前是否可达,从而实现检查每个节点的健康状态。
1.3 执行流程
哨兵来实现Redis高可用有这5个流程:
- 判断主节点是否是主观下线sdown。(主观是指当前节点判断的结果,sdown表示该节点判断该Redis宕机了) ;
- 一旦主节点的主观下线到了一定数量,哨兵群进行客观下线odown的判断。(客观指也有其他Sentinel节点也判断该 Redis宕机了,并且数量达到了设置的值);
- 哨兵群选举一个Leader,准备对客观下线的节点进行故障转移;
- Leader选择一个slave a,其他哨兵确认;
- 其他slave成为a的slave。
状态说明
节点状态分为:ok、主观下线、客观下线。
正常(ok):就是节点在线,能够正常响应哨兵的检测和命令。
主观下线(sdown):指单个哨兵,发现主节点在down-after-milliseconds时间内无正确响应,做出的状态判断。
客观下线(odown):指多个哨兵对一个主节点做了sdown判断后,互相使用is-master-down-by-addr命令交流后,做出的节点已经下线的判断。
2 Sentinel集群搭建
Sentinel 系统是 Redis 的 unstable 分支的一部分 。Sentinel集群搭建需提前搭建好3台Redis,搭建流程可参考《Redis主从复制搭建及原理》。
2.1 环境说明
- CentOS7 3台
- 192.168.88.110 端口6379 主机名q110(下面统一简称为主机名)
- 192.168.88.111 端口6379 主机名q111(下面统一简称为主机名)
- 192.168.88.112 端口6379 主机名q112(下面统一简称为主机名)
- Redis-6.2.6
2.2 Sentinel集群配置
Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。
由于我们将3台Redis服务器上各自配置1个sentinel来监控本机上的Redis,所以3台服务器可以配置一样。具体如下,如有差异请按需修改:
# 提前创建好sentinel日志目录
touch /var/log/sentinel_6379.log
# 进入Redis配置目录
cd /etc/redis
# 创建sentinel.conf
vi sentinel.conf
#编写内容如下
# sentinel端口
port xxxx
# 监控的MasterIP及端口,将这个主服务器判断为失效至少需要2个Sentinel同意
sentinel monitor mymaster xxx xxx 2
# 文件需要提前创建好
logfile /var/log/sentinel_6379.log
# 后台运行
daemonize yes
q110配置
q111配置
q112配置
2.3 启动集群
- 启动Redis集群(每台执行)
systemctl start redis_6379
- 启动sentinel (每台执行)
redis-server /etc/redis/sentinel.conf --sentinel
2.4 验证sentinel集群
- 确认sentinel集群是否正常
# 查看Redis集群状态
redis-cli -h 192.168.88.110 -p 6379 info replication
# 查看sentinel集群状态
redis-cli -h 192.168.88.110 -p 26379 info sentinel
- 当手动将Redis master 关闭后查看 slave上sentinel日志