哨兵机制
哨兵的核心是功能是主节点的自动故障转移
哨兵机制的作用
假如主服务宕机后,我们需要手动把一台从服务器切换成主服务,这个动作全程需要人工干预。 中间可能发生操作失误,且在操作过程中会导致一段时间内服务不可用。为了解决上面的问题,我们需要引入一套自动化的解决方案,那就是哨兵机制。
[Redis中文文档] https://redis.com.cn/topics/sentinel.html
官方文档中提及到的功能:
监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作。
通知(Notification):Sentinel可以通过一个api来通知系统管理员或者另外的应用程序,被监控的Redis实例有一些问题。
自动故障转移(Automatic failover): 如果一个主节点没有按照预期工作,Sentinel会开始故障转移过程,把一个从节点提升为主节点,并重新配置其他的从节点使用新的主节点,使用Redis服务的应用程序在连接的时候也会被通知新的地址。
配置提供者(Configuration provider):Sentinel给客户端的服务发现提供来源:对于一个给定的服务,客户端连接到Sentinels来寻找当前主节点的地址。当故障转移发生的时候,Sentinels将报告新的地址。//客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需要在与客服端的交互中才能体现
哨兵集群的组建
哨兵实例之间可以互相发现,要归功于Redis提供的pub/sub机制,也就是发布/订阅机制
[Redis pub/sub 发布订阅机制原理与实战] https://juejin.cn/post/7134591236195188744
在主从集群中,主库上有一个名为sentinel:hello的频道,不同哨兵就是通过它来互相发现,实现互相通信的。在下图中,哨兵1把自己的IP(172.16.19.3)和端口(26579)发布到sentinel:hello频道上,哨兵2和3就可以从这个频道直接获取哨兵1的IP地址和端口。然后,哨兵2、3可以和哨兵1建立网络连接。
通过这个方式,哨兵2和3也可以建立网络连接,这样一来,哨兵集群就形成了。它们相互间可以通过网络连接进行通信,比如说对主库有没有下线这件事进行判断和协商。
哨兵监控Redis库
这是由哨兵向主库发送INFO命令来完成的。就像下图所示,哨兵2给主库发生INFO命令,主库接受到这个命令后,就会把从库列表返回给哨兵。接着,哨兵就可以根据从库列表中的连接信息,和每个从库建立连接,并在这个连接上持续地对库进行监控。哨兵1和3可以通过相同的方法和从库建立连接。
主库下线的判定
主观下线:就是哨兵各自自己对Redis节点下线的判断
客观下线: 由哨兵集群共同决定Redis节点是否下线
由当某个哨兵判断主库主观下线后,向哨兵集群发起了投票,各个哨兵会根据自己和主库连接的情况做出投票,Y相当于赞成 N相当于反对 如果判断后赞成的数大于quorum的值,那么就可以判断为客观下线了
哨兵集群的选举
判断完主库下线后,由哪个哨兵节点来执行主从切换,这里就需要哨兵集群的选举机制了
为什么必然会出现选举
为了避免哨兵的单点情况发生,所以需要一个哨兵的分布式集群。作为分布式集群,必然涉及共识问题;同时故障的转移和通知都只需要一个主的哨兵节点就可以了
哨兵的选举机制是什么样的
选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举
成为Leader的条件
1.拿到一半以上的赞成票
2.同时还需要大于等于配置文件中的quorum值
新主库的选出
规则
1.去除没有回复过哨兵ping响应的从节点,或者下线断线的
2.选择salve-priority
从节点优先级最高(redis.conf)的
(什么是slave-priority:Redis 有个叫slave-priority 配置项,可以给从节点设置优先级。 每一台从节点的服务器配置不一定是相同的,我们可以根据服务器性能配置来设置从节点的优先级。 比如,如果「A 从节点」的物理内存是所有从节点中最大的,那么我们可以把「A 从节点」的优先级设置成最高。)
3.选择复制偏移量最大,只复制最完整的从节点
故障转移
新的库选完后就可以开始进行故障转移了
假设刚刚开始 1.判断了主库客观下线 同时选出sentinel 3 是哨兵leader
故障转移流程
1.将slave-1脱离原来的从节点,升级变成主节点
2.将从节点slave-2指向新的主节点
3.通知客户端主节点已更换
4.将原来的主节点变成从节点,指向新的主节点
[Redis集群模式与主从模式有什么区别 ] https://cloud.tencent.com/developer/article/2327774
[主从、集群、分布式的区别] https://www.cnblogs.com/fulaien/p/17758914.html
[Redis:主从库模式、哨兵和分片集群] https://cloud.tencent.com/developer/article/1747028