• DDIA


    第8章, 分布式系统的麻烦.

    概览

    分布式系统与单机软件相比, 容易出错的多, 这里我们主要讨论几个问题

    1. 网络的问题
    2. 时钟和时序问题
    3. 思考一个分布式系统的状态,以及如何推理发生的事情

    漫谈

    部分失效(partition failure)
    在分布式系统中,尽管系统的其他部分工作正常,但系统的某些部分可能会以某种不可预知的方式被破坏。这被称为部分失效(partial failure)。难点在于部分失效是不确定性的(nonderterministic), 这种不确定性和部分失效的可能性,使得分布式系统难以工作.

    HPC vs 云计算
    高性能计算(HPC)领域, 具有数千个CPU的超级计算机通常用于计算密集型科学计算任务,如天气预报或分子动力学(模拟原子和分子的运动).
    云计算(cloud computing),云计算并不是一个良好定义的概念,但通常与多租户数据中心,连接IP网络的商品计算机(通常是以太网),弹性/按需资源分配以及计量计费等相关联.

    从不可靠的组件构建可靠的系统
    这个厉害, 例如IP层是不可靠的, 可能丢弃, 延迟, 复制或重排数据包, 但是基于IP上的TCP层是可靠的, 它确保丢失的数据包被重新传输, 消除重复, 并且数据包被重新组装成它们发送的顺序.

    网络的问题

    为什么数据中心网络和互联网使用分组交换?答案是,它们针对突发流量(bursty traffic)进行了优化。不做流量的预估和假设,尽可能的利用资源。

    时钟的不可靠

    单调钟与时钟
    时钟返回当前的日期与时间, linux的clock_gettime(CLOCK_REALTIME)和Java的System.currentTimeMillis()和C#的DateTime.Now, 时钟通常与NTP同步, 同步后有可能发生跳跃, 跳到之前的时间.

    单调钟用于测量时间间隔, linux的clock_gettime(CLOCK_MONOTONIC)和Java的System.nanoTime()和C#的Stopwatch.GetTimestamp()

    计算机中的石英钟不够精确, 30秒与NPT同步的时钟漂移6毫秒, 每天同步的时钟漂移17秒(Google的假设).

    逻辑时钟(logic clock)是基于递增计数器而不是振荡石英晶体, 对于排序来说是更安全的选择.

    暂停进程
    最常见的JVM的GC过长导致的问题, 由于GC过程中会暂停所有运行的线程, 线程恢复后并不知道自己被暂停了那么久, 再继续执行之前的代码时, 可能会发生问题.

    文中列了一种由于GC过长导致在分布式数据库中发生脑裂(brain split)的情况, 原主库即将租约到期, 接到请求后, 正在处理时被GC暂停了, 期间租约到期, 所以被另外一个从库接管租约了, 从库执行了这个请求, 待线程恢复后, 继续执行了该请求, 导致请求被执行两次, 数据库被重复写.

    知识, 真相, 谎言

    防护令牌
    为了避免上述行为的发生, 使用了防护令牌, 每次获得租约后会得到一个递增的token id, 每次写入存储服务时带上这个token id, 当新的租约写如存储服务后, 存储服务之后最新的token id, 然后拒绝掉之前的token id的行为.

    拜占庭故障
    拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了达到防御目的,每个军队都分隔很远,将军与将军之间只能靠信差传消息。在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成. 来自百度百科, https://baike.baidu.com/item/拜占庭将军问题/265656?fr=aladdin.

  • 相关阅读:
    Java byte类型转换成int类型时需要 & 0XFF的原因
    Java 原码 反码 补码
    HTTP 响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding
    [No0000E6]C# 判断与循环
    [No0000E5]C# 运算符
    [No0000E3]C# 数据类型
    [No0000E2]Vmware虚拟机安装 苹果系统 mac OS 10.12
    [No0000E1]C# 关键字
    [No0000E0]批量打开当前路径下的文件
    [No0000DF]C# ZipFileHelper ZIP类型操作,压缩解压 ZIP 类封装
  • 原文地址:https://www.cnblogs.com/winwink/p/DDIA7-Trouble.html
Copyright © 2020-2023  润新知