读构建可扩展分布式系统:方法与实践03分布式系统要点

news2024/11/16 9:37:53

1. 通信基础

1.1. 每个分布式系统都包含通过网络进行通信的软件组件

1.2. 硬件

  • 1.2.1. 全球互联网就是一台异构机器,由不同类型的网络通信通道和设备组成,它们每秒将数百万条消息通过网络传送到预定目的地

  • 1.2.2. 对于单个光纤链路,可以提供每秒超过70 Tbps的总带宽

  • 1.2.3. 广域网的延迟更为复杂

    • 1.2.3.1. 广域网传输数据的距离可达数百乃至数千公里,数据在光纤电缆中传输的最大速度是理论光速
  • 1.2.4. 路由器是专用高速网络设备,它可以处理数百Gbps的网络流量,从传入连接中提取数据并根据目的地将数据发送到不同的传出网络连接

    • 1.2.4.1. 家里和办公室中的WiFi路由器都是无线以太网网络,使用802.11协议发送和接收数据

    • 1.2.4.2. 使用最广泛的WiFi协议是802.11ac(WiFi 5),它允许最大(理论)数据速率高达5400 Mbps

    • 1.2.4.3. 最新的802.11ax协议,也称WiFi 6,是由802.11ac技术演变的,声称已将吞吐量提高至9.6 Gbps

    • 1.2.4.4. WiFi路由器的范围是几十米的数量级,会受到墙壁和地板等物理障碍的影响

  • 1.2.5. 蜂窝无线技术使用无线电波将数据从手机发送到安装在手机信号塔上的路由器,路由器通常通过电线连接到核心互联网来进行消息路由

    • 1.2.5.1. 5G基站的最大覆盖范围约为500 m

    • 1.2.5.2. 4G可在10~15 km内提供可靠的接收

  • 1.2.6. 一级网络是全球高速互联网骨干网

    • 1.2.6.1. 大约有20家一级ISP(互联网服务提供商)负责管理和控制全球流量
  • 1.2.7. 二级ISP通常是区域性

    • 1.2.7.1. 带宽低于一级ISP,并通过三级ISP向客户提供内容
  • 1.2.8. 三级ISP是每月向你收取高额家庭互联网费用的ISP

1.3. 软件

  • 1.3.1. 互联网上的软件系统使用IP(互联网协议)套件进行通信

    • 1.3.1.1. 互联网是一个数据包交换网络,每个数据包都在网络中单独路由

    • 1.3.1.2. 因为网络数据包在发送方和接收方之间的传输过程中可能会丢失或延迟,所以可靠性是必需的

  • 1.3.2. 四个抽象层

    • 1.3.2.1. 数据链路层,定义了跨单个网段的数据通信方法

    • 1.3.2.2. 网络层,指定寻址和路由协议,使流量能够穿越构成互联网的独立管理和控制的网络

      1.3.2.2.1. 是互联网协议家族中的IP层

    • 1.3.2.3. 传输层,定义了可靠和尽力而为的主机到主机通信的协议

      1.3.2.3.1. 是著名的TCP(传输控制协议)和UDP(用户数据报协议)所在的层

    • 1.3.2.4. 应用层,其中包含多个应用程序级协议

      1.3.2.4.1. HTTP和SCP(安全复制协议)

  • 1.3.3. IP

    • 1.3.3.1. IP定义了如何在互联网上为主机分配地址,以及如何在知道彼此地址的两个主机之间传输消息

    • 1.3.3.2. 互联网上的每个设备都有自己的地址,也称为IP地址

    • 1.3.3.3. IP地址的位置可以在互联网范围的目录服务DNS(域名系统)中找到

      1.3.3.3.1. DNS服务器是分层组织的

      1.3.3.3.2. 整个DNS数据库在地理上高度复制,因此没有单点故障,同时请求被分布在多个物理服务器上

    • 1.3.3.4. 用于分配IP地址的技术称为IPv4(互联网通信协议第4版)​,它将被后继者IPv6取代

      1.3.3.4.1. IPv4是32位寻址方案,由于连接到互联网的设备数量不断增加,不久的将来就会用完地址

    • 1.3.3.5. IPv6是128位方案,提供(几乎)无限数量的IP地址

    • 1.3.3.6. IP也被称为尽力而为的传输协议,它不会补偿数据包传输期间可能发生的各种错误情况

      1.3.3.6.1. 可能的传输错误包括数据损坏、数据包丢失和重复

  • 1.3.4. TCP

    • 1.3.4.1. 一旦应用程序或浏览器发现了目标服务器的IP地址,它就可以使用传输协议API发送消息

      1.3.4.1.1. 这是使用TCP或UDP来实现的,它们是IP网络协议栈的流行标准传输协议

    • 1.3.4.2. 面向连接的

    • 1.3.4.3. 面向流的

    • 1.3.4.4. 可靠的

    • 1.3.4.5. TCP是面向连接的协议

      1.3.4.5.1. 在应用程序之间交换任何消息之前,TCP使用三步握手在客户端和服务器应用程序之间建立双向连接

    • 1.3.4.6. 用于检查数据包完整性的校验和

    • 1.3.4.7. 用于确保发送方不会因发送数据过快而淹没慢速接收方的动态流量控制

    • 1.3.4.8. 连同连接建立和确认,TCP成为一个重量级的协议,它在可靠性和效率之间争取可靠性

  • 1.3.5. UDP

    • 1.3.5.1. UDP是一种简单的无连接协议,它将用户的程序暴露给不可靠的底层网络

    • 1.3.5.2. 它无法保证消息传递按照规定的顺序进行,甚至消息传递可能根本不会发生

    • 1.3.5.3. 可以被认为是底层IP协议之上的一层薄薄的单板(层)​,并在原始性能和可靠性之间争取性能

    • 1.3.5.4. 非常适合许多现代应用程序,这些应用程序对异常丢失的数据包不敏感

      1.3.5.4.1. 对于流媒体电影、视频会议和游戏,用户不太可能察觉到一个丢失的数据包

