a) 故障检测
首先明确心跳是不是和用来进行故障检测的。在系统运行中可能出现各种错误,机器A收不到机器B的心跳包并不能认为B发生了故障并停止了服务,比如A和B之间的网络发生了故障,或者B过于繁忙无法响应A的心跳包。这就可能导致不一致问题的发生。
故障检测的关键在于两台机器对“机器B是否被认为发生故障且停止服务达成一致”,然而异步网络中的多台机器无法达成一致,但是实践中机器之间会进行时钟同步,我们假设两台机器之间本地时钟相差不大(比如小于0.5s),我们可以通过租约(Lease)机制进行故障检测。
租约机制是带有超时时间的授权,B从A处获得租约,只有在租约有效期内B对外提供服务,正常情况下,B不断向A请求租约以保证提供服务,但是当发生故障时,B无法获得新的租约,也就不能对外提供服务了。B上的数据可以进行迁移。但是考虑到本地时钟不一致的问题,A可以在租约超时时间+1s(提前量)时再认为B已经发生故障,
b) 故障恢复
对于单层结构,总控节点选择其他最新的副本代替故障节点上的副本对外提供服务,在等待一定时间后(比如1h),总控节点认为该节点永久下线,进行副本复制以保证每一个数据分片的副本数保持在一定数目。
对于双层结构,存储和服务分开,每个数据分片同一时间只有一个节点对外提供服务。当一个节点出现故障时,总控节点选择另外一个节点,加载A的服务并从底层分布式文件系统中加载A的数据到内存中。
总控节点也可能发生故障,为此,总控节点的状态会实时同步到备机,故障发生时,通过某个外部的高可用服务选举一个备机为总控节点。