etcd中raft协议的消息(七)——快照复制消息(MsgSnap消息)

MsgSnap消息

       通过前面介绍的raft.sendAppend()方法可知,在Leader节点尝试向集群中的Follower节点发送MsgApp消息时,如果查找不到待发送的Entry记录(即该Follower节点对应的Progress.Next指定的Entry记录),则会尝试通过MsgSnap消息将快照数据发送到Follower节点,Follower节点之后会通过快照数据回复其自身状态,从而可以与Leader节点进行正常的Entry记录复制。例如当Follower节点宕机时间较长,就会出现上述发送MsgSnap消息的场景。

Leader发送MsgSnap消息的主要流程如下:

       1.上述两次raftLog查找出现异常时(获取不到需要发送的Entry记录),就会形成MsgSnap消息,将快照数据发送到指定节点。

       2.向该节点发送MsgSnap类型的消息

       3.将目标Follower节点对应的Progress切换成ProgressStateSnapshot状态  

func (r *raft) sendAppend(to uint64) {
	pr := r.getProgress(to)  //获取目标节点的Progress
	if pr.IsPaused() { //检测当前节点是否可以向目标节点发送消息
		return
	}
	m := pb.Message{} //创建待发送的消息
	m.To = to	//设置目标节点的ID

	term, errt := r.raftLog.term(pr.Next - 1)  //pr.Next是下个待复制Entry的索引位置,获取Next索引对应的记录的Term值
	ents, erre := r.raftLog.entries(pr.Next, r.maxMsgSize)	//获取需要发送的Entry记录(ents)

	if errt != nil || erre != nil { // 上述两次raftLog查找出现异常时,就会形成MsgSnap消息,将快照数据发送到指定节点。
	
		if !pr.RecentActive { //如果该节点已经不存活,则退出(RecentActive为true表示该节点存活)
			r.logger.Debugf("ignore sending snapshot to %x since it is not recently active", to)
			return
		}

		m.Type = pb.MsgSnap  //将消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值