EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

NoSQL-分布式系统设计问题

前言

相比于无状态的分布式系统,有状态的数据库在分布式领域将会面临更多的挑战。

故障模型

每个节点保存本地状态,通过网络来互相同步这些状态。同时节点需要访问时间组件来获取当前时间(逻辑时间或物理时间)。

这些环节没有一个是可靠的。不可靠贯穿了分布式系统的整个生命周期。

引起故障的原因

误区 1:认为远程执行会马上返回结果。请求到达远程节点后很可能被放进队列缓冲而不是马上执行

误区 2:所有节点时间是一致的。该误区普遍且危险。分布式数据库会使用原子钟解决时间一致性。

本地物理时间另一个问题是会产生回溯:即后获取的时间可能比先获取的时间更靠前。

逻辑时间也会产生时间回溯问题,为什么说逻辑时间比物理时间重要呢?

网络分区:指的是分布式系统的节点被网络故障分割成不同的小块。带来的问题难以解决,因为非常难以发现。

雪崩现象:一个单一的读故障可能会引起大规模级联反应,从而放大故障的影响面。

解决级联故障的方式有退避算法断路

  • 退避算法:依靠客户端保证服务端高可用的一种手段
  • 断路:从服务端进行直接保护

崩溃故障

遭遇故障后,进程完全停止工作,又称崩溃停止故障,特比强调故障节点不需要再参与回分布式系统内部。实际分布式系统很少采用,缺点是浪费资源。

崩溃节点恢复是主流模式。通过数据复制从而生成备份节点,而后进行快速热切换才是最为主流的方式。

崩溃故障可以被认为是遗漏故障的特例。

遗漏故障

指的是消息没有被远程节点执行,相比于崩溃故障来说更不可预测。产生原因有三种:

  1. 消息发送之后没有送达远程节点
  2. 远程节点跳过消息处理或根本无法执行(一种特例就是崩溃故障,节点无法回复消息)
  3. 后者处理结果无法发送给其他节点

网络分区是遗漏故障的典型案例。部分节点之间通信困难。而崩溃故障是所有节点之间都无法通信。

另一个典型的情况是一个节点的处理速度远远慢于系统平均水平,从而它的数据总是旧的。而此时它没有崩溃,依然会将这些旧数据发送给集群内的其他节点。

遗漏故障还可能发生在网络过载、远程消息队列满等问题中。

拜占庭故障

又称为任意故障,相比于上述两种故障是最不好预测的。往往是程序 bug 产生的,可以通过严格软件开发的流程管理来尽可能规避。

航空类系统选择并不信任从远程获得的数据,而是从多个节点获得信息并比对,最后产生相对正确的结果。

节点故意发送错误消息,目的是想破坏系统的正常运行从而牟利。采用区块链技术的熟悉货币系统则是使用正面奖励的模式(BFT)吗,保证系统内大部分节点不“作恶”(做正确的事的收益明显高于作恶)。

错误侦测与领导选举

错误侦测的一个重要应用领域是领导选举。

复制与一致性

故障容忍系统一般使用复制技术产生多个副本来提供系统的可用性。

本模块讨论客户一致性,或称为会话一致性;讨论最终一致性这种若一致性模型;讨论分布式事务。

共识算法

共识算法是为了解决拜占庭将军的问题而产生的。

共识可以解决遗漏故障。因为只要系统内大部分节点达成共识,剩下的节点即使遗漏该消息,也能对外提供正确的数据。

行为 描述 对应课时
协调(Coordination) 由一个节点来统一管理和协调其他工作节点 15-领导选举
合作(Cooperation) 多个节点合作共同完成一项工作,是现行的并行处理模型 16-再谈一致性,18 分布式事务
传播(Dissemination) 消息被快速可靠的传播到系统中的所有节点当中 16-再谈一致性,17 数据可靠传播
共识(Consensus) 在集群内对一份数据达成共识 19-共识算法