一、概述

1.1集中式系统vs分布式系统

微服务 多表 微服务并行调用_架构

集中式系统

集中式系统完全依赖于一台大型的中心计算机的处理能力,这台中心计算机称为主机(Host 或 mainframe ),与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终端完全不具有处理能力仅作为输入输出设备使用

微服务 多表 微服务并行调用_微服务 多表_02


伴随着大型主机时代的到来,大型主机卓越的性能和良好的稳定性,其 在单机处理能力方面的优势非常明显,使得IT 系统快速进入了集中式处理阶段



集中式系统最大的 特点 就是 部署结构简单


由于集中式系统往往基于底层性能卓越的大型主机,因此 无须考虑如何 对服务进行多个节点的部署,也就不用考虑多个节点之间的分布式协作 问题 。



从 20 世纪 80 年代以来,计算机系统向网络化和微型化的发展日趋明显, 传统的集中式处理模式越来越不能适应人们的需求。主要缺点:

• 学习成本高

• 价格高

• 单点故障

• 扩展困难

分布式系统

分布式系统的理论出现于 20 世纪 70 年代,而随着社交网络、移动互联网、 电子商务等技术的不断发展,互联网的使用者贡献了越来越多的数据。为了处理这些数据,每个互联网公司在后端都有一套成熟的分布式系统 用于数据的存储、计算以及价值提取。


与集中式系统相反,分布式系统中,多个通过网络互联的计算机都具 有一定的计算能力,他们之间通过网络互相传递数据,实现信息共享, 协作共同完成一个处理任务。



分布式系统的特性或是 优势包括容错性、高可扩展性、开放性、并发处理能力和透明性



分布式系统的关键问题


分布式系统虽然相较于集中式系统而言具备优势,但同时也存在一些不 得不考虑的问题:


( 1 )网络传输的三态 : 如何使通信的代价降到用户可以忍耐的层次是分 布式系统设计的重要目标。

( 2 )异构性:分布式系统由于基于不同的网络、操作系统、软件实现技术体系,必须要考虑一种通用的服务集成和交互方式来屏蔽异构系统之 间的差异

( 3 )负载均衡:提高系统的整体效率和吞吐量,必须考虑最大程度发挥 每个节点的作用

( 4 )数据一致性:数据被分散或者复制到不同的机器上,如何保证各台 主机之间的数据一致性将成为一个难点

( 5 )服务可用性:分布式系统要设计成允许出现部分故障而不影响整个系统的正常可用

1.2计算模式

并行计算


并行计算的基本思想是被求解问题分解成若干个部分,用多个处理器来 并行的求解每部分,并协同得到问题的最终解。并行计算最初强调多处理器间的并行,所有处理器或是紧耦合于中心共享内存或是松耦合于分布式内存。并行计算的实现多是在集中式的大型计算机内部基于多核 CPU、众核 GPU 等处理部件的指令级、线程级并行。 而随着网络的发展,并行计算设计也已经延伸到基于网络互连的若干独立计算机构成的集群之间的任务级并行。


技术: 时间并行(流水线)、空间并行(指令并行、线程并行 )


编程: MPI 、 OpenMP 、 CUDA


分布式计算



分布式计算的基本思想是将一个程序被分成多个部分,分布在通过 网络连接起来的多台计算机上运行。分布式系统强调的是由众多自治的计算机组成,各自拥有其私有内存,通过计算机网络通信,以消息传递 的方式完成信息交换。分布式计算的实现可以基于大型数据中心的成百 上千台服务器,甚至也可以基于分布在世界各地的服务器。分布式计算 在广义的定义上范围很广,包括网格计算、P2P 计算等。


并行计算常被拿来与分布式计算想比较。它们在设计目标、计算粒度、 关键技术、任务耦合度等方面有所不同。但随着网络的发展,二者之间 的界限已经越来越模糊,分布在多台计算机的任务实质上也是在并行执行


并行计算、分布式计算的困境

并行计算机:价格高,个人中小企业难以承担

分布式集群:要求计算机数量大,个人中小企业同样不具备



云计算




美国国家标准技术学院(NIST ):云计算是一种模型,这个 模型可以方便地通过网络访问一个可配置的计算资源(例如 网络、服务器、存储设备、应用程序以及服务等)的公共集。 这些 资源可以被快速提供 并发布,同时 最小化管理成本 以及 服务供应商的干预





提供哪些服务?



• 基础设施( IaaS )



• 平台( PaaS )



• 软件( SaaS )





微服务 多表 微服务并行调用_微服务_03




微服务 多表 微服务并行调用_分布式系统_04




微服务 多表 微服务并行调用_微服务 多表_05




1.3计算模式与大数据的关系

