上一篇(ch.7)

下一篇(ch.9)

第八章 分布式系统的挑战

悲观的假设:所有可能出错的事情一定会出错;

  故障来自:网络问题,时钟与时序问题;(网络分区归属网络故障之中)

  关注于:分布式无共享系统,即仅通过网络传输数据,使用不可靠的组件构建可靠的系统;

  超时时间通常是通过持续检测响应时间和抖动,动态设置;

异步网络通信可能出现的错误:

  • 请求丢失,物理断网;
  • 请求在某个队列中排队等待或者直接被丢失,也许网络或者接收方超负荷了;
  • 远程接收节点宕机,或暂时无法响应;
  • 远程节点的响应在传输过程中丢失,或网络,发送方超负荷;

检测故障

自动检测节点失效:

  • 负载均衡器避免向已失效的节点分发请求;
  • 主节点出现故障时,提升从节点提供服务;

网络拥塞与排队场景:

  • 多节点向单节点同时发送数据,网络交换机会出现排队,即网络拥塞,且数据有因队列满了而被丢失的风险;
  • cpu所有核心均处于繁忙状态时,网络数据包会被操作系统放入等待队列;
  • tcp执行流量控制时,节点主动限制自己的发送速度,即在发送方上排队;

同步与异步网络

  传统的固定电话网络,非常可靠,当拨打电话时,系统会动态建立一条电路,在整条线路上为呼叫分配一个固定的,带宽有保证的通信链路,维持到通话结束;

  关键在于可预留固定的带宽,可保证最大的往返时间;

  但对于tcp而言,可传输任意大小的数据块,动态调整传输速率,尽力在最短时间内完成数据传送,又因以太网和ip是基于分组交换,即不会事先确定带宽需求;

  即前者是静态分配资源,而互联网是动态分配资源,由发送方竞争发送数据,交换机决定顺序,虽然容易出现排队,但也是最大限度利用了带宽;

不可靠的时钟

  网络存在不确定的延迟,且节点间的时间也不一定能统一,还存在时钟偏移的问题;

两种时间计算形式

  墙上时钟:指从1970...到当前时间点的毫秒数,需要考虑节点的时钟准确性;

  单调时钟:测量时间段,记录两次时钟值,取差;

  单独依赖时间戳,使用lww时,容易出现客观时间 后写入的数据 被 先写入的数据 覆盖,因为节点间的时钟可能有偏差,故可引入时钟的置信区间,参考spanner的设计;

进程暂停

即线程被暂停后,对自己被暂停过一无所知;

令牌号即版本号,防止旧请求生效;

拜占庭故障:即恶意伪造请求的节点,大多数情况下不考虑;