我们现在来思考一个问题:如何实现服务的高可用。我们首先想到至少要满足两个要求:1.服务端能够实现主从自动切换;2.对于客户端来说,如果发生了主从切换,则能够自动连接到最新的master节点。
我们首先想到一个思路:增加一个领导者角色,能够管理redis节点存活状态,而且具备路由功能。比如master节点超过一定时间没有给监控服务器发送心跳报文,就把master标记为下线,然后将某个slave变成master。应用每一次都是从这个监控服务器骂道master的地址。
那问题来了?如果这个监控服务器本身出问题了怎么办?或者网络不同了,链接不到监控服务器了?
那是不是应该再创建一个监控服务器,来监控监控服务器?这个似乎无解了?因此如果采取哨兵sentinel的模式,我们该如何设计就是很重要的问题了。
这篇博客内容还不错,我们直接拿来用啦!
对于sentinel机制,我们的问题可以细分为以下几个方面:
我们先来了解一下哨兵机制实现了以下主要功能,进一步了解这些功能的实现原理。
根据上面的描述,我们可以将哨兵的功能总结为以下几点:
哨兵机制可以提供高可用性和故障转移能力,确保Redis集群在主节点故障时仍然可用。
哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布/订阅机制。哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如说发布它自己的连接信息(IP 和端口)。同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。当多个哨兵实例都在主库上做了发布和订阅操作后,它们之间就能知道彼此的 IP 地址和端口。除了哨兵实例,我们自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅。所以,为了区分不同应用的消息,Redis 会以频道的形式,对这些消息进行分门别类的管理。所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。
在主从集群中,主库上有一个名为__sentinel__:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的。我来举个例子,具体说明一下。在下图中,哨兵 1 把自己的 IP(172.16.19.3)和端口(26579)发布到__sentinel__:hello频道上,哨兵 2 和 3 订阅了该频道。那么此时,哨兵 2 和 3 就可以从这个频道直接获取哨兵 1 的 IP 地址和端口号。然后,哨兵 2、3 可以和哨兵 1 建立网络连接。通过这个方式,哨兵 2 和 3 也可以建立网络连接,这样一来,哨兵集群就形成了。它们相互间可以通过网络连接进行通信,比如说对主库有没有下线这件事儿进行判断和协商。
通过上面的讲解我们可以总结出来如下几点:
?1. 哨兵集群的组建步骤
- 步骤1:启动哨兵节点。
- 步骤2:配置哨兵节点的监控对象。
- 步骤3:哨兵节点之间的通信和协调。
2.哨兵节点的角色和作用
- Master节点:负责处理读写请求的主节点。
- Slave节点:通过复制Master节点的数据实现数据备份和读取。
- Sentinel节点:监控Redis集群的状态,负责主库下线判定和故障转移。
哨兵是如何知道从库的信息
哨兵向主库发送INFO命令,主库将从库列表发送给从库,哨兵跟从库列表中的从库建立连接,以便监控从库。
在Redis Sentinel中,主从切换的执行由哨兵集群中的多个哨兵节点共同协作完成。当哨兵集群中的某个哨兵节点检测到主节点下线时,它会向其他哨兵节点发送消息,然后所有哨兵节点共同达成一致,选举出一个新的主节点,并将其他从节点指向新的主节点。选举的过程中,哨兵节点会通过投票和心跳机制来确定新的主节点。选举出的新主节点会广播给所有的客户端,以便它们能够与新的主节点进行通信。所以,主从切换的执行是由所有的哨兵节点共同参与的。?
需要注意的是,在选举过程中,哨兵节点需要达成多数派的共识才能选出新的主节点。例如,如果哨兵节点的总数为5,那么至少需要3个哨兵节点同意选举结果才能生效。
这个选举过程确保了在主节点下线的情况下,哨兵集群能够自动选举出一个新的主节点,从而保证了Redis的高可用性。
总结一下
根据上面的学习,我们来简答一下常见的Redis高可用相关面试题
Redis的哨兵模式是一种用于实现高可用性的机制。在哨兵模式中,多个Redis实例组成一个哨兵集群,其中一个实例作为主服务器,其他实例作为从服务器。哨兵监控主服务器的状态,并在主服务器宕机时自动将某个从服务器提升为新的主服务器,以保证系统的持续可用性。
自动故障转移:当主服务器宕机时,哨兵可以自动选举一个新的主服务器,从而保证系统的高可用性。
实时监控:哨兵可以实时监控Redis实例的状态,并在发现异常时及时采取措施,如自动切换主服务器。
灵活性:哨兵模式可以根据实际需求配置哨兵集群的大小,以适应不同规模的系统。
哨兵集群中的哨兵不断地监控Redis实例的状态。
每个哨兵通过发送PING命令来检测Redis实例的存活状态。
如果一个哨兵发现主服务器宕机,它会通过选举算法选出一个新的主服务器,并将这一信息广播给其他哨兵。
其他哨兵收到广播后,也会更新自己的配置,以适应新的主服务器。
客户端可以通过连接任意一个哨兵来获取当前的主服务器地址,并与主服务器建立连接。
在每个Redis实例的配置文件中设置sentinel参数,指定哨兵模式的相关配置。
启动每个Redis实例,并指定相应的配置文件。
在哨兵集群中的任意一个哨兵上运行redis-sentinel命令,启动哨兵进程。
哨兵进程会自动发现其他哨兵和Redis实例,并开始监控它们的状态。
当一个哨兵发现主服务器宕机时,它会向其他哨兵发送选举请求。
哨兵集群中的所有哨兵会进行选举,选出一个新的主服务器。
选举规则通常是根据优先级、最近一次复制偏移量等因素进行评估。
选举完成后,新的主服务器地址会被广播给其他哨兵和客户端。
客户端可以通过连接任意一个哨兵来获取新的主服务器地址,并与其建立连接。
内容参考: