为什么sentinels不订阅sentinel连接性中的频道“\u sentinel\u:hello”

inkz8wg9  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(458)

在查看redis的源代码时,我发现 sentinelRedisInstanceSRI_SENTINEL , sentinelReconnectInstance 不会初始化其 link->pc 不会订阅频道 "__sentinel__:hello" ,如下代码所示。

void sentinelReconnectInstance(sentinelRedisInstance *ri) {
    ...

    if ((ri->flags & (SRI_MASTER|SRI_SLAVE)) && link->pc == NULL) {
    ...
            retval = redisAsyncCommand(link->pc,
                sentinelReceiveHelloMessages, ri, "%s %s",
                sentinelInstanceMapCommand(ri,"SUBSCRIBE"),
                SENTINEL_HELLO_CHANNEL);
    ...

因此,我认为哨兵无法从这个频道得到任何信息 "__sentinel__:hello" .
然而,在redis的文档中,它说
每个哨兵都订阅了发布/子频道sentinel:hello of 每一个大师和复制品,寻找未知的哨兵。当检测到新的哨兵时,它们将被添加为此主机的哨兵。
我想这意味着所有的哨兵都订阅了这个频道 "__sentinel__:hello" ,但我在redis的源代码中看不到任何相应的实现。

vcirk6k6

vcirk6k61#

如果我错了就纠正我。 sentinelRedisInstance 类型 SRI_MASTER 连接到这个哨兵监视的主节点, sentinelRedisInstance 类型 SRI_SLAVE 连接到从属节点,并且 sentinelRedisInstance 类型 SRI_SENTINEL 连接到其他哨兵。
不需要订阅sentinel的通道,相反,sentinel只需要订阅主节点和从节点的通道。如果有一个新的哨兵,它将发布hello消息到主和从的通道。以便其他哨兵发现他们。

相关问题