加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

MongoDB一次节点宕机引发的思考

发布时间:2019-11-05 18:41:03 所属栏目:建站 来源:java架构coid
导读:副标题#e# 简介 最近一个 MongoDB 集群环境中的某节点异常下电了,导致业务出现了中断,随即又恢复了正常。 通过ELK 告警也监测到了业务报错日志。 运维部对于节点下电的原因进行了排查,发现仅仅是资源分配上的一个失误导致。 在解决了问题之后,大家也对

第一个是 _scheduleNextLivenessUpdate_inlock这个函数,它的作用在于保活状态检测,如下:

  1. void ReplicationCoordinatorImpl::_scheduleNextLivenessUpdate_inlock() { 
  2.  //仅仅支持3.2+ 
  3.  if (!isV1ElectionProtocol()) { 
  4.  return; 
  5.  } 
  6.   
  7.  // earliestDate 取所有节点中更新时间最早的(以尽可能早的发现问题) 
  8.  // electionTimeoutPeriod 默认为 10s 
  9.  auto nextTimeout = earliestDate + _rsConfig.getElectionTimeoutPeriod(); 
  10.   
  11.  // 设置超时回调函数为 _handleLivenessTimeout 
  12.  auto cbh = _scheduleWorkAt(nextTimeout, 
  13.  stdx::bind(&ReplicationCoordinatorImpl::_handleLivenessTimeout, 
  14.  this, 
  15.  stdx::placeholders::_1)); 

因此,在大约10s后,如果没有什么意外,_handleLivenessTimeout将会被触发,如下:

  1. void ReplicationCoordinatorImpl::_handleLivenessTimeout(...) { 
  2.  ... 
  3.  for (auto&& slaveInfo : _slaveInfo) { 
  4.  ... 
  5.  //lastUpdate 不够新(小于electionTimeout) 
  6.  if (now - slaveInfo.lastUpdate >= _rsConfig.getElectionTimeoutPeriod()) { 
  7.  ... 
  8.  //在保活周期后仍然未更新节点,置为down状态 
  9.  slaveInfo.down = true; 
  10.  //如果当前节点是主,且检测到某个备节点为down的状态,进入memberdown流程 
  11.  if (_memberState.primary()) { 
  12.   
  13.  //调用_topCoord的setMemberAsDown方法,记录某个备节点不可达,并获得下一步的指示 
  14.  //当大多数节点不可见时,这里会获得让自身降备的指示 
  15.  HeartbeatResponseAction action = 
  16.  _topCoord->setMemberAsDown(now, memberIndex, _getMyLastDurableOpTime_inlock()); 
  17.  //执行指示 
  18.  _handleHeartbeatResponseAction(action, 
  19.  makeStatusWith<ReplSetHeartbeatResponse>(), 
  20.  true); 
  21.  } 
  22.  } 
  23.  } 
  24.  //继续调度下一个周期 
  25.  _scheduleNextLivenessUpdate_inlock(); 

可以看到,这个定时器主要是用于实现主节点对其他节点的保活探测逻辑:

当主节点发现大多数节点不可达时(不满足大多数原则),将会让自己执行降备

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读