redis sentinel哨兵机制的源码分析

本文深入探讨了Redis Sentinel系统的高可用性解决方案,详细分析了哨兵如何监测主库下线状态,包括主观下线和客观下线的判断,并介绍了故障转移的过程,包括领头sentinel的选举及故障转移的三个关键步骤。通过源码解析,阐述了Sentinel如何确保数据安全和系统稳定性。
摘要由CSDN通过智能技术生成

        sentinel是redis的高可用性解决方案:由一个或多个sentinel实例组成sentinel系统监视多个master以及master的slave,并在被监视的master进入下线状态时,自动将下线master的某个slave升级为master,然后新的master代替下线的master处

理命令请求。

                            

  一、下线状态监测

 (1)、主观下线监测

        在默认情况下,sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(master、slave、sentinel)发送ping,如果实例在down_after_period时间内,没有返回正确回复,标记为SRI_S_DOWN,反之,标记为正常状态。

       由定时任务serverCron定期监听所有连接实例

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
    ……
    run_with_period(100) {
        //如果是哨兵服务器,触发sentinelTimer
        if (server.sentinel_mode) sentinelTimer();
    }
    ……
}
void sentinelTimer(void) {
    ……
    sentinelHandleDictOfRedisInstances(sentinel.masters);
    ……
}//检查所有连接实例
void sentinelHandleDictOfRedisInstances(dict *instances) {
    ……//instances为sentinelState->masters
    while((de = dictNext(di)) != NULL) {
        sentinelRedisInstance *ri = dictGetVal(de);
        sentinelHandleRedisInstance(ri);
        if (ri->flags & SRI_MASTER) {
            sentinelHandleDictOfRedisInstances(ri->slaves);
            sentinelHandleDictOfRedisInstances(ri->sentinels);
            ……
            }
        }
    }
    ……
}
void sentinelHandleRedisInstance(sentinelRedisInstance *ri) {
    ……//发送ping给这个实例
    sentinelSendPeriodicCommands(ri);
    //检查是否主观下线
    sentinelCheckSubjectivelyDown(ri);
    ……
}//主观下线检查
void sentinelCheckSubjectivelyDown(sentinelRedisInstance *ri) {
    mstime_t elapsed = 0;
    //收到pong后,act_ping_time会被置为0
    if (ri->link->act_ping_time)
        elapsed = mstime() - ri->link->act_ping_time;
    if (elapsed > ri->down_after_period ||
        (ri->flags & SRI_MASTER &&ri->role_reported == SRI_SLAVE &&
         mstime() - ri->role_reported_time >
          (ri->down_after_period+SENTINEL_INFO_PERIOD*2)))
    {//实例之前不是下线状态,更新为下线状态同时更新下线时间
        if ((ri->flags & SRI_S_DOWN) == 0) {
            ri->s_down_since_time = mstime();
            ri->flags |= SRI_S_DOWN;
        }
    } else
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值