结论:

• 处理能力是大数据发展的基石,没有足够强大的处理能力, 大数据将毫无价值。

• 而大数据又反过来推动着计算技术的发展。 促进计算模式 的变革



1.4历史发展

平台变革

微服务 多表 微服务并行调用_架构_06

微服务 多表 微服务并行调用_分布式系统_07

微服务 多表 微服务并行调用_分布式_08

基于网络的系统技术



  • 多核CPU和多线程技术(单节点计算能力提升技术)
  • 先进的 CPU 处理器
  • 多核 CPU 和众核 GPU 体系结构
  • 多线程技术
  • 大规模和超大规模 GPU 计算
  • 内存、外部存储和广域网
  •  . 内存和磁盘
  • 系统区域互联
  • 微服务 多表 微服务并行调用_微服务 多表_09

    微服务 多表 微服务并行调用_微服务_10


  • 广域网
  • 虚拟机和虚拟化中间件
  • 虚拟机

1.5分布式和云计算系统模型

大系统被划分为4组:集群、P2P、计算网格、大数据中心之上的互联网云

微服务 多表 微服务并行调用_分布式_11

协同计算集群

计算集群由互连的协同工作的独立计算机组成,这些独立计算机作为单一集 成的计算资源协同工作。集群式的计算机系统在处理重负载大数据集任务方面已经发挥了重要作用。Top500 超级计算机中,多数采用集群体系结构构建。

微服务 多表 微服务并行调用_分布式_12


主要的集群设计问题



没有一个适合集群的完全资源共享的操作系统。软件环境和应用依靠 中间件来达到高性能


微服务 多表 微服务并行调用_分布式_13

网格计算基础设施


网格计算 被 预想用于同时在多台远距离计算机上运行的应用间进行近距离交互 。



微服务 多表 微服务并行调用_微服务_14



对等网络


客户端服务器体系结构。客户机( PC 和工作站)被连接到一个中央服务器, 用来进行计算、电子邮件、文件访问和数据库应用。P2P 体系结构提供了一 个分布式的网络化系统模型


微服务 多表 微服务并行调用_微服务_15

P2P系统

• 在一个 P2P 系统中,每个节点既是客户端又是服务器,提供部分系统资源。

• 节点机器都是简单的接入互联网的客户机。所有客户机自治、自由地加 入和退出系统。不存在主从关系。

• 无需中心协作或中心数据库。系统是分布式控制下自组织的。

微服务 多表 微服务并行调用_分布式_16

P2P 挑战

• 硬件、软件、网络异构性

• 容错、失效管理和负载均衡

• 安全、隐私和版权(商业应用的主要问题)

• 无中心,管理困难

互联网上的云计算

微服务 多表 微服务并行调用_微服务 多表_17

1.6计算模式的区别

并行计算

微服务 多表 微服务并行调用_架构_18

目前流行的高性能并行计算机系统结构通常可以分成以下 5 类:

• 并行向量处理机( PVP )

• 对称式共享存储器多处理机( SMP )

• 分布式共享存储器多处理机( DSM )

• 大规模并行处理机( MPP )

• 机群计算机( Cluster )( COW )

分布式计算



微服务 多表 微服务并行调用_分布式_19



微服务 多表 微服务并行调用_架构_20

网格计算

微服务 多表 微服务并行调用_分布式_21

云计算

微服务 多表 微服务并行调用_微服务_22


边缘计算




微服务 多表 微服务并行调用_分布式系统_23



算力网络

微服务 多表 微服务并行调用_微服务_24

二、并行编程基础(了解)

2.1并行计算机体系结构

Flynn分类法

微服务 多表 微服务并行调用_架构_25

.并行计算机系统

微服务 多表 微服务并行调用_架构_26

微服务 多表 微服务并行调用_架构_27

2.2OpenMP


什么是 OpenMP


OpenMP 是一种用于 共享内存 并行系统的多线程程序设计方案,支持的编 程语言包括C 、 C++ 和 Fortran 。

OpenMP 提供了对并行算法的高层抽象描述,特别适合在多核 CPU 机器上 的并行程序设计。编译器根据程序中添加的pragma 指令,自动将程序并 行处理,并在必要之处加入同步互斥以及通信,使用OpenMP 降低了并行 编程的难度和复杂度。当编译器不支持OpenMP 时,程序会退化成普通 (串行)程序。程序中已有的OpenMP 指令不会影响程序的正常编译运行。

微服务 多表 微服务并行调用_分布式_28

微服务 多表 微服务并行调用_微服务 多表_29

OpenMP指令

微服务 多表 微服务并行调用_分布式_30

OpenMP指导指令

微服务 多表 微服务并行调用_微服务 多表_31