2. 远程方法调用

2.1. 使用直接与传输层协议TCP和UDP交互的底层API来编写分布式应用程序是完全可行的

2.2. 最常见的方法是调用标准化套接字库

  • 2.2.1. 套接字库是一个底层的、难以使用的API

2.3. 套接字是客户端和服务器之间双向网络连接的一个端点

  • 2.3.1. 套接字由节点IP地址和端口的组合来标识

  • 2.3.2. 端口是唯一的数字标识符,它允许节点支持在该节点上运行的多个应用程序的通信

  • 2.3.3. 每个IP地址都可以支持65535个TCP端口和另外65535个UDP端口

2.4. 可以直接向套接字API写入分布式应用程序,它是操作系统的核心组件

2.5. 注册表是一种简单的目录服务,通过它,客户端可以查找位置(网络地址和对象引用)​,并简单地提供逻辑名称来获取RMI服务器引用,逻辑名称在注册表中已经与服务器的引用相关联

2.6. 跨编程语言的编组(客户端使用一种编程语言,服务器端使用另一种编程语言)可能会导致错误,因为类型在不同语言中的表示方式不同,存在微妙的不兼容性

2.7. 多数现代系统都是围绕基于HTTP并使用JSON表示参数的更简单协议来构建的

  • 2.7.1. HTTP动词(PUT、GET、POST等)具有映射到特定URL的关联语义,而不是操作名称

3. 局部故障

3.1. 分布式系统的组件通过网络通信

3.2. 异步网络特点

  • 3.2.1. 节点可以随时向其他节点发送数据

  • 3.2.2. 网络是半双工的,这意味着一个节点发送请求必须等待另一个节点的响应。涉及两个独立的通信

  • 3.2.3. 节点之间传输数据的时长是变化的,受网络拥塞、动态数据包路由和瞬态网络连接故障等因素影响

  • 3.2.4. 接收节点可能因软件或机器崩溃而无法使用

  • 3.2.5. 数据可能会丢失

  • 3.2.6. 节点没有完全一样的内部时钟;节点之间是不同步的

3.3. 同步网络则不一样,本质上是全双工的,同时在两个方向传输数据,每个节点的时钟是同步的

3.4. 客户端是否收到响应,以及何时收到响应,这被称为局部故障处理

