Redis核心技术06-哨兵集群
# Redis核心技术06-哨兵集群
相关文章:
Redis深入-哨兵机制 (opens new window)
哨兵机制有三个任务:监控、选主、通知。
其中监控、选主又涉及到决策问题,由于一个哨兵会因为网络原因对某一些决策产生误判,所以为了降低误判率就需要引入多个哨兵,来组成类似一个评审小组。
之前我们重点讨论的是如果主从挂掉之后,如何通过主从切换来保证Redis服务不中断,那么如果哨兵实例在运行时发生故障,主从库还能正常切换吗?
实际上,一旦多个实例组成了哨兵集群
,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。
在配置哨兵的信息时,我们只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
但是这些哨兵并不知道彼此的地址,那么是如何组成集群的呢?
# 基于pub/sub机制的哨兵集群
哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布 / 订阅机制。
哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如发布自己的连接信息(IP和端口)。同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接消息。通过这种方式,当多个哨兵在主库上做了发布和订阅操作后,它们之间就能知道彼此的IP地址和端口。
除了哨兵实例,我们自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅。所以,为了区分不同应用的消息,Redis 会以频道的形式,对这些消息进行分门别类的管理。所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。
在主从集群中,主库上有一个名为_ sentinel _:hello
的频道,不同哨兵就是通过它来相互发现,实现互相通信的。
哨兵1将自己连接相关信息发送到_ sentinel _:hello
频道上,哨兵2和哨兵3通过订阅_ sentinel _:hello
频道上的消息,得知到哨兵1的信息,然后建立连接,形成哨兵集群。
哨兵除了在彼此之间建立连接形成集群外,还需要和从库建立连接。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和新主库进行同步。
哨兵是如何知道从库的IP地址和端口呢
哨兵通过给主库发送INFO命令,主库会返回给从库列表的信息。然后,哨兵就可以通过这些列表信息和每个从库建立连接,并开始对这些从库通过发送PING命令进行持续的监控。
通过pub/sub机制,哨兵之间可以建立连接形成哨兵集群,同时,哨兵通过INFO命令可以获得从库连接信息,和从库建立连接并监控。
在之前学习中,哨兵的通知是不光通知从库去和新主库进行连接,还要通知客户端,把发送的请求发送到新的主库上,所以哨兵还需要完成把新主库的信息告诉客户端这个任务。
也就是说客户端要能够获取到哨兵集群在监控、选主、切换这个过程中发生的各种事件。
# 基于pub/sub机制的客户端事件通知
从本质来说,哨兵是一个运行在特殊模式下的Redis进程。只是哨兵不服务请求操作,只负责监控、选主、通知的任务。因此,每个哨兵实例也提供pub/sub机制,客户端可以从哨兵订阅消息。哨兵提供的消息订阅频道有很多,不同频道包含了主从库切换过程中的不同关键事件。
客户端读取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立网络连接。然后,我们可以在客户端执行订阅命令,来获取不同的事件消息。
有了这些事件通知,客户端不仅可以在主从切换后得到新主库的连接信息,还可以监控到主从库切换过程中发生的各个重要事件。这样,客户端就可以知道主从切换进行到哪一步了,有助于了解切换进度。
通过pub/sub机制,哨兵和哨兵之间、哨兵和主库之间、哨兵和从库之间、哨兵和客户端之间就能建立起连接,再加上主库下线判断和选主依据,哨兵集群的监控、选主和通知三个任务就基本可以正常工作了。
# 主从切换是那个哨兵执行
在进行主从切换的时候,是由多个哨兵进行决策的,采用少数服从多数的原则。多个哨兵的主观下线
的仲裁结果就相当于哨兵集群的客观下线
。
任何一个实例只要自身判断主库“主观下线”后,就会给其他实例发送 is-master-down-by-addr 命令。接着,其他实例会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。
一个哨兵获得了仲裁所需的赞成票数后,就可以标记主库为“客观下线”。这个所需的赞成票数是通过哨兵配置文件中的 quorum 配置项设定的。
例如现在有5个哨兵,quorum 配置的是 3,那么,一个哨兵需要 3 张赞成票,就可以标记主库为“客观下线”了
此时,这个哨兵相当于征求其他哨兵意见的过程已经结束了,那么这个哨兵还会去征求一次意见让其他哨兵投票给自己去执行主从切换。这个投票过程称为“Leader 选举”。因为最终执行主从切换的哨兵称为 Leader,投票过程就是确定 Leader。
在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。
每个哨兵节点只能投票一次,包括投给自己的也算。