Redis(三)——Sentinel哨兵模式

       前边我们总结了Redis(二)——复制,能够从一定程度上做好备份,扩展读能力(读写分离)。但这种主从复制在出现异常时回带来以下问题:1,一旦主节点出问题,需要手动将一个从节点升级为主节点,手动修改应用方连接信息,手动通过命令其它从节点复制新的主节点,整个过程都需要人工干预。2,主节点的写能力受到单击限制;3,主节点存储能力受到单击限制。而哨兵模式正是解决第1个问题呢。而2、3单机受限问题,只能通过集群的方式进行解决,后边会总结。

       上边中问题1,在人工干预中几个棘手的问题:a,判断节点不可达的机制是否健全和标准;2,如果有多个从节点,怎样保证只有一个被晋升为主节点;c,通知客户端新的主节点机制是否健壮。而redis-sentinel正式解决这些问题的。直接一点就是解决了主从复制的高可用问题。

       好,接下来我们从:1介绍;2安装部署;3api;4客户端;5实现原理;6开发运维常见问题。几个方面来学习一下。


       一,介绍:

       上边为其架构图,其实就是从主从复制模式的基础上,添加了sentinel-哨兵节点,来进行监控,以达到出现故障及时处理,保证业务的高可用。看下几个简单名词概念:

名词 逻辑架构 物理架构
主节点-master Redis主服务DB 独立的Redis进程
从节点-slave Redis从服务DB 独立的Redis进程
Redis数据节点 主节点和从节点 主节点和从节点进程
Sentinel节点 监控Redis数据节点的节点 独立的Sentinel进程

       Redis Sentinel架构通过以下功能实现了其目标业务高可用:

功能 说明
1-监控 Sentinel节点会定期检查Redis数据节点、其余Sentinel节点是否可达。
2-通知 Sentinel节点会将故障转移的结果通知给应用方,使应用方获取最新的master地址。
3-主节点故障转移

实现从节点晋升为主节点并维护后续正确的主从关系。

4-配置提供者 client业务连接Sentinel节点集合,获取主节点信息。

       二,安装和部署:

       3个sentinel节点做监控分布,数据节点1主2从。具体步骤看两篇别人写的吧,https://www.cnblogs.com/wxyidea/p/9934608.htmlhttps://blog.csdn.net/qq_18427977/article/details/80930937

       这里我们看一下几个配置优化:

Redis-Sentinel架构配置优化
命令 说明
1 sentinel monitor <master-name> <ip> <port> <quorum> 主要是quorum参数用于故障发现判定,至少有quorum个sentinel节点同意,判定才是客观。一般为半数+1,类似我们选举。
2 sentinel down-after-milliseconds <master> <times> times(毫秒)数据节点不可达的超时时间,越大表示越宽松,越小表示监控越严格
3 sentinel parallel-syncs <master-name> <nums> nums为故障转移后,每次向新的主节点同时发起复制操作的从节点个数。越大并发越高,主节点的网络和磁盘IO开销增大;当为1的时候,轮询进行复制。
4 sentinel failover-timeout <master-name> <times> times 故障转移超时时间
5 sentinel auth-pass <master> <password> 主节点设置的密码,安全限制
6 sentinel notification-script <master-name> <script-path> 方便通过脚本进行邮件或者短信的报警

       其中Sentinel节点不应该部署在一台物理机上,至少3个且为奇数个sentinel节点,是否要一套sentinel节点集群监控多个主节点,根据实际情况决定。一套sentinel节点方便管理,节约资源,但是出现问题影响范围大;多套sentinel节点恰相反。


       三,哨兵模式相关API:这里看这篇文章:https://blog.csdn.net/holdbelief/article/details/79790877,还有我们可以多查看其文档:http://www.redis.cn/topics/sentinel.html


      四,client连接sentinel模式:

      主要步骤如下:1,遍历sentinel节点集合获取一个可用的sentinel节点;2,通过get-master-addr-by-name获取当前的主节点信息;3,验证当前主节点是否为真正的主节点,防止故障转移期间主节点的变化;4,保持和sentinel节点集合联系,关注主节点的信息变化。

可以看下这篇文章:https://www.cnblogs.com/wangweiNB/p/5620845.html,https://www.cnblogs.com/xujishou/p/6511111.html


        五,实现原理:

功能 说明
1 Redis Sentinel的三个定时任务

a,每隔10秒,每隔Sentinel节点会向主、从节点发送info命令获取最新的拓扑结构。

b,每隔2秒,每隔Sentinel节点会向redis数据节点的_sentinel_:hello频道发送该Sentinel节点对于主节点的判断以及当前Sentinel节点信息。达到1了解其他sentinel节点状态信息;2并交换信息,作为后边客观下线和领导者选举的依据。

c,每隔1秒,每隔sentinel节点会向主、从节点、其余的sentinel节点发送一条ping命令做一次心跳检测。

2 主观下线vs客观下线

主观下线:每隔sentinel发送ping心跳检测,如果超过了down-after-milliseconds,则判断下线,为主观下线,即一家判定之言。

客观下线:当超过<quorum>个数判定为下线时,则为客观的。

3 领导者sentinel节点选举

当做出客观下线时,需要做故障转移,这时需要选举一个领导者进行做具体是事件。大概过程如下:

a,每个在线的sentinel节点都有资格成为领导者,并发其它节点发出我要当领导者;

b,收到其它节点当领导者的命令,如果没有同意过其它节点,则同意,否则拒绝;

c,如果该节点发现自己的票数大于等于max(quorum,num(sentinel)/2+1),那么他将成为领导者;

d,如果此过程没有产生,则进入下一轮选举。

4 故障转移

a,在从节点选出一个节点作为新的主节点,选择方法:1,过滤不健康(主观下线、断线);2,选择slave-priority优先级高的;3,选择复制偏移量大的;4选择runid最小的。

b,sentinel领导者对选出的从节点做slaveof no one 命令,让其成为主节点。

c,sentinel领导者向剩余的从节点发送命令,让它们成为新主节点的从节点。

d,sentinel领导者节点集合将原来的主节点更新为从节点,并保持对其关注。当其恢复后,命令它去复制新的主节点。


        六,开发运维中的注意点:

        1,要善于通过日志分许问题,每个节点的日志,都会将其的各种动作记录下来;

        2,节点下线,分临时下线和永久下线,注意各自对应的处理方案;

        3,  从节点的添加,节点配置一致性,主节点不可添加;

        4,读写分离,发挥从节点的分流作用。


       好,今天小结了一下redis哨兵模式的流程方案,是对主从复制的一种高可用解决方案。在数据量不是特别大时,不需要要做数据分布式时,哨兵模式是非常棒的选择。 在这里更多学习其哨兵sentinel节点、数据节点、分离并监控的思想。想想是不是像前边学习rocketMq中的nameServer和broker的关系?  

        

发布了291 篇原创文章 · 获赞 2005 · 访问量 275万+

猜你喜欢

转载自blog.csdn.net/liujiahan629629/article/details/89163981