3.5. 幂等性

  • 3.5.1. 幂等操作执行多次的结果与执行一次的结果一致

  • 3.5.2. 没有更改持久状态的请求自然是幂等的

    • 3.5.2.1. 意味着所有读取请求本质上都是安全的,不需要在服务器上执行额外的工作

3.6. 更新持久状态则是另一回事

  • 3.6.1. 系统需要设计一种机制,使得客户端重复的请求不会导致任何状态变化,并且可以被服务器检测到

3.7. 服务器状态发生变化的端点必须是幂等的

3.8. 构建幂等操作的方法

  • 3.8.1. 客户端在所有改变状态的请求中包含一个唯一的幂等键

  • 3.8.2. 服务器收到请求时,会检查它是否包含数据库中出现过的幂等性键值,而数据库是专门为实现幂等性而设计的

  • 3.8.3. 如果幂等键在数据库中,表明此请求是来自客户端的重试,不应处理

3.9. 存储幂等键的数据库的实现

  • 3.9.1. 单独的数据库表或集合,与应用程序数据一起存储在事务数据库中

  • 3.9.2. 专用的数据库,提供极低查找延迟,例如简单的键值存储

3.10. 与应用程序数据不同,幂等键不必永远保留

  • 3.10.1. 一旦客户端收到操作成功的确认,就可以丢弃幂等键了

  • 3.10.2. 达成此目的最简单的方法是在特定时间段后自动从存储中删除幂等键,具体取决于应用程序需求和请求量

3.11. 幂等API实现必须确保应用程序状态已修改和幂等键已存储,两者均已发生API才能成功

3.12. 从本质上讲,事务确保了严格一次的操作(exactly-once semantics for operations),保证了所有消息始终只处理一次

  • 3.12.1. 严格一次并不意味着没有消息传输失败、重试和应用程序崩溃,它们都是不可避免的

  • 3.12.2. 重要的是重试最终会成功,结果总是一样的

  • 3.12.3. 严格一次(exactly-once)消息传递需要防止重复,需要在可靠性和较慢的性能之间进行权衡

3.13. 最多一次(at-most-once)消息传递速度快且不可靠——这是UDP协议提供的

3.14. 至少一次(at-least-once)消息传递是TCP/IP提供的保证,意味着重复是不可避免的

4. 分布式系统中的共识

4.1. 事实上,不能保证一定会达成协议是可以证明的

4.2. 局部失败类似于丢失消息和确认

4.3. FLP不可能原理

  • 4.3.1. 事实上,存在崩溃故障的异步网络上,消息可以延迟但不会丢失,在有限时间内不可能达成共识

  • 4.3.2. FLP是最坏的情况

4.4. 在异步网络上无法保证在无限消息延迟的情况下达成共识

  • 4.4.1. 实际上,分布式系统总是会达成共识

  • 4.4.2. 尽管我们的网络是异步的,但我们可以在消息延迟上建立合理的界限并在超时后重试

4.5. 拜占庭故障,在分布式系统中尤为险恶

5. 分布式系统中的时间

5.1. 分布式系统中的每个节点都有自己的内部时钟

  • 5.1.1. 如果每台机器上的时钟都是完全同步的,我们就可以简单地比较节点间事件的时间戳,确定它们发生的精确顺序

  • 5.1.2. 受温度或电压变化等环境条件影响,各个节点上的时钟会漂移

  • 5.1.3. 每台机器的时间漂移量各不相同,但每天漂移10~20 s的现象并不少见

5.2. 时间服务是准确的时间源

5.3. 使用最广泛的时间服务是NTP(网络时间协议)

  • 5.3.1. 提供了跨越全球的分层组织时间服务器集合

  • 5.3.2. 全球约有300台根服务器,它们的时间是最准确的

  • 5.3.3. 下一级时间服务器(大约20000个)定期(几毫秒内)与根服务器同步

  • 5.3.4. 整个层次结构最多15级

  • 5.3.5. 全球有超过175000台NTP服务器

  • 5.3.6. 节点上的时间由与一个或多个NTP服务器进行的UDP消息交换来同步

    • 5.3.6.1. 消息带有时间戳,通过消息交换估算消息传输所用的时间
  • 5.3.7. 时钟的重置可以将本地节点时间向前或向后移动

    • 5.3.7.1. 如果我们的应用程序正在计算事件所花费的时间(例如,计算事件响应时间)​,如果NTP协议已设置本地时间并导致时间倒退,则事件的结束时间可能早于开始时间

