分布式系统中的两个主要问题:网络和时钟
分布式系统中的节点一定会失败,而且大多数时间是部分失效:即大部分组件是正常工作的,少部分失效。
并且分布式系统中确定组件失效也极其困难
用不可靠的组件构建可靠系统
1、异步网络
2、只能通过超时来判断组件是否失效,但是超时时间很难确定,太长:系统RTO恢复过长;太短:容易造成错误检测,在高负载下可能进一步加重系统负载,造成雪崩
使用普通硬件,很难得到一个准确的始终
时钟漂移
系统依赖时间戳来决定有序事件的执行顺序,但是如果时钟漂移,会导致执行顺序错乱。这也是LLW的冲突解决策略,发生于多领导者写入或者无主写入。
可以用逻辑时钟、全局时钟生成器、高精尖硬件时钟(google truetime API)等三种方式来解决
在创建快照时,后续的MVCC依赖于创建快照的准确时间,来确定后续读写的版本
进程在执行任何一条语句时可能会停顿(尤其是虚拟化的容器中,可以 挂起(suspend) 虚拟机(暂停执行所有进程并将内存内容保存到磁盘)并恢复(恢复内存内容并继续执行)。这个暂停可以在进程执行的任何时候发生,并且可以持续任意长的时间))。
这样在分布式系统中依赖时间判断采取执行的动作就可能会有很多并发问题
既然分布式系统中网络不可靠、时钟不可靠,那么怎么得到一个相对可靠的真相:多数派
分布式系统中的很多场景需要要求某些东西唯一:
1、中心化结构中的领导者
2、分布式锁
假如A服务获取到锁,并开启一个session,如果A进程停顿,导致session过期,之后,锁被B服务获取到,此时A服务停顿结束,认为它仍然持有锁,即系执行,就会错误。
解决方法是“防护令牌”:A除了session,还有token,每次A执行时,需要校验token,token与锁的有效性绑定