《数据密集型应用系统设计》读书笔记整理(8)-- 分布式系统的挑战


嘿,我刚刚认识你,
网络滞后问题,
这里是我的数据,
希望你能保存它们。
——Kyle Kingsbury,Carly Rae Jepsen 与网络分区风险专栏系列(2013)

要使分布式系统可靠工作,就必然面临部分失效,这就需要依靠软件系统来提供容错机制。我们需要在不可靠的组件之上构建可靠的系统。

不可靠的网络

系统一般通过超时机制来自动检测节点是否失效,设置超时时间一个比较好的做法是,持续测量响应时间及其变化(抖动),然后根据最新的响应时间分布来自动调整。TCP超时重传也采用了类似的机制。

不可靠的时钟

时钟

系统和应用程序以各种方式依赖时钟,一般需要测量持续时间和获取某个时间点。

在分布式系统中,由于网络的不确定延迟,跨节点通信无法即时完成,精确测量时间面临着很多挑战。使得多节点通信时很难确定事情发生的先后顺序。

计算机内部一般至少有两种不同的时钟:墙上时钟和单调时钟,它们服务于不同的目的。墙上时钟返回当前的日期和时间,单调时钟更适合测量持续时间段(时间间隔)。单调时钟保证总是向前,不会出现墙上时钟的回拨现象。

对于排序来说,基于递增计数器而不是振荡石英晶体的逻辑时钟是更可靠的方式。逻辑时钟测量事件的相对顺序,与之对应,墙上时钟和单调时钟属于物理时钟。

当数据库分布在多台机器上时,需要复杂的协调以产生全局的、单调递增的事务ID(跨所有分区)。在分布式系统中创建事务ID通常会引入瓶颈。另外借助时钟同步来处理分布式事务语义是一个非常有趣和活跃的研究领域,但除了Google以外,目前主流数据库还没有更多的实现。

进程暂停

另外分布式系统中的一个节点必须假定,执行过程中的任何时刻都可能被暂停相当长一段时间。而暂停期间,整个集群的其他部分都在照常运行,甚至会一致将暂停的节点宣告为故障节点。最终,暂停的节点可能会回来继续运行,除非再次检查时钟,否则它对刚刚过去的暂停毫无意识。

某些软件如果在指定时间内无法响应则会导致严重后果,包括:飞机、火箭、机器人、汽车和其它需要对输入传感器快速做出响应的组件等。对于这些系统,它须优先考虑并响应高优先级的请求,同时软件有一个必须作出响应的上限:如果无法满足,会导致系统级故障,这就是硬实时系统。

关于GC造成的进程暂停,现在一个较新的想法是把GC暂停视为节点的一个计划内临时离线,当节点启动垃圾回收时,通知其它节点来接管客户端的请求。此外,系统可以提前为前端应用发出预警,应用会等待当前请求完成,但停止向该节点发送新请求,这样垃圾回收可以在无干扰的情况下高效运行。这个技巧以某种方式对客户端隐藏垃圾回收,降低负面影响。目前一些对延迟敏感的系统(如金融交易系统)已经采用了该方法。

知识,真相与谎言

真相由多数决定

节点不能根据自己的信息来判断自身的状态,分布式系统不能完全依赖于某个节点。目前许多分布式算法都依靠法定票数,即在节点之间进行投票。任何决策都需要来自多个节点的最小投票数,从而减少对特定节点的依赖。

当使用锁和租约机制来保护资源的并发访问时,必须确保过期的”唯一的那个”节点不能影响其他正常部分,可采用fencing技术。每次锁服务在授予锁或租约时,同时返回一个fencing令牌,该令牌每授予一次就会递增。然后,要求客户端每次向存储系统发送写请求时,都必须包含所持有的fencing令牌,锁服务通过拒绝旧令牌的写操作以确保存储安全。

拜占庭故障

如果分布式系统中的节点存在”撒谎”的情况,即故意发送错误的或破坏性的响应,这种行为称为拜占庭故障,在这样不信任的环境中需要达成共识的问题也被称为拜占庭将军问题。如果某个系统中即使发生部分节点故障,甚至不遵从协议,或者恶意攻击、干扰网络,但仍可以继续正常运行,那么我们称之为拜占庭容错系统。如航空航天领域的飞行控制系统、类似比特币的点对点网络等。大多数拜占庭容错算法要求系统超过三分之二的节点即绝大多数要功能正常。

理论系统模型与现实

计时方面,有三种常见的系统模型:

  • 同步模型,假定有上界的网络延迟、进程暂停和时钟误差。大多数实际系统的实际模型并非同步模型。
  • 部分同步模型,系统大多数情况下像一个同步系统一样运行,但有时候会超出网络延迟、进程暂停和时钟漂移的预期上界。
  • 异步模型,算法不对时机做任何的假设,甚至里面根本没有时钟(也就没有超时机制)。该模型不常见。

节点失效有以下三种最常见的失效系统模型:

  • 崩溃-中止模型,算法假定一个节点只能以一种方式发生故障,即遭遇系统崩溃。意味着节点可能在任何时候突然停止响应,且该节点以后永远消失,无法恢复。
  • 崩溃-恢复模型,节点可能在任何时候发生崩溃,且可能会在一段(未知的)时间之后得到恢复并再次响应。
  • 拜占庭(任意)失效模型,节点可能发生任何事情,包括试图作弊和欺骗其它节点。

对于真实系统的建模,最普遍的组合是崩溃-恢复模型结合部分同步模型。

我们可以通过描述目标分布式算法的相关属性来定义其正确性。安全性通常可以理解为”没有发生意外”,而活性类似”预期的事情最终一定会发生”。

抽象的系统模型把实际系统中的复杂性提炼成一个更容易理解、更具可控性的抽象错误集合,可以有效帮助我们理解问题之本质,然后设计系统性方法来最终解决问题。


参考文献:
[1] (美)Martin Kleppmann. 数据密集型应用系统设计(赵军平,吕云松,耿煜,李三平 译)[M]. 北京:中国电力出版社,2018.

Published

Author

Levin

Category

Web Arch

Tags

web arch database book report
Disqus loading now...