当查看Redis的源代码时,我发现当sentinelRedisInstance是SRI_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的文档中,它说
每个哨兵都订阅每个主机和副本的Pub/Sub通道sentinel:hello,寻找未知的哨兵。当检测到新的哨兵时,它们将被添加为该大师的哨兵。
我认为这意味着所有哨兵实际上都订阅了"__sentinel__:hello"频道,但在redis的源代码中看不到任何相应的实现。
发布于 2020-10-23 01:30:46
如果我错了就纠正我。
sentinelRedisInstance类型的SRI_MASTER连接到该哨兵正在监视的主节点,类型为SRI_SLAVE的sentinelRedisInstance连接到从节点,而SRI_SENTINEL类型的sentinelRedisInstance连接到其他哨兵。
没有必要订阅哨兵的通道,相反,哨兵只需要订阅主从节点的通道。如果有一个新的哨兵,它将发布hello消息给主人和奴隶的频道。以便其他哨兵能发现他们。
https://stackoverflow.com/questions/64482163
复制相似问题