分布式01

一、初识分布式系统

1、定义

一个分布式系统是由多个通过网络互联的独立自治的计算节点组成。

这些节点之间基于**消息传递机制**进行相互协作,以完成共同的目标。

从用户的角度看,分布式系统是一个整体,用户在使用系统功能的时候,是感觉不到分布式系统的内部构成和节点之间的协作关系。比如,我们在刷微博时,是感觉不到新浪服务器之间的协作,也更觉不到某一台服务器的更换,我们只感觉像是在跟一台服务器交互。

2、几个要点

  1. 多个计算节点

    计算节点一般指单个计算机,也可以是计算机中的一个进程、线程或者后台服务。

  2. 网络互联

    我们并不关心节点之间是通过有线、无线或者什么其他网络通信方式互联,我们只关心节点之间逻辑上的互联结构。

  3. 独立自治

    每个节点都有自己独立的CPU、独立的时钟,发生错误的时机和模式也都是相互独立的。

  4. 各个节点相互协作以完成共同的目标

  5. 消息传递模型

    节点基于消息传递模型相互协作,并不是内存共享模型。

    如下面的图所示,节点之间的消息传递通常以毫秒计,而如果在单机中,耗时可以纳秒计,所以在设计分布式系统时,应该**尽可能的减少节点之间的通信**,此时通信复杂度是影响系统效率的重要因素。

    分布式系统在设计时,必须要应对局部失效、消息延迟/丢失等错误。

分布式01
分布式01

虚拟内存管理的作用:

  • 扩大物理内存,在内存不够时,通过这种方法,让用户感觉到内存很大;
  • 给每个进程提供一个独立的内存地址空间。

二、分布式概述

1、背景

为什么会出现分布式系统?

  • 大大小小的计算机设备无处不在

  • 网络通信技术高速发展,网络的规模不断扩大

  • 摩尔定律走到了瓶颈,免费的午餐已经结束

  • 越来越多的计算任务需要交由分布在不同区域的计算节点来协作完成

    比如,我们在支付宝上购买电,就涉及到阿里的服务器、国家电网的服务器,如果你的钱在银行的话,还涉及到银行的服务器。因此购电的这个任务就需要这多个服务器来协作共同完成。

2、构建分布式系统的目的

  • 提高计算能力——用多台计算机同时执行任务
  • 提高存储能力——一台计算机能够挂载的硬盘是有限的,可以使用多台计算机
  • 提高网络吞吐能力(并发访问能力)——一台计算机的网络请求是有限的
  • 提高可靠性(解决局部失效问题)——主备节点,防止局部失效
  • 提高安全性(解决局部攻击问题)
  • 提高可扩展性(解决瓶颈问题)
  • 实现资源共享
  • 实现跨越时空的协同服务(发挥不同节点的优势)

3、衡量分布式系统优劣的特性

  • 可扩展性/可伸缩性(Scalability)

    • 垂直可扩展性(Vertical Scalability)——把一个单核CPU电脑上的程序复制到一个多核CPU电脑上后,程序的执行效率也会随之提高
    • 水平可扩展性(Horizontal Scalability)——程序的执行效率能够随着系统节点的增加而增加
  • 容错性(Fault Tolerance/Reliability)

    • 可用性(Availability)——某些节点失效时,系统还能否用
    • 可恢复行(Recoverability)——在节点重启之后,就可以继续使用
  • 透明性(Transparency)——用户感觉不到分布式系统的构造

  • 开放性(Openness)——

  • 安全性(Security)——能够防止外部/内部攻击

  • 可维护性(Maintainability)——后台管理员能很方便的管理某个节点

4、设计挑战例子:数据库备份

分布式01

上面的这种一主多备的模式,我们规定当客户端要写数据时,只能往主节点上写,然后主节点把数据更新的消息传送给其他备份节点,这样也就保持了各个节点的数据一致性。这种一致性带来的好处就是客户端可以从任意的节点读取数据**,而在现实中读的数据访问量也远远大于写的访问量,就像浏览微博时,大部分的时间你都是在看别人的动态,很少发送动态。