OpenMP子句

微服务 多表 微服务并行调用_分布式系统_32


规则:


- 区分大小写;


- 指令遵循 C/C++ 编译器指令标准的约定;


- 每个指令只能指定一个指令名;


- 每个指令最多应用于一个后续语句,该语句必须是一个结构化块;


- 长指令行可以通过在指令行的末尾使用反斜杠 (“\”) 来转义换行符,


从而在后续的行中“继续


2.3MPI编程

消息传递式并行程序设计

指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在 这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访 问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是 大 规模并行处理机(MPP )和机群( Cluster )采用的主要编程方式 。

并行计算粒度大,特别适合于大规模可扩展并行算法用户决定问题分解

策略、进程间的数据交换策略,在挖掘潜在并行性方面更主动 , 并行计算

粒度大 , 特别适合于大规模可扩展并行算法

微服务 多表 微服务并行调用_架构_33

微服务 多表 微服务并行调用_架构_34

微服务 多表 微服务并行调用_分布式系统_35

2.4CUDA编程

微服务 多表 微服务并行调用_架构_36

微服务 多表 微服务并行调用_微服务_37

Numba库

Numba 库了 Python 版 CPU 和 GPU 编程工具,速度比原生 Python 快数十倍甚 至更多。Numba 还提供了一个 GPU 模拟器,即使暂时没有 GPU 机器,也可以先使用这个模拟器来学习GPU 编程。

微服务 多表 微服务并行调用_微服务_38

微服务 多表 微服务并行调用_分布式系统_39

三、分布式通信

3.1通信节点


分布式系统的本质是利用多台计算机构成计算集群,每个节点的运 算结果最终需要汇集在一起才能支撑起分布式系统庞大的运算量。因此, 进程间的通信是一切分布式系统的核心。没有通信机制,分布式系统的 各个子系统将是“一盘散沙”,毫无作用



在分布式系统中, 节点是指一个可以独立按照分布式协议完成一组逻辑 的程序个体,是一个完整的、不可分的整体,是执行分布式任务的最小单元



程序往往会部署到不同的节点中,不同节点之间需要通过网络进行通信。 在具体的工程项目中,一个节点往往是操作系统上的一个进程,甚至线 程。


微服务 多表 微服务并行调用_微服务 多表_40


在分布式系统中,两个或多个进程按约定的某种协议进行 IPC ,此处协议 是指数据通信各参与进程必须遵守的一组规则。在协议中,一个进程有些时候可能是发送者,在其他时候则可能是接收者。


微服务 多表 微服务并行调用_分布式系统_41

微服务 多表 微服务并行调用_微服务_42

IPC 的四种基本操作

• 发送( Send ):该操作由发送进程发起,旨在向接收进程传输数据。

操作必须允许发送进程识别接收进程和定义待传数据。

• 接收( Receive ):该操作由接收进程发起,旨在接收发送进程发来的

数据操作必须允许接收进程识别发送进程和定义保存数据的内存空间,

该内存随后被接收者访问。

• 连接( Connect ):对面向连接的 IPC ,必须有允许在发起进程和指定

进程间建立逻辑连击的操作:其中以进程发出请求连接操作而另一进

程发出接受连接操作。

• 断开连接( Disconnect ):对面向连接的 IPC ,该操作允许通信的双方

关闭先前建立起来的某一逻辑连接

微服务 多表 微服务并行调用_架构_43

3.2网络基础


分布式系统可以总结为是处于不同物理位置的多个进程组成的整体,为了确保这个整体有效并且高效的对外提供服务,每个节点之间都有可能 需要进行通信来交换信息。



而交换信息需要解决两个问题,


• 如何定位网络上的一台或多台主机


• 定位后如何进行数据的传输


(1)如何定位网络上的一台或多台主机

IP 地址是唯一标识网络上的一台计算机(通信实体),网络中的域名都 对应着某一个IP 地址。


端口号是标识正在计算机上运行的进程(程序)不同的进程有不同 的端口号,用16 位的二进制表示,即 0-65535 之间。常见的有 tomcat 的 8080端口, mysql 的 3306 端口。

IP 地址和端口号的组合,叫做网络套接字( Socket )。进程之间的通信需 要借助IP 地址和端口号,即网络套接字( Socket )来实现通信节点的定位。

(2)找到主机后如何可靠高效地进行数据传输

需要通过 TCP/UDP 等协议进行数据传输。

网络协议就是一种通信双方共同遵循的约定。网络数据传输中,在网络 上经过的的网络节点都要遵循约定和规则,比如传输数据的格式。

微服务 多表 微服务并行调用_微服务 多表_44

TCP与UDP协议

微服务 多表 微服务并行调用_微服务_45

