【问题标题】:Why don't sentinels subscribe channel "__sentinel__:hello" in sentinelReconnectInstance为什么哨兵不在 sentinelReconnectInstance 中订阅频道“__sentinel__:hello”
【发布时间】:2020-10-22 12:25:13
【问题描述】:

查看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 的 doc 中,它说

每个 Sentinel 都订阅了 Pub/Sub 频道 sentinel:hello 每个 master 和 replica,寻找未知的 sentinel。当检测到新的哨兵时,它们会被添加为此主服务器的哨兵。

我认为这意味着所有的哨兵实际上都订阅了频道"__sentinel__:hello",但是我在redis的源代码中看不到任何对应的实现。

【问题讨论】:

    标签: redis redis-sentinel


    【解决方案1】:

    如果我错了,请纠正我。

    SRI_MASTER 类型的sentinelRedisInstance 连接到该哨兵正在监视的主节点,SRI_SLAVE 类型的sentinelRedisInstance 连接到从节点,SRI_SENTINEL 类型的sentinelRedisInstance 连接到其他哨兵。

    sentinel 不需要订阅频道,sentinel 只需要订阅主从节点的频道即可。如果有新的哨兵,它将向主从通道发布 hello 消息。以便其他哨兵发现它们。

    【讨论】:

    • 你的意思是对于master实例,它建立了pc和cc链接到它正在监控的master节点,所以总共会有2个链接。从节点也有2个。但是对于一个sentinel实例,它会建立countOfAllOtherNoSentinelspc链接到所有其他主从节点,countOfAllOtherInstancescc链接到所有其他节点?
    • 是的,它为每个master和replica建立了2个链接
    • 如果我在这里是正确的,我对另一个问题感到困惑。因为在 redis 的源代码中它说如果 5 个 Sentinel 正在监视 100 个 master,则只有 5 个连接而不是 500 个。但是我认为对于每个 Sentinel,它将为每个 master 建立 1 个cc 和 1 个pc,所以有总共应该是 2 * 100 * 5 个连接
    • 我认为评论描述的是哨兵之间的连接,而不是与主/从的连接。
    • 我还是想不通如何在5个sentinel之间建立5个连接,我想如果每个人之间有一个cc连接,应该有5*4/2=10连接,而不是5个连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2019-10-21
    相关资源
    最近更新 更多