前言
相比于无状态的分布式系统,有状态的数据库在分布式领域将会面临更多的挑战。
故障模型
每个节点保存本地状态,通过网络来互相同步这些状态。同时节点需要访问时间组件来获取当前时间(逻辑时间或物理时间)。
这些环节没有一个是可靠的。不可靠贯穿了分布式系统的整个生命周期。
引起故障的原因
误区 1:认为远程执行会马上返回结果。请求到达远程节点后很可能被放进队列缓冲而不是马上执行
误区 2:所有节点时间是一致的。该误区普遍且危险。分布式数据库会使用原子钟解决时间一致性。
本地物理时间另一个问题是会产生回溯:即后获取的时间可能比先获取的时间更靠前。
逻辑时间也会产生时间回溯问题,为什么说逻辑时间比物理时间重要呢?
网络分区:指的是分布式系统的节点被网络故障分割成不同的小块。带来的问题难以解决,因为非常难以发现。
雪崩现象:一个单一的读故障可能会引起大规模级联反应,从而放大故障的影响面。
解决级联故障的方式有退避算法和断路。
- 退避算法:依靠客户端保证服务端高可用的一种手段
- 断路:从服务端进行直接保护
崩溃故障
遭遇故障后,进程完全停止工作,又称崩溃停止故障,特比强调故障节点不需要再参与回分布式系统内部。实际分布式系统很少采用,缺点是浪费资源。
崩溃节点恢复是主流模式。通过数据复制从而生成备份节点,而后进行快速热切换才是最为主流的方式。
崩溃故障可以被认为是遗漏故障的特例。
遗漏故障
指的是消息没有被远程节点执行,相比于崩溃故障来说更不可预测。产生原因有三种:
- 消息发送之后没有送达远程节点
- 远程节点跳过消息处理或根本无法执行(一种特例就是崩溃故障,节点无法回复消息)
- 后者处理结果无法发送给其他节点
网络分区是遗漏故障的典型案例。部分节点之间通信困难。而崩溃故障是所有节点之间都无法通信。
另一个典型的情况是一个节点的处理速度远远慢于系统平均水平,从而它的数据总是旧的。而此时它没有崩溃,依然会将这些旧数据发送给集群内的其他节点。
遗漏故障还可能发生在网络过载、远程消息队列满等问题中。
拜占庭故障
又称为任意故障,相比于上述两种故障是最不好预测的。往往是程序 bug 产生的,可以通过严格软件开发的流程管理来尽可能规避。
航空类系统选择并不信任从远程获得的数据,而是从多个节点获得信息并比对,最后产生相对正确的结果。
节点故意发送错误消息,目的是想破坏系统的正常运行从而牟利。采用区块链技术的熟悉货币系统则是使用正面奖励的模式(BFT)吗,保证系统内大部分节点不“作恶”(做正确的事的收益明显高于作恶)。
错误侦测与领导选举
错误侦测的一个重要应用领域是领导选举。
复制与一致性
故障容忍系统一般使用复制技术产生多个副本来提供系统的可用性。
本模块讨论客户一致性,或称为会话一致性;讨论最终一致性这种若一致性模型;讨论分布式事务。
共识算法
共识算法是为了解决拜占庭将军的问题而产生的。
共识可以解决遗漏故障。因为只要系统内大部分节点达成共识,剩下的节点即使遗漏该消息,也能对外提供正确的数据。
行为 | 描述 | 对应课时 |
---|---|---|
协调(Coordination) | 由一个节点来统一管理和协调其他工作节点 | 15-领导选举 |
合作(Cooperation) | 多个节点合作共同完成一项工作,是现行的并行处理模型 | 16-再谈一致性,18 分布式事务 |
传播(Dissemination) | 消息被快速可靠的传播到系统中的所有节点当中 | 16-再谈一致性,17 数据可靠传播 |
共识(Consensus) | 在集群内对一份数据达成共识 | 19-共识算法 |