5.4. 日历钟

  • 5.4.1. 日历钟(time of day clock)是自1970年1月1日午夜以来的毫秒数

5.5. 单调时钟

  • 5.5.1. 单调时钟(monotonic clock)是自过去未指定时间点以来的时间量(以秒和纳秒为单位)​

5.6. 应用程序可以使用NTP服务来确保系统中每个节点上的时钟紧密同步

  • 5.6.1. 通常会以一小时到一天的时间间隔重新同步时钟,确保时钟的时间值保持接近

  • 5.6.2. 如果应用程序确实需要准确了解不同节点上事件发生的顺序,那么时钟漂移将使其充满危险

  • 5.6.3. 我们的应用程序不能依赖不同节点上事件的时间戳来表示事件的实际顺序

    • 5.6.3.1. 即使时钟漂移一两秒也会导致跨节点时间戳无法比较

5.7. Chrony支持NTP协议,但比NTP准确性更高和扩展性更好

6. 要点

6.1. 解决方案分布在不同位置的多台机器上,每台机器并行处理事件,且它们之间通过网络交换消息

6.2. 分布式系统中的通信可以透明地穿过许多不同类型的底层物理网络,包括WiFi、无线网络、广域网和局域网

6.3. 互联网协议栈通过IP和TCP协议的组合确保跨异构网络的可靠通信

6.4. 使用RMI/RPC技术构建TCP/IP层,为客户端/服务器通信提供抽象层,采用本地方法/过程调用的方式调用服务器接口

6.5. 在异步网络中,存在崩溃故障的情况下,有限时间内不可能在多个节点之间就状态达成一致或达成共识

6.6. 没有完全可靠的全局时间源可供应用程序中的节点同步其行为

  • 6.6.1. 各个节点上的时钟各不相同,不能用于精确的比较

  • 6.6.2. 应用程序无法通过比较不同节点上的时钟来确定事件的顺序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用gzexe保护Kylin Linux Shell脚本安全

使用gzexe保护Kylin Linux Shell脚本安全 1、加密脚本2、解密脚本3、注意事项 💖The Begin💖点点关注,收藏不迷路💖 在Kylin Linux中,若需保护shell脚本内容不被直接查看,可以使用gzexe工具进行加密。 1、…

R语言机器学习算法实战系列(一):XGBoost算法(eXtreme Gradient Boosting)

介绍 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(GBDT)的优化算法,它在处理大规模数据集和复杂模型时表现出色,同时在防止过拟合和提高泛化能力方面也有很好的表现。以下是XGBoost算法的原理和应用方向的详细介绍: 算法原理 目标函数:XGBoost的目标…

Android 测试机

要测手机应用,直接挂电脑上跑虚拟机的话,怀疑电脑都要起火了。 eBay 上买了个新的机器,也才 100 美元多点,机器都没有拆过,电池是完全无电的状态。 操作系统是 Android 12 的版本,升级到 Android 14 后&am…

从用户数据到区块链:Facebook如何利用去中心化技术

在数字化时代,用户数据的管理和保护已成为科技公司面临的重大挑战。作为全球最大的社交网络平台之一,Facebook不仅在用户数据的处理上积累了丰富的经验,也在探索如何利用去中心化技术,如区块链,来改进其数据管理和用户…

怎么使用ai 免费生成ppt?这4个工具可以帮忙

随之AI工具的流行,网络上也涌现了一批 AIPPT 工具,可以在办公上帮助我们节省很多制作PPT的时间。通常它们的操作也比较简单,所以适合很多人使用。为了可以帮助大家提高办公效率,我在这里跟大家分享4款可以免费使用的AIPPT制作工具…

STM32——看门狗通俗解析

笔者在学习看门狗的视频后,对看门狗仍然是一知半解,后面在实际应用中发现它是一个很好用的检测或者调试工具。所以总结一下笔者作为初学小白对看门狗的理解。 主函数初始化阶段、循环阶段和复位 众所周知,程序的运行一般是这样的&#xff1…

