Anti-Entropy 机制只用于永久性的错误恢复,相反,Hinted handoff 应用在节点的故障率比较低且短暂失效的情况。
如果严格遵守 W + R > N且 (W>=1)的策略,那么意味着系统至少要一个首选列表中的主机活着,写操作才能成功。为了提高可用性,在有些特定的情况下,如,碰巧对于某个 key,其所有主要责任的所有节点都短暂失效,但其他的其他部分都正常,如 Data Center间的网络分割。放松这一要求,能提高系统的可用性。
Hinted handoff是用来处理系统短暂的失效的方法,当所有主要负责的 N个节点均失效的情况下,它试图将信息存放在非主要责任节点的一个特殊的位置,并记下一个 hint,其包含这次写操作的真正目标节点信息。当消息服务收到一个Gossip信号得知有新的节点从失败中恢复过来时,它查看该节点该节点有没有需要移交 (handoff)的数据。通过检查它是否是那个 hint提到的节点,如果是,包含 hint的那个节点将向它移交 (handoff) replica.
处理流程
Hinted Handoff实现为一个后台线程,并用一个队列来记录所有要移交的 hint信息。
- 从队列中取出一个代处理的 hinted-handoff
- 进行移交工作的节点,通过上面提到的特殊的位置得hint相关信息
- 基于上述hint 中的目标接收信息,通过消息中心发给目标接收的节点(即恢复的节点)
- 接收节点收到消息后,应用这个hint 到本地