DDIA读书笔记【分布式系统的挑战,网络与时钟】

166 阅读7分钟

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

分布式系统与单节点系统有着比较显著的差别,如中间处理节点失效、不同节点之间的复制滞后问题等,在这里提出较为悲观的、系统性的阐述

故障与部分失效

对于单节点而言,只有两种可能,要么出错,要么可行,并且整个过程是可以复现的(即确定性)

  • 对于分布式系统而言,其有着更多的步骤、更多的节点,这意味着会出现更多的、更加混乱的情况,如部分失效

大规模计算系统

实现思路:

  • 集中构建包含大量计算单元的超级计算机集群,进行高性能计算
  • 使用云计算,分布式系统

对于这两者问题不太一样,解决问题的思路也不太一样

  • 对于高性能计算,使用快照的方式,保存在持久存储上,节点修复后,从快照处重新开始执行,类似单节点系统

  • 云计算中会存在更多的问题\

    • 需要提供7*24小时的低延迟在线服务,不存在停止服务进行修复的可能性
    • 硬件成本更低,质量更加不好,使用通用性更高的硬件,有着更高的故障率
    • 结构更加通用,不像高性能计算那样有着专门的结构进行特定计算工作的优化
    • 系统越大意味着局部组件时效的可能性越大,简单的停止然后修复,在某些大型的系统,可能根本没有正常执行的时间
    • 可以允许部分结点的失效,整体能够正常运行,例如支持滚动升级
    • 节点的地理位置的差异,延迟更高、速度更慢、网络更加不可靠

主要可以从时间空间、整体部分、同步异步的角度进行思考

需要从软件的角度弥补组件上的不确定性与不可靠性

网络的不可靠性

网络是不同节点间通信的唯一手段(其他共享方式的成本也许很高,无需使用专门的硬件),而网络本身并不是可靠的,可能会出现以下问题

  • 请求丢失
  • 请求阻塞,无法立即到达(网络高负载)
  • 接收节点失效
  • 远程节点无法立刻进行响应执行(节点高负载)
  • 远程节点执行完毕后的回复丢失
  • 远程节点的回复网络延迟

其中如果没有收到回复,有可能是第一、三、五种情况

  • 通常采用超时重传机制进行保证,但是在网络阻塞的情况下,超时重传有可能会加重网络阻塞
  • 需要系统做出一定的反应,可以是错误的提示等,最好进行人为的触发与检测,防止出现严重的系统封锁死、数据错误等情况

节点的故障检测

为了维持系统的功能运行,需要能够进行自动的节点失效检测

  • 避免继续给失效节点分配任务
  • 主节点的选举

但是遗憾的是,由于网络带来的影响,确定目标节点是否失效非常困难,只有在特定场景才能够知道是哪一个地方出现了问题

超时与延迟

目前只能通过超时的方式进行故障的检测

  • 超时设置时间?\

    • 随着时间增大,判断准确度增加,但是等待时间也在增加
    • 误判也会带来新的问题

网络拥塞

网络进行数据包的传输的时候都需要进行排队,而且排队可能出现在不同的位置

  • 交换机排队,如果数据量过于庞大,可能会出现丢包

  • 目标机器内部排队,当CPU满负荷,那么需要排队

  • 在虚拟化场景下,切换不同的虚拟机会带来系统的暂停\

    • 当你的邻居使用大量的资源,会导致你这边延迟升高,资源紧缺

\

  • TCP流控制,应对目标节点没有处理完已发送数据的情况
  • TCP拥塞控制,避免过大发送速率对网络造成更大的负荷

目前的主流网络都是使用数据包的形式进行网络复用,每一次发送都是尽可能、最快的进行数据的传输,如果要使用可靠的传输,可能需要进行固定频道的分配,可能会出现带宽浪费的情况

时钟不可靠

几乎计算机里面统计计算数据都需要使用到时钟,时间点记录、时间长度记录

时钟本身有可能出现问题,导致延迟、任务时间统计等出现差错

  • 网络带来的接收时间顺序与发送时间顺序可能的不一致\

    • 可能会导致各种问题,如数据的修改顺序不一致等

\

  • 每一个硬件维护自己的时钟(也即石英振荡器),有两种方式进行不同硬件的时钟校准\

    • NTP,通过一组时间服务器来调整本地时间
    • 从高精度时间源获取高精度时间,如GPS接收机

时钟类别

  • 墙上时钟\

    • 日期时间等,就像现实生活中我们所用到的时钟
    • 可以与NTP进行同步,但是,当本地时钟快过NTP时间的时候,如果把本地的时间进行回调,可能会出现一些很奇怪的事情(原来记录的某一些事件会被认为发生在未来)

\

  • 单调时钟\

    • 保证了时间是一直向前的,不会出现回拨的情况
    • 更加适合测量时间段
    • NTP通过调节石英振动频率的方式进行时间的调节

时钟同步与准确性

单调时钟需要进行调节,墙上时钟需要进行同步,但是时钟与NTP会出现一些状况

  • 计算机中的石英振荡器的漂移
  • 时钟与NTP差异过大可能会出现拒绝同步的情况
  • 防火墙、网络等问题导致时钟同步失败、同步不准确,长时间没有进行时钟的同步
  • NTP服务器故障
  • 闰秒问题
  • 虚拟机中,硬件时钟也是虚拟化的,多虚拟机可能是共享一个CPU的,在切换CPU的时候会出现时间的延迟
  • 用户自定义时间

时钟不可靠的危害

时钟带来的危害可能不是立刻的,在某些对时间不敏感的应用中,不会有太大的影响,但是在某一些情况下可能会出现数据丢失的情况

  • 当某些节点的时钟漂移超过上限的时候,可以将其移除集群,视为不可用,防止潜在的危险

事件顺序问题

当数据写入不同节点,需要对数据进行时间维度的操作,由于数据到达不同节点的时间不同,可能会丧失原有的时间顺序

\

  • 广泛采用LWW的解决策略(最后写入获胜),但是依旧没有解决根本问题,最新值本身就取决于时钟,有着不确定性\

    • 新数据先到,被后到的旧数据覆盖
    • 无法区分高频写入与并发写入,需要因果关系进行限制
    • 不同节点可能会产生相同的时间戳,不同数据有一样的时间戳

不将时间戳视为一个准确的时间, 而是一个置信区间,带有概率的成分

通过快照的方式来规避时间顺序带来的影响?早的数据看不到晚的数据,分布式系统的ID生成算法来保证顺序?