解决项目启动时报“找不到符号”问题

前言 在Java开发过程中,遇到“找不到符号”的错误是非常常见的现象。这种错误往往意味着编译器无法识别你所引用的某个类、方法或变量。本文旨在提供一套详细的排查和解决思路,帮助开发者快速定位并解决此类问题。 问题描述 “找不到符号”错误通常出…

K8S - Volume - NFS 卷的简介和使用

在之前的文章里已经介绍了 K8S 中两个简单卷类型 hostpath 和 emptydir k8s - Volume 简介和HostPath的使用 K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar 但是这两种卷都有同1个限制, 就是依赖于 k8s nodes的空间 如果某个service pod中需要的vol…

2024年职场人士都在用的PDF转换工具大赏

PDF文件已经变得越来越常见了,是不是不知不觉你收到的或者发出去的文件都是这个格式。它可以巩固格式,但是编辑起来还是有一定难度的。这篇文章我来分享一些可以从pdf转换器免费版官网下载的工具。 1.Foxit PDF转换大师 链接一下>>https://www.p…

sqlgun靶场漏洞挖掘

进入首页首先看到一个搜索框,那么我们试一下xss 用script弹了个一 接下来我们尝试一下sql注入 这里我们使用联合查询查到了他的数据库名,那么这里也就存在SQL注入了 这里存在SQL注入那么我们就尝试一下是否可以注入木马来getshell 首先我们扫描目录&…

YOLO介绍—datawhale

速度快:YOLO的设计目标是实现快速的对象检测,它在保持相对高准确度的同时,能够实现高帧率的实时检测。 易于实现:YOLO的架构相对简单,易于理解和实现,这使得它在学术和工业界都得到了广泛的应用。 版本迭…

机器学习(西瓜书)第 14 章 概率图模型

14.1 隐马尔可夫模型 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测。概率模型(probabilistic model)提供了一种描述框架&a…

快讯丨深蓝L07将于9月20日正式上市

9月13日获悉,继第二十七届成都车展首发亮相后,深蓝汽车全新“科技智享中型轿车”——深蓝L07,将于9月20日迎来正式上市! 作为深蓝汽车旗下第二款轿车力作,深蓝L07携#左手深蓝超级增程,右手华为乾崑智能#两…

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(六、ILQR正则化和line search)

(六)ILQR正则化和line search 1. ILQR正则化 在iLQR中,我们通常线性化系统动力学并对目标函数进行二阶近似。在反向传播步骤中,我们需要计算逆矩阵(控制变量对目标函数的二阶导数矩阵),用以更…

通信工程学习:什么是FDMA频分多址

FDMA:频分多址 FDMA(Frequency Division Multiple Access,频分多址)是一种在无线通信领域广泛应用的多址技术。该技术通过将可用的频谱资源按频率划分,把传输频带划分为若干较窄且互不重叠的子频带(或称信道…

IP-Adapter学习

参考:https://baijiahao.baidu.com/s?id1803373544569190578&wfrspider&forpc IP-Adapter 是 SD中比较重要的controlnet,由腾讯公司出品。主要原理:提取图像特征,并嵌入预训练文本,最终加入到扩散图像中。简…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦,要点开点按钮这种机械化的操作。 所以就自己整了个脚本: { “id”: “f9999777-9ad6-40e0-9435-4f105919c982”, “version”: “2.0”, “name”: “aliyun”, “url”: “https://developer.aliyun.com”, “tests”: [{ “id”…

bp的模块被隐藏了

看我们现在没有代理那个模块了 我们点击查看 这里有被我们隐藏的模块,比如代理等,把前面的眼睛点一下 这个模块就出来了,如果想把他固定在任务栏里 拖动这个位置 就好了,如果有其他问题可以留言,看到可进我的努力给你…

【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)

文章目录 【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)1. 虚拟机环境2. 基本数据类型占多少字节3. JVM对象头3.1 Klass Pointer3.2 实例属性3.3 对齐填充3.4 查看Java对象布局3.5 论证压缩效…

Failed building wheel for opencv-python-headless

Failed building wheel for opencv-python-headless 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人…