微服务 多表 微服务并行调用_架构_46

端口(重要)

进程的创建和撤销都是动态的,因此发送方几乎无法识别其他机器上的 进程。

我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体 实现这个功能的进程是哪一个。

有时我们会改换接收报文的进程,但并不需要通知所有的发送方。

微服务 多表 微服务并行调用_微服务_47

微服务 多表 微服务并行调用_分布式系统_48

Socket

Socket 是对网络中不同主机上的应用进程之间进行双向通信的 端点的抽象 。

一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协 议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网 络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网 络协议进行交互的接口。


Socket 的表示包括:连接协议,本地主机的 IP 地址,本地进程的协议端口, 远地主机的IP 地址,远地进程的协议端口


微服务 多表 微服务并行调用_分布式系统_49

微服务 多表 微服务并行调用_微服务_50

微服务 多表 微服务并行调用_分布式_51

微服务 多表 微服务并行调用_分布式_52

代码举例

微服务 多表 微服务并行调用_微服务_53

微服务 多表 微服务并行调用_架构_54

相关概念

I/O 模型



Socket 封装了底层的 TCP 、 UDP 等传输协议,建立了节点间通信的通道。 I/O模型决定了 用什么样的通道 进行输出的发送和输入的接收,很大程度 上决定了通信的性能。


阻塞与非阻塞通信

微服务 多表 微服务并行调用_分布式_55

同步与异步通信

微服务 多表 微服务并行调用_架构_56

BIO

微服务 多表 微服务并行调用_分布式_57

微服务 多表 微服务并行调用_微服务_58

NIO

微服务 多表 微服务并行调用_分布式系统_59

Buffer

微服务 多表 微服务并行调用_分布式系统_60

Channel

微服务 多表 微服务并行调用_分布式系统_61

Selector

微服务 多表 微服务并行调用_分布式系统_62

AIO

微服务 多表 微服务并行调用_架构_63

3.3RPC概述


RPC ( Remote Procedure Call )是指计算机 A 上的进程,调用另外一台计 算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开 始执行,当值返回给 A 时, A 进程继续执行。 调用方可以通过使用参数 将信息传送给被调用方,而后可以通过传回的结果得到信息。 而这一过


程,对于开发人员来说是透明的。



RPC 调用采用客户机 / 服务器 (C/S) 模式。请求程序就是一个客户机,而服 务提供程序就是一台服务器。和常规或本地过程调用一样,远程过程调 用是同步操作,在远程过程结果返回之前,需要暂时中止请求程序。


微服务 多表 微服务并行调用_微服务_64

微服务 多表 微服务并行调用_微服务 多表_65

微服务 多表 微服务并行调用_架构_66


( 1 )序列化




序列化是将数据结构或对象转换成二进制串的过程。序列化后的二进制 数据才能通过底层网络进行传输。不同的序列化协议在性能和空间开销 上都有所不同。序列化后的字节数据体积越小,网络传输的数据量就越 小,速度也更快。在接到字节序列后,还要进行反序列化操作,将二进 制字节流转换成对象。


常用的序列化方案包括: JDK 原生的序列化方案、 Protobuf 、 JSON 、 Hessian、 XML 等。



(2)其它模块:服务发现


除了序列化与网络传输两个核心模块外,服务发现通常是必备模块。 客户端在做远程过程调用时,首先需要发现远程主机上可调用的服务。 实现方式是创建服务注册中心。服务端所有可调用的函数、对象都需要 在服务注册中心注册,客户端需要从注册中心处获得可调用的服务对象。 为了提升注册中心的可用性,避免单点故障,有些RPC 方案中还采用 Zookeeper集群作为注册中心



微服务 多表 微服务并行调用_分布式_67



3.4RMI概述


RMI 是 Remote Method Invocation 的缩写,即远程方法调用。 RMI 是 RPC 模 型的面向对象实现,是 一种用于实现远程过程调用的应用程序编程接口 , 它使客户机上运行的程序可以调用远程服务器上的对象。


微服务 多表 微服务并行调用_微服务 多表_68

RMI和Socket的比较

远程方法调用 API 作为分布式对象计算范型的代表,是构建网络应用的有 效工具。它可用来取代socket API 快速构建网络应用。在 RMI API 和 socket API之间权衡时,需要考虑以下因素:

1 ) socket API 的执行与操作系统密切相关,因此执行开销更小, RMI 需要额外的中间件支持,包括代理和目录服务,这些不可避免地带来运行时 开销。对有高性能要求的应用来说,socket API 仍将是惟一可行途径。


2 ) RMI API 提供了使软件开发任务更为简单的抽象。用高级抽象开发的 程序更易理解,因此也更易调试