采用一主多备模式带来的好处是:

  • 提高了可靠性——在主节点失效后,自动地切换某一个备份节点作为主节点(这里就要求分布式系统各节点的一致性)
  • 提高了性能——就像上面说的,客户端可以从任意的节点上读取数据。

上面说的,感觉“一主多备”十分的完美,但这样的模式也还有很多的问题解决,其中一个就是容错性问题。例如,客户端请求更新磁盘上的x=2,这时主节点就开始往其他备份节点上发送消息,但给备份节点2的消息丢失了,如果系统不处理这样的问题,就破坏了分布式的一致性。如果想到了用消息确认的方式,那样就会造成通信复杂度增高。

那怎么在高效的情况下实现分布式一致性呢?可以使用Paxos协议Raft协议

5、分布式的一致性

分布式的一致性分为:

  • 严格一致性
  • 强一致性
    • 顺序一致性
    • 线性一致性
  • 弱一致性——像微博下的评论,过五分钟更新也是可以的,但是像银行的交易就必须实现强一致性,我现在交易了以后,马上就要看到金额的变化。
  • 最终一致性

6、分布式系统的例子

  • 实现资源共享的分布式系统(分布式存储)
    • Web系统、DNS系统
    • 网络文件系统:NFS、HDFS
    • P2P资源共享系统:BitTorrent、UTorrent
    • 区块链、比特币
  • 高性能计算系统:Map-ReduceSpark、TensorFlow
  • 云计算
  • 网格计算
  • 集群计算
  • 分布式信息系统:跨企业应用系统、金融应用系统

三、分布式节点之间的通信技术

底层通信技术

  • 基于TCP的点对点通信技术
  • 基于UDP的点对点通信技术

并发服务技术

上层通信技术

  • 远程过程调用RPC/远程方法调用RMI
  • 基于消息队列的通信技术

1、远程过程调用RPC

  • 远程过程调用(Remote Rrocedure Call,RPC):使应用程序可以像调用本地节点上的**过程(子过程)**那样去调用一个远程节点上的子程序。

  • 对于调用者来说不能区分调用者来自本地还是远程

  • RPC将面向过程的通用编程模型扩展到了分布式环境

  • 实现了跨进程、跨语言、跨网络、跨平台的过程调用

  • 强化了面向接口编程的编程风格

    A、B计算机规定好调用的接口,就像在Java中,List 只是接口,ArrayListLinkedList是其实现类。调用者并不用关系内部是怎么实现的,就需要知道接口的名字就可以直接调用。

  • 实现RPC必须要有RPC中间件的支持

RPC一般采用同步调用方式,也就是说调用者在调用远程服务时,需要等待远程的服务执行完,才能继续执行。

分布式01

2、远程方法调用RMI

  • 远程方法调用(Remote Method Invocation,RMI):将面向对象的编程模型扩展到了分布式环境。
  • RMI使应用程序可以像调用本机上对象的方法一样调用远程主机中对象的方法。
  • 利用RMI调用远程对象的方法时,参数可以是一个本地对象,也可以是另外一个远程对象(第三个节点)。
  • 在整个系统范围内支持垃圾回收
  • 实现RMI必须要有RMI中间件的支持

3、RPC/RMI中间件的作用

  • 定义并利用Socket服务接口实现了一套调用者和被调用者之间的通信协议。例如Java RMI的Java Remote Method Protocol(JRMP)
  • 实现了过程参数的序列化、反序列化;过程运算结果的序列化、反序列化。序列化的目的是为了方便存储、传输,但是在以字节码的方法保存对象后,在不同的计算机上怎么过把发序列化成对象。
  • 通信过程中的错误处理
  • 过程服务进程(或远程对象)的集中注册与发现(目录服务)
  • 远程对象的统一标识和生命周期管理,例如,A、B计算机上都有一个f()方法,那我们怎么知道调用的是哪个方法呢?
  • 在服务端支持并发访问。(多采用多线程技术),当A、B计算机同时调用C计算机上的f()方法时,应该要有两个线程去执行这个方法。