当前位置: 首页 > 后端技术 > Java

Redis高可用:redis哨兵集群

时间:2023-04-01 20:14:42 Java

1。sentinel的介绍,中文名为sentinel。Sentinel是redis集群组织中非常重要的一个组件。主要有以下功能:集群监控:负责监控redis主从进程是否正常工作。消息通知:如果某个redis实例出现故障,Sentinel负责发送消息作为告警通知给管理员。故障转移:如果主节点挂了,会自动转移到从节点。配置中心:如果发生故障转移,通知客户端新的主地址。哨兵是用来实现redis集群的高可用的,也是分布式的。它们作为哨兵集群运行并相互协作。在failover时,判断一个master节点是否宕机需要得到大多数sentinel的同意,这就涉及到分布式选举的问题。即使部分sentinel节点宕机,sentinel集群仍然可以正常工作,因为作为高可用机制重要组成部分的故障转移系统如果是单点的,会很坑爹。2.Sentinel的核心知识Sentinel至少需要三个实例来保证健壮性。Sentinel+redis主从部署架构不保证数据零丢失,只能保证redis集群的高可用。对于sentinel+redis主从的复杂部署架构,尽量在测试环境和生产环境都进行充分的测试和演练。Sentinel集群必须部署2个以上的节点。如果Sentinel集群只部署2个Sentinel实例,quorum=1。+----++----+|M1|----------|R1||S1||S2|+----++----+配置quorum=1,如果master挂了,只要s1和s2中有一个sentinel认为master挂了,就可以切换过来,同时届时,s1和s2将选举一个sentinel来执行故障转移。但同时要求多数,即大多数哨兵都在运行。2Sentinels,majority=23Sentinels,majority=24Sentinels,majority=25Sentinels,majority=3...如果此时只有M1进程宕机,Sentinels1运行正常,那么failover就OK了。但是如果运行M1和S1的整台机器宕机,那么就只有一个sentinel,此时没有多数允许failover。虽然另一台机器上有R1,但不会执行故障转移。经典的3节点哨兵集群如下所示:+----+|M1||S1|+----+|+----+|+----+|R2|----+-----|R3||S2||S3|+----++----+Configurequorum=2,如果M1所在的机器挂了,那么还剩下2个sentinel,S2和S3可以一致认为master挂了,然后选举一个执行故障转移。同时,三个sentinel的多数是2,所以剩下的两个sentinel都在运行,可以进行failover。3、redissentinel主备切换的数据丢失问题有两种情况会导致数据丢失:异步复制导致的数据丢失因为master->slave的复制是异步的,可能会有一些数据没有复制到slave,master宕机如果电脑死机,数据就会丢失。脑裂引起的数据丢失脑裂,就是说某个master所在的机器突然脱离了正常的网络,无法连接到其他slave机器,但实际上master还在运行。这个时候sentinel可能会认为master挂了,然后开始选举把其他的slave切换到master上。这时集群中会出现两个master,也就是所谓的脑裂。这时候虽然有一个slave切换成了master,但是client可能还没有切换到新的master就继续往旧的master写数据。因此,当旧的master再次恢复时,它会作为slave附着在新的master上,自己的数据会被清空,重新从新的master上复制数据。新的master没有后面client写入的数据,所以这部分数据就丢失了。###4。数据丢失问题的解决方案配置如下:min-slaves-to-write1min-slaves-max-lag10表示至少需要一个slave,数据复制和同步的延迟不能超过10秒。如果一次所有的slave,数据复制和同步的延时超过10秒,那么此时master将收不到任何请求。减少异步复制数据的丢失通过min-slaves-max-lag的配置,可以保证一旦slave复制数据ack延迟时间过长,认为master宕机后可能丢失太多数据.拒绝写请求,可以将master宕机时部分数据没有同步到slave造成的数据丢失降低在可控范围内。减少脑裂数据丢失如果一个master发生脑裂,与其他slave失去连接,以上两个配置可以保证如果指定数量的slave不能继续发送数据,slave不会给自己ackformore超过10秒的消息,则直接拒绝客户端的写入请求。因此,在裂脑场景中,最多会丢失10秒的数据。5、sdown和odown的转换机制。Sdown是一种主观的停机时间。如果sentinel认为master宕机了,那就是主观宕机。Odown是一种客观的停机时间。如果quorumnumberofsentry感觉一个master宕机了,那么客观宕机sdown的条件就很简单了。如果sentinelpingmaster超过了is-master-down-after-milliseconds指定的毫秒数,主观上认为master宕机了;如果一个哨兵在规定的时间内ping了一个master,其他收到quorumnumber的哨兵也认为mastersdown了,所以认为是odown。6.哨兵集群的自动发现机制哨兵的相互发现是通过redis的pub/sub系统实现的。每个sentinel都会向通道__sentinel__:hello发送消息,此时所有其他sentinel都可以消费接收到消息,感知到其他sentinel的存在。每隔两秒,每个sentinel都会向自己监控的一个master+slave对应的__sentinel__:hello通道发送一条消息,内容是自己的host、ip、runid和这个master的监控配置。每个sentinel也会监听它监听的每个master+slave对应的__sentinel__:hello通道,然后感知其他同样监听这个master+slave的sentinel的存在。每个sentinel也会和其他sentinel交换master的监控配置,互相同步监控配置。7、自动修正slave配置sentinel会负责自动修正slave的一些配置。例如,如果slave要成为潜在的master候选者,sentinel会确保slave复制现有master的数据;如果slave连接到错误的master,比如在故障转移之后,Sentinel会确保它们连接到正确的master。8.Slave->master选举算法如果认为一个master宕机了,并且大部分sentinel允许主备切换,那么某个sentinel将执行主备切换操作。这时候必须先选出一个slave,它会考虑slave的一些信息:与master断开连接的持续时间slavepriorityreplicationoffsetrunid如果一个slave与master断开连接超过10次down-after-milliseconds,加上master宕机的时间长度,则slave会认为不适合竞选master。(down-after-milliseconds*10)+milliseconds_since_master_is_in_SDOWN_stateCopytoclipboardErrorCopied接下来会对slave进行排序:按照slave优先级排序,slave优先级越低优先级越高。如果slave优先级相同,再看replicaoffset,哪个slave复制的数据多,offset越低,优先级越高。如果以上两个条件相同,则选择runid较小的slave。9.每次quorum和majority中的sentinel需要切换master和backup时,首先必须认为quorum中的sentinel数量down了,然后再选举一个sentinel进行切换。如果quorum=majority,那么必须授权quorum个哨兵,比如5个哨兵,quorum为5,那么5个哨兵都必须同意授权才能进行切换。10.配置epochsentry会监控一组redismaster+slaves,有相应的监控配置。执行切换的sentinel会从新的master(salve->master)得到一个configurationepoch来切换到,也就是版本号,每次切换的版本号必须是唯一的。Ifthefirstelectedsentryfailstoswitch,theothersentrieswillwaitforthefailover-timeouttime,andthentakeovertocontinuetheswitch.此时会再次获取一个新的配置epoch作为新的版本号。11、配置传播sentinel完成切换后,会在本地更新生成最新的master配置,然后通过前面提到的pub/sub消息机制同步到其他sentinel。这里之前的版本号很重要,因为各种消息都是通过一个channel来发布和监听的,所以一个sentinel完成新的切换后,新的master配置会跟随新的版本号。其他哨兵根据版本号的大小更新他们的master配置。