3 )由于运行在低层, socket API 通常是平台和语言独立的, RMI 则不一定。 例如Java RMI 需要特定的 Java 运行时支持。结果是,使用 Java RMI 实现的 应用必须用Java 编写,并且也只能运行在 Java 平台上。


4 )在设计应用系统时,是否能选择适当的范型和 API 是非常关键的。依 赖于具体环境,可以在应用的某些部分使用某种范型或API ,而在其他部 分使用另一种范型或API 。由于使用 RMI 开发网络应用相对简单, RMI 是快 速开发应用原型的一个很好的候选工具。


四、分布式系统的一致性

4.1一致性的产生

虽然分布式系统有着诸多优点,但也存在着诸多需要解决的问题,一致 性问题就是其中的关键问题。分布式系统中的一致性问题通常发生在两 种场景中。

( 1 )数据复制

( 2 )分布式事务

.数据复制

微服务 多表 微服务并行调用_架构_69

复制机制的目的是为了保证数据的一致性。但是数据复制面临的主要难题也是如何保证多个副本之间的数据一致性。


在分布式系统引入复制机制后,不同的数据节点之间由于网络延时等原 因很容易 产生数据不一致的情况。

分布式事务

微服务 多表 微服务并行调用_微服务_70

分布式事务举例

微服务 多表 微服务并行调用_架构_71

4.2一致性级别


为了更好地描述客户端一致性模型,通过模拟一个应用场景来说明,这 个场景包以下组成部分。


• 存储系统:存储系统可以理解为一个黑盒子,他提供了可用性和持久 性的保证。


• 进程 A 、 B 、 C :三个进程相互独立,能够实现对存储系统的 wirte 和 read操作。


强一致性


保证当更新操作完成之后,任何多个后续进程或者线程的访问都会返回 最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么, 下一次就保证能读到什么



在示例场景中,假如 A 写入了一个值到存储系统,存储系统保证后续 A 、 B、 C 的读取都为最新值


弱一致性


系统并不保证进程或者线程的访问都会返回最新的更新过的值。系 统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具 体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒 级别)之后,可以让数据达到一致性状态。



在示例中,假设 A 写入一个值到存储系统,存储系统不能保证后续 A 、 B 、 C的读取操作能读取到最新值。此情况下有一个时间窗口的概念,它特指 从A 写入值,到后续操作 A 、 B 、 C 读取到最新值这一段时间。




最终一致性


弱一致性的特殊形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。


假如 A 首先写了一个值到存储系统,存储系统保证如果 A 、 B 、 C 后续读取 之前,没有其他写操作更新同样的值的情况下,最终所有读取操作都会 读取到A 写入的最新值。 DNS 是一个典型的最终一致性系统,当更新一个 域名的ip 以后,根据配置策略以及缓存控制策略的不同,最终所有的客 户端都会看到最新的值


4.3事务一致性


ACID ,是指在数据库管理系统( DBMS )中,事务 (transaction) 所具有的四 个特性:原子性(Atomicity )、一致性( Consistency )、隔离性 (Isolation ,又称独立性)、持久性( Durability )。


原子性

微服务 多表 微服务并行调用_分布式_72

一致性

微服务 多表 微服务并行调用_分布式_73

隔离性

微服务 多表 微服务并行调用_分布式_74

持久性

微服务 多表 微服务并行调用_微服务_75

数据库 ACID 原则在 单台服务器 就能完成任务的时代,很容易实现,但是 现在面对如此庞大的访问量和数据量,单台服务器已经不可能适应了, 而ACID 在集群环境下几乎不可能达到人们的预期,保证了 ACID ,效率就 会大幅度下降,为了达到这么高的要求,系统很难扩展,因此就出现了 CAP理论和 BASE 理论。

4.4CAP理论


一个分布式系统最多只能同时满足一致性( Consistency )、可用性 (Availability )和分区容错性( Partition tolerance )这三项中的两项。


微服务 多表 微服务并行调用_微服务_76

一致性

一致性指“ All nodes see the same data at the same time” ,即更新操作成 功并返回客户端完成后,所有节点在同一时间的数据完全一致。对于一 致性,可以分为从客户端和服务端两个不同的视角来看。

• 从客户端来看,一致性主要指多并发访问时更新过的数据如何获取的问题。

• 从服务端来看,则是如何将更新复制分布到整个系统,以保证数据的最终一致性问题。

可用性

微服务 多表 微服务并行调用_分布式系统_77

.分区容错性

微服务 多表 微服务并行调用_微服务 多表_78

CAP权衡 应用

微服务 多表 微服务并行调用_微服务 多表_79

微服务 多表 微服务并行调用_架构_80

4.5BASE理论


