17.4. HELLO 命令
197
char payload [REDIS_IP_STR_LEN+1024];
int r e t v a l ;
sentinelRedisInstance *master = ( ri −>f l a g s & SRI_MASTER)
?
r i : ri −>master ;
sentinelAddr *master_addr =
sentinelGetCurrentMasterAddress ( master ) ;
/
* Try to obtain our own IP address . */
i f ( anetSockName ( ri −>cc−>c . fd , ip , sizeof ( ip ) ,NULL) == −1)
return REDIS_ERR;
i f ( ri −>f l a g s & SRI_DISCONNECTED) return REDIS_ERR;
/
/
/
/
/ 格 式 化 需 要 发 送 的 数 据, 包 括:
/ 哨 兵 IP 地 址, 端 口, runnid , 当 前 配 置 版 本,
/ 主 机 IP 地 址, 端 口, 当 前 配 置 的 版 本
* Format and send the Hello message . */
s n p r i n t f ( payload , sizeof ( payload ) ,
”
%s ,%d,%s ,% llu , ” /* Info about t h i s s e n t i n e l . */
”
%s ,%s ,%d,% l l u ” , /* Info about current master . */
ip , server . port , server . runid ,
(
unsigned long long ) s e n t i n e l . current_epoch ,
* −−− */
/
master−>name , master_addr−>ip , master_addr−>port ,
(
unsigned long long ) master−>config_epoch ) ;
r e t v a l = redisAsyncCommand ( ri −>cc ,
sentinelPublishReplyCallback , NULL, ”PUBLISH␣%s ␣%s ” ,
SENTINEL_HELLO_CHANNEL, payload ) ;
i f ( r e t v a l != REDIS_OK) return REDIS_ERR;
ri −>pending_commands++;
return REDIS_OK;
}
【
的,顾名思义就好了。这里不是说浅尝辄止,而是能加快我们了解哨兵模块工作原理。】
在这里 ,我 们无需知道 redisAsyncConnect(),redisAsyncCommand() 是做什么用
当 redis 服务器收到来自哨兵的数据时候,会向所有订阅 hello 频道的哨兵发布
数据,由此刚才注册的回调函数 sentinelReceiveHelloMessages() 就被调用了。回调函
数 sentinelReceiveHelloMessages() 做了两件事情:
1
2
. 发现其他监视同一 redis 服务器的哨兵
. 更新配置版本,当其他哨兵传递的配置版本更高的时候,会更新 redis 主服务器
配置(IP 地址和端口)