DDIA读书笔记【分布式系统的挑战,分布式模型】

151 阅读3分钟

这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

如何判断实际情况与修复

在上文我们看到有很多原因可以导致分布式系统出现问题,但是很难确认具体是什么原因导致的,因此我们要自己探索什么是真相什么是谎言

  • 通过假设的方式验证某一些算法的正确性

真相由大多数决定

由严重到轻微有三种情况

  • 该节点运行良好,可以正常接收其他节点发送的消息,但是其发出的消息由于网路问题被丢弃或者延期超时
  • 该节点能意识到自己的网络并不好
  • 该节点因为GC等原因暂停服务,让其他节点以为该节点挂了,但是一段时间后其又可以正常进行工作了

每个节点都有可能会出现各种状况,分布式系统决策需要去中心化

  • 许多使用的是投票机制,由多数决定该节点是否有效,如果大部分节点觉得其已经失效,即使该节点没有失效,我们都认为其已经下线了,可以运用在其他的场景\

    • 在某一些场景下,需要选举出某一个特殊节点(如数据库的主节点)或者说唯一一个实例(如ID、锁)\

      • 限制只能有一个节点在使用,如果采用简单的过期机制,可能也会出现误判节点问题,导致数据出错
      • 需要保证过期的、下线的节点不会影响其他节点,使用fencing技术,每次进行租用唯一实例的时候,会产生一个递增的令牌,在对唯一实例进行操作的时候,需要带上该令牌,防止下线节点的影响
      • 在更为极端的情况下,节点本身尝试破坏(节点不可信),如何保证唯一实例的安全性

拜占庭故障

实际上分布式系统的问题主题要有三种:

  • 网络的不可靠
  • 节点的不可靠
  • 节点不诚实,即故意出现错误或者破坏性行为,而对外声称自己是正常的(如自己本没有收到消息,却向外声称自己收到了)

第三种被称为拜占庭故障,指在不信任环境下达成共识的问题,如果在该环境下可以正常运行,我们称为拜占庭式容错系统

在本书中暂且不讨论相关问题,在大多数服务器端数据系统中,部署拜占庭容错系统基本不太可行

分布式模型及其前提

分布式系统已经有许多不错的算法,但是都建立在一定的硬件、软件前提之上

实际上这些前提都可以在系统功能上有明确的、统一的表现,在这里进行形式化的描述

在时间计算方面:

  • 同步模型\

    • 所有的延迟、误差等都是有上界的

\

  • 部分同步模型\

    • 大多数情况下与同步模型无异,但是有时会超出上界

\

  • 异步模型\

    • 与时机没有任何关系,甚至根本没有时钟

在节点失效处理上:

  • 崩溃-中止模型\

    • 节点只会发生一种故障,且发生后节点将无法恢复

\

  • 崩溃-恢复模型\

    • 节点失效后会在一段时间后恢复,永久性存储中的数据并不会丢失

\

  • 任意失效模型

在大部分情况下是崩溃恢复+部分同步模型

在现实生活中并不是一直这么理想的,硬件可能会损坏、数据记录可能会丢失等等