2023/11/11 9:00
云计算基于不可靠的商品机器构建而成,规模经济下,成本低,但是故障率高
所以基于不可靠硬件构建可靠的分布式系统 - 如IP 、纠错码等传统的互联网协议,亦是如此。
不稳定的网络
互联网和数据中心一般都是异步分组网络,即不保证是否可达、丢失。
当发生网络分区的时候,可以选择主动检测(如负载均衡选择不转发到对应节点、主从复制重新选举主节点)
也可以选择超时 - 但是如果一个系统仅仅是因为负载太高,导致超过了超时时间,那么放弃这个节点造成的影响就很大,所以最好的是连续测量响应时间,自动调整。
不可靠的时钟
分布式的计算的时间同步是一个比较关键的事情,如日志记录时间等。
因为网络延迟,涉及到多台机器发生的顺序,我们是无法确定的。
对于计算机单机,一般是石英晶体的震荡完成自己的时间;如果需要简单的时间同步,可以使用网络时间协议(NTP) 调整时钟。
如果需要更加精准,可以使用GPS接收机。
时钟:返回 epoch(1970-1-1)以来的秒数 , 也是和NTP同步的时间。这个时间一个系统可能会跳跃、回退等以保持同步,不可控。
单调钟:适用于测量持续时间,System.nanoTime() , 精度很高,是系统自己启动和关闭的时间差。 - 可能每一个CPU有自己单独的计时器。
时钟是很不准确的,例如虚拟机就可以虚拟化自己的硬件时钟、并且计算机自己的石英钟也是存在偏移的 ,平均每30s便宜6ms
依赖同步时钟完成同步的话,可能也会遇到NTP服务器崩溃等因素
物理时钟: 上面的时钟和单调钟
逻辑时钟:分布式的全局递增计数器 - 为了防止最后写入为准(lWW): 具有滞后时钟的节点覆盖之前节点写入的值
那么如何完成一个全局的递增计数器呢?
Spanner使用携带置信区间的时间戳来确定时间的先后关系,如果区间没有重叠,即认为是一个存在先后关系的时钟。
Twiter使用将ID空间分配给不同的节点,完成近似单调增加。
这里也会引入一个如果程序出现暂停 - 比如GC、进程被暂停的场景下,如果基于时钟限制获取某一个事物 - 比如租约的时候,可能会出现其他节点因为超时获取租约了,但是自己暂停恢复后,认为租约依然有效,出现双租约的节点的问题。
一般对于这种,可以选择将GC暂停视作一个节点的短暂计划中断。同时加上检查一个防护令牌来判断持有的令牌是不是最新发放的保证只有一个节点可以写。
我该相信谁
分布式系统不能完全一个单节点,即至少需要半数以上节点达成共识 - 三姐点允许单节点故障、五节点允许两节点故障。
当系统出现了部分节点恶意声称收到了指定的消息 - 拜占庭将军问题