BASE 是指基本可用( Basically Available )、软状态( Soft State )、最终 一致性( Eventual Consistency


1 基本可用(Basically Available)

微服务 多表 微服务并行调用_微服务 多表_81

软状态( Soft State)

微服务 多表 微服务并行调用_分布式系统_82

最终一致性( Eventual Consistency)


最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到 一致的状态。


弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。


4.6一致性算法


在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本 (replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确 的增\ 删 \ 改 \ 查等语义,需要保证这些放置在不同物理机器上的副本是一 致的。


相关概念

微服务 多表 微服务并行调用_分布式_83

二阶段提交

二阶段提交 (Two-phaseCommit) 是指,在计算机网络以及数据库领域内, 为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性 而设计的一种算法

微服务 多表 微服务并行调用_微服务 多表_84

准备阶段

事务协调者 ( 事务管理器 ) 给每个参与者 ( 资源管理器 ) 发送 Prepare 消息,每 个参与者要么直接返回失败( 如权限验证失败 ) ,要么在本地执行事务,写 本地的redo (记录每条新增或者修改后的数据)和 undo (记录需要回滚 的数据)日志,但不提交

微服务 多表 微服务并行调用_架构_85

提交阶段

如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送 回滚(Rollback) 消息;否则,发送提交 (Commit) 消息;参与者根据协调者 的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。 (注意 : 必须在最后阶段释放锁资源 )

微服务 多表 微服务并行调用_架构_86

二阶段提交的缺点

微服务 多表 微服务并行调用_分布式系统_87

微服务 多表 微服务并行调用_架构_88

三阶段提交

微服务 多表 微服务并行调用_架构_89

微服务 多表 微服务并行调用_分布式系统_90

五、共识算法

5.1概述

  • 一致性(consistency)往往指分布式系统中多个副本对外呈现的数据 的状态。
  • 共识(consensus)则描述了分布式系统中多个节点之间,彼此对某个 状态达成一致结果的过程。


实践中,要保障系统满足不同程度的一致性,核心过程往往需要通过共 识算法来达成。


微服务 多表 微服务并行调用_微服务_91

5.2拜占庭将军问题


拜占庭将军问题 (The Byzantine Generals Problem) 提供了对分布式共识问 题的一种情景化描述,由Leslie Lamport 等人在 1982 年首次发表。事实上, 拜占庭将军问题是分布式系统领域最复杂的容错模型, 它描述了 如何在 存在恶意行为( 如消息篡改或伪造 ) 的情况下使分布式系统达成共识。


微服务 多表 微服务并行调用_分布式系统_92

两种方案:

– 口信消息解决方案( A Solution with oral message ) , O M(m) 算法

– 签名消息解决方案( A solution with signed message ) , SM(m) 算法


拜占庭将军问题提供了对分布式共识问题的一种情景化描述,是分布式


系统领域最复杂的模型。现有的分布式共识算法主要可分为两类:


• 拜占庭容错算法和非拜占庭容错算法。



1. 非拜占庭容错算法



微服务 多表 微服务并行调用_微服务 多表_93



. 拜占庭容错算法



微服务 多表 微服务并行调用_分布式_94


5.3Paxos算法



微服务 多表 微服务并行调用_分布式系统_95



微服务 多表 微服务并行调用_架构_96

5.4Raft算法

微服务 多表 微服务并行调用_分布式_97

微服务 多表 微服务并行调用_分布式系统_98

六、分布式存储

6.1分布式存储的基础

概述


新一代分布式存储系统的设计目标:低成本、大规模




微服务 多表 微服务并行调用_分布式_99


分布式存储系统的技术挑战包括: 数据和状态信息的持久化、数据的自动迁移、 系统的自动容错、并发读写的数据的一致性 等方面。



分布式存储面临的应用场景和数据需求都比较复杂,根据数据类型,可以将 其 分为非结构化数据、结构化数据、半结构化数据三类 。




微服务 多表 微服务并行调用_分布式_100


结构化数据

微服务 多表 微服务并行调用_架构_101

半结构化数据

非结构化数据

微服务 多表 微服务并行调用_分布式_102

分布式文件系统blob



微服务 多表 微服务并行调用_微服务_103




在系统的实现层面,分布式文件系统内部按照数据块 (chunk) 来 组织数据,每个数据块的大小相同,每个数据可以包含多个 Blob对象或者定长块,一个大文件也可以拆分成为多个数据块。

• 分布式文件系统将这些数据块分散存储到分布式存储集群中去, 处理数据的复制、一致性、负载均衡、容错等分布式系统难题, 并将用户对Blob 对象、定长块以及文件的操作映射成为对底层 数据块的操作。



分布式键值(Key-Value)系统



微服务 多表 微服务并行调用_分布式_104



分布式表系统



微服务 多表 微服务并行调用_架构_105


HBASE



微服务 多表 微服务并行调用_微服务 多表_106



微服务 多表 微服务并行调用_分布式系统_107



微服务 多表 微服务并行调用_分布式系统_108

微服务 多表 微服务并行调用_微服务 多表_109

分布式数据库



微服务 多表 微服务并行调用_微服务 多表_110



. 分布式存储的历史


微服务 多表 微服务并行调用_微服务 多表_111



HDFS (Google File System)



微服务 多表 微服务并行调用_微服务_112


6.2文件存储

单机文件系统

微服务 多表 微服务并行调用_分布式系统_113

网络文件系统

微服务 多表 微服务并行调用_分布式_114

并行文件系统

微服务 多表 微服务并行调用_微服务 多表_115

分布式文件系统

微服务 多表 微服务并行调用_分布式系统_116

高通量文件系统



微服务 多表 微服务并行调用_分布式_117


总结

微服务 多表 微服务并行调用_架构_118

6.3单机存储系统VS分布式存储系统

单机存储系统


单机存储 就是散列表、 B 树等数据结构在机械硬盘、 SSD 等持久化介质上的实现。



微服务 多表 微服务并行调用_分布式_119


存储系统的 数据模型 主要包括三类: 文件 、 关系 以及 键值模型


分布式存储系统

微服务 多表 微服务并行调用_微服务 多表_120

分布式系统能够将数据分布到多个节点,并在多个节点之间实现负载均衡。

其方式主要有两种:

– 散列分布, 如一致性散列,代表系统为 Amazon 的 Dynamo 系统;

– 顺序分布, 即每张表格上的数据按照主键整体有序,代表系统为 Google的 Bigtable 。

微服务 多表 微服务并行调用_微服务_121

微服务 多表 微服务并行调用_分布式系统_122

微服务 多表 微服务并行调用_微服务 多表_123

6.4数据分区与复制


数据分区(分片)与数据复制是紧密联系的两个概念,对于海量数据, 通过数据分片实现系统的水平扩展 ,而通过 数据复制来保证数据的高可 用性


微服务 多表 微服务并行调用_分布式_124

数据的分区




分布式存储的一个好处是实现了可扩展性,能够存储和处理比单台机器 所能容纳的大得多的数据集。而实现可扩展性的重要方式之一是对数据 进行分区。



分区是指讲一个数据集拆分为多个较小的数据集,同时将存储和处理这些较小数据集的责任分配给分布式系统中的不同节点。 分区后,可以通过向系统中添加更多节点来增加系统存储和处理数据的规模。




. 分区的分类




微服务 多表 微服务并行调用_微服务_125




垂直分区:对表的列进行拆分,将某些列的整列数据拆分到特定的 分区,并放入不同的表中。


优点:减少了表的宽度,每个分区都包含了其中的列对应的所有行。 垂直分区也称为“行拆分”,每一行数据都要进行拆分。例如可以将包 含text 、 blob 类型的列垂直分区,确保完整性的同时提高了访问性能。



( 2 )水平分区:对表的行进行拆分,讲不同的行放入不同的表中,所有 在表中 定义的列在每个分区中都能找到,所以标的特性依然得以保留。


例如,一个整年的销售表可以按月拆分成 12 张表,每个分区存储一个月 的数据




微服务 多表 微服务并行调用_微服务 多表_126



水平分区算法


  • 范围分区
  • 哈希分区
  • 一致性哈希



复制




微服务 多表 微服务并行调用_分布式_127




1.单主复制





微服务 多表 微服务并行调用_架构_128


根据系统以何种方式同步数据,又可将单主复制分为三类:同步复制, 半同步复制,异步复制。



同步复制



微服务 多表 微服务并行调用_分布式_129


异步复制



微服务 多表 微服务并行调用_微服务_130



半同步复制


微服务 多表 微服务并行调用_微服务_131


单主复制的优点

• 简单易懂,易于实现。

• 仅在主节点执行并发写的操作,能够保证操作的顺序,避免了在各个节点处理数据冲突这类复杂的情况,这个特性使得单主复制更容易支持事务类操作。

• 对于大量读请求工作负载的系统,单主复制是可扩展的,可以通过增 加多个从节点来提升读的性能


. 多主复制




微服务 多表 微服务并行调用_微服务_132



微服务 多表 微服务并行调用_架构_133


无主复制


无主复制指的是完全没有主节点,尽管无主技术在几十年前就出现了, 但直到亚马逊发布了 Dynamo 架构的论文,并在其中使用了无主复制, 才让该技术重新引起广泛关注。




微服务 多表 微服务并行调用_分布式_134



七、大数据存储

7.1数据的存储介质

微服务 多表 微服务并行调用_分布式系统_135

目前,数据有三种常见的存储模式(图3.5):直连式存储(Direct-Attached Storage,DAS);网络接入存储(Network-Attached Storage,NAS);存储区域网络(Storage Area Network,SAN)。

微服务 多表 微服务并行调用_分布式_136

文件系统

微服务 多表 微服务并行调用_微服务_137

文件系统是基于操作系统的,用来管理和组织保存在磁盘驱动器上的数据的系统软件,它通过对数据存储布局、空间管理、文件命名和安全控制等方面的管理,解决了如何有效地存储数据的问题,可以说通过文件系统,实现了数据的完整性,同时也实现了数据读写的简单化和安全性。

7.2分布式文件系统

微服务 多表 微服务并行调用_分布式_138

微服务 多表 微服务并行调用_微服务_139

Hadoop

微服务 多表 微服务并行调用_分布式系统_140

微服务 多表 微服务并行调用_微服务 多表_141

 HDFS

微服务 多表 微服务并行调用_微服务_142

微服务 多表 微服务并行调用_分布式_143

HDFS缺陷

1.不支持对文件的随机写入 在HDFS中,可以对文件进行追加操作,但是不能对文件进行修改。文件在HDFS上存储时,以Block为基本单位,没有提供对文件的在线寻址功能。


2.不支持并发写入 同一个文件在同一时刻只能由一个客户端写入,不支持多个线程同时写。


3.不适合低延时数据访问 HDFS主要是面向大规模数据批量处理而设计的,采用流式数据读取,具有较高的数据吞吐率,但这也增加了它的延迟。


4.不适合存储小文件 HDFS中存储大量的小文件时,会降低NameNode的服务能力。其次,使用MapReduce处理大量小文件时,会产生过多的Map任务,线程管理开销会大大增加

7.3数据库

微服务 多表 微服务并行调用_分布式_144

关系型数据库

微服务 多表 微服务并行调用_分布式_145

关系数据库的瓶颈

高并发读写的需求   

问题: 数据库读写压力巨大, 硬盘IO无法承受     

解决方案: Master-Slave,主从分离 分库、分表,缓解写压力,增强读库的可扩展性

海量数据的高效率存储和访问的需求     

问题: 存储记录数量有限, SQL查询效率极低     

解决方案: 分库、分表,缓解数据增长压力

高可扩展性和高可用性的需求     

问题: 横向扩展艰难,无法通过快速增加服务器节点实现, 系统升级和维护造成服务不可用 解决方案: Master-Slave,增强读库的可扩展性 MMM——Master -Master Replication Manager for MySQL

微服务 多表 微服务并行调用_架构_146

非关系型数据库

微服务 多表 微服务并行调用_分布式系统_147

微服务 多表 微服务并行调用_分布式系统_148

键值数据库

微服务 多表 微服务并行调用_分布式_149

列族数据库

微服务 多表 微服务并行调用_架构_150

文档数据库

微服务 多表 微服务并行调用_架构_151

微服务 多表 微服务并行调用_微服务_152

图数据库

微服务 多表 微服务并行调用_微服务_153

7.4分布式数据库

分布式数据库(Distributed Database System,DDBS)是数据库技术与网络技术相结合的产物,即通过计算机网络将地理上分散的各局域节点链接起来共同组成一个逻辑上统一的数据库系统。

每个被连接起来的数据库单元称为场地(site)或节点(node)。节点或场地是指物理上或逻辑上的一台计算机(如集群系统)。节点强调的是计算机和处理能力,场地强调的是物理位置和通信代价,二者只是看问题的角度不同,本质上没有区别,

微服务 多表 微服务并行调用_微服务 多表_154

微服务 多表 微服务并行调用_分布式系统_155

3.分布式数据库系统主要特点:

(1)物理分布性:数据不是存储在一个场地上,而是存储在计算机网络的多个场地上。

(2)逻辑整体性:数据物理分布在各个场地,但逻辑上是一个整体,它们被所有用户(全局用户)共享,并由一个DDBMS统一管理。

(3)场地自治性:各场地上的数据由本地的DBMS管理,具有自治处理能力,完成本场地的应用(局部应用)。

(4)场地之间协作性:各场地虽然具有高度的自治性,但是又相互协作构成一个整体。

7.5数据仓库

微服务 多表 微服务并行调用_微服务 多表_156

微服务 多表 微服务并行调用_分布式_157

7.6云存储

微服务 多表 微服务并行调用_微服务_158

微服务 多表 微服务并行调用_分布式系统_159

微服务 多表 微服务并行调用_分布式_160