第八章 分布式系统的挑战
悲观的假设:所有可能出错的事情一定会出错;
故障来自:网络问题,时钟与时序问题;(网络分区归属网络故障之中)
关注于:分布式无共享系统,即仅通过网络传输数据,使用不可靠的组件构建可靠的系统;
超时时间通常是通过持续检测响应时间和抖动,动态设置;
异步网络通信可能出现的错误:
- 请求丢失,物理断网;
- 请求在某个队列中排队等待或者直接被丢失,也许网络或者接收方超负荷了;
- 远程接收节点宕机,或暂时无法响应;
- 远程节点的响应在传输过程中丢失,或网络,发送方超负荷;
检测故障
自动检测节点失效:
- 负载均衡器避免向已失效的节点分发请求;
- 主节点出现故障时,提升从节点提供服务;
网络拥塞与排队场景:
- 多节点向单节点同时发送数据,网络交换机会出现排队,即网络拥塞,且数据有因队列满了而被丢失的风险;
- cpu所有核心均处于繁忙状态时,网络数据包会被操作系统放入等待队列;
- tcp执行流量控制时,节点主动限制自己的发送速度,即在发送方上排队;
同步与异步网络
传统的固定电话网络,非常可靠,当拨打电话时,系统会动态建立一条电路,在整条线路上为呼叫分配一个固定的,带宽有保证的通信链路,维持到通话结束;
关键在于可预留固定的带宽,可保证最大的往返时间;
但对于tcp而言,可传输任意大小的数据块,动态调整传输速率,尽力在最短时间内完成数据传送,又因以太网和ip是基于分组交换,即不会事先确定带宽需求;
即前者是静态分配资源,而互联网是动态分配资源,由发送方竞争发送数据,交换机决定顺序,虽然容易出现排队,但也是最大限度利用了带宽;
不可靠的时钟
网络存在不确定的延迟,且节点间的时间也不一定能统一,还存在时钟偏移的问题;
两种时间计算形式
墙上时钟:指从1970...
到当前时间点的毫秒数,需要考虑节点的时钟准确性;
单调时钟:测量时间段,记录两次时钟值,取差;
单独依赖时间戳,使用lww
时,容易出现客观时间 后写入的数据 被 先写入的数据 覆盖,因为节点间的时钟可能有偏差,故可引入时钟的置信区间,参考spanner的设计;
进程暂停
即线程被暂停后,对自己被暂停过一无所知;
令牌号即版本号,防止旧请求生效;
拜占庭故障:即恶意伪造请求的节点,大多数情况下不考虑;