这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战
分布式系统与单节点系统有着比较显著的差别,如中间处理节点失效、不同节点之间的复制滞后问题等,在这里提出较为悲观的、系统性的阐述
故障与部分失效
对于单节点而言,只有两种可能,要么出错,要么可行,并且整个过程是可以复现的(即确定性)
- 对于分布式系统而言,其有着更多的步骤、更多的节点,这意味着会出现更多的、更加混乱的情况,如部分失效
大规模计算系统
实现思路:
- 集中构建包含大量计算单元的超级计算机集群,进行高性能计算
- 使用云计算,分布式系统
对于这两者问题不太一样,解决问题的思路也不太一样
-
对于高性能计算,使用快照的方式,保存在持久存储上,节点修复后,从快照处重新开始执行,类似单节点系统
-
云计算中会存在更多的问题\
-
- 需要提供7*24小时的低延迟在线服务,不存在停止服务进行修复的可能性
- 硬件成本更低,质量更加不好,使用通用性更高的硬件,有着更高的故障率
- 结构更加通用,不像高性能计算那样有着专门的结构进行特定计算工作的优化
- 系统越大意味着局部组件时效的可能性越大,简单的停止然后修复,在某些大型的系统,可能根本没有正常执行的时间
- 可以允许部分结点的失效,整体能够正常运行,例如支持滚动升级
- 节点的地理位置的差异,延迟更高、速度更慢、网络更加不可靠
主要可以从时间空间、整体部分、同步异步的角度进行思考
需要从软件的角度弥补组件上的不确定性与不可靠性
网络的不可靠性
网络是不同节点间通信的唯一手段(其他共享方式的成本也许很高,无需使用专门的硬件),而网络本身并不是可靠的,可能会出现以下问题
- 请求丢失
- 请求阻塞,无法立即到达(网络高负载)
- 接收节点失效
- 远程节点无法立刻进行响应执行(节点高负载)
- 远程节点执行完毕后的回复丢失
- 远程节点的回复网络延迟
其中如果没有收到回复,有可能是第一、三、五种情况
- 通常采用超时重传机制进行保证,但是在网络阻塞的情况下,超时重传有可能会加重网络阻塞
- 需要系统做出一定的反应,可以是错误的提示等,最好进行人为的触发与检测,防止出现严重的系统封锁死、数据错误等情况
节点的故障检测
为了维持系统的功能运行,需要能够进行自动的节点失效检测
- 避免继续给失效节点分配任务
- 主节点的选举
但是遗憾的是,由于网络带来的影响,确定目标节点是否失效非常困难,只有在特定场景才能够知道是哪一个地方出现了问题
超时与延迟
目前只能通过超时的方式进行故障的检测
-
超时设置时间?\
-
- 随着时间增大,判断准确度增加,但是等待时间也在增加
- 误判也会带来新的问题
网络拥塞
网络进行数据包的传输的时候都需要进行排队,而且排队可能出现在不同的位置
-
交换机排队,如果数据量过于庞大,可能会出现丢包
-
目标机器内部排队,当CPU满负荷,那么需要排队
-
在虚拟化场景下,切换不同的虚拟机会带来系统的暂停\
-
- 当你的邻居使用大量的资源,会导致你这边延迟升高,资源紧缺
\
- TCP流控制,应对目标节点没有处理完已发送数据的情况
- TCP拥塞控制,避免过大发送速率对网络造成更大的负荷
目前的主流网络都是使用数据包的形式进行网络复用,每一次发送都是尽可能、最快的进行数据的传输,如果要使用可靠的传输,可能需要进行固定频道的分配,可能会出现带宽浪费的情况
时钟不可靠
几乎计算机里面统计计算数据都需要使用到时钟,时间点记录、时间长度记录
时钟本身有可能出现问题,导致延迟、任务时间统计等出现差错
-
网络带来的接收时间顺序与发送时间顺序可能的不一致\
-
- 可能会导致各种问题,如数据的修改顺序不一致等
\
-
每一个硬件维护自己的时钟(也即石英振荡器),有两种方式进行不同硬件的时钟校准\
-
- NTP,通过一组时间服务器来调整本地时间
- 从高精度时间源获取高精度时间,如GPS接收机
时钟类别
-
墙上时钟\
-
- 日期时间等,就像现实生活中我们所用到的时钟
- 可以与NTP进行同步,但是,当本地时钟快过NTP时间的时候,如果把本地的时间进行回调,可能会出现一些很奇怪的事情(原来记录的某一些事件会被认为发生在未来)
\
-
单调时钟\
-
- 保证了时间是一直向前的,不会出现回拨的情况
- 更加适合测量时间段
- NTP通过调节石英振动频率的方式进行时间的调节
时钟同步与准确性
单调时钟需要进行调节,墙上时钟需要进行同步,但是时钟与NTP会出现一些状况
- 计算机中的石英振荡器的漂移
- 时钟与NTP差异过大可能会出现拒绝同步的情况
- 防火墙、网络等问题导致时钟同步失败、同步不准确,长时间没有进行时钟的同步
- NTP服务器故障
- 闰秒问题
- 虚拟机中,硬件时钟也是虚拟化的,多虚拟机可能是共享一个CPU的,在切换CPU的时候会出现时间的延迟
- 用户自定义时间
时钟不可靠的危害
时钟带来的危害可能不是立刻的,在某些对时间不敏感的应用中,不会有太大的影响,但是在某一些情况下可能会出现数据丢失的情况
- 当某些节点的时钟漂移超过上限的时候,可以将其移除集群,视为不可用,防止潜在的危险
事件顺序问题
当数据写入不同节点,需要对数据进行时间维度的操作,由于数据到达不同节点的时间不同,可能会丧失原有的时间顺序
\
-
广泛采用LWW的解决策略(最后写入获胜),但是依旧没有解决根本问题,最新值本身就取决于时钟,有着不确定性\
-
- 新数据先到,被后到的旧数据覆盖
- 无法区分高频写入与并发写入,需要因果关系进行限制
- 不同节点可能会产生相同的时间戳,不同数据有一样的时间戳
不将时间戳视为一个准确的时间, 而是一个置信区间,带有概率的成分
通过快照的方式来规避时间顺序带来的影响?早的数据看不到晚的数据,分布式系统的ID生成算法来保证顺序?