赞
踩
集中式系统完全依赖于一台大型的中心计算机的处理能力,这台中心计算机称为主机(Host 或 mainframe ),与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终端完全不具有处理能力仅作为输入输出设备使用
从 20 世纪 80 年代以来,计算机系统向网络化和微型化的发展日趋明显, 传统的集中式处理模式越来越不能适应人们的需求。主要缺点:• 学习成本高• 价格高• 单点故障• 扩展困难
分布式系统的理论出现于 20 世纪 70 年代,而随着社交网络、移动互联网、 电子商务等技术的不断发展,互联网的使用者贡献了越来越多的数据。为了处理这些数据,每个互联网公司在后端都有一套成熟的分布式系统 用于数据的存储、计算以及价值提取。
( 1 )网络传输的三态 : 如何使通信的代价降到用户可以忍耐的层次是分 布式系统设计的重要目标。( 2 )异构性:分布式系统由于基于不同的网络、操作系统、软件实现技术体系,必须要考虑一种通用的服务集成和交互方式来屏蔽异构系统之 间的差异( 3 )负载均衡:提高系统的整体效率和吞吐量,必须考虑最大程度发挥 每个节点的作用( 4 )数据一致性:数据被分散或者复制到不同的机器上,如何保证各台 主机之间的数据一致性将成为一个难点( 5 )服务可用性:分布式系统要设计成允许出现部分故障而不影响整个系统的正常可用
并行计算常被拿来与分布式计算想比较。它们在设计目标、计算粒度、 关键技术、任务耦合度等方面有所不同。但随着网络的发展,二者之间 的界限已经越来越模糊,分布在多台计算机的任务实质上也是在并行执行
并行计算、分布式计算的困境并行计算机:价格高,个人中小企业难以承担分布式集群:要求计算机数量大,个人中小企业同样不具备
- 多核CPU和多线程技术(单节点计算能力提升技术)
先进的 CPU 处理器 多核 CPU 和众核 GPU 体系结构 多线程技术 大规模和超大规模 GPU 计算 内存、外部存储和广域网
. 内存和磁盘 系统区域互联 广域网- 虚拟机和虚拟化中间件
- 虚拟机
大系统被划分为4组:集群、P2P、计算网格、大数据中心之上的互联网云
计算集群由互连的协同工作的独立计算机组成,这些独立计算机作为单一集 成的计算资源协同工作。集群式的计算机系统在处理重负载大数据集任务方面已经发挥了重要作用。Top500 超级计算机中,多数采用集群体系结构构建。
P2P系统
• 在一个 P2P 系统中,每个节点既是客户端又是服务器,提供部分系统资源。• 节点机器都是简单的接入互联网的客户机。所有客户机自治、自由地加 入和退出系统。不存在主从关系。• 无需中心协作或中心数据库。系统是分布式控制下自组织的。
P2P 挑战• 硬件、软件、网络异构性• 容错、失效管理和负载均衡• 安全、隐私和版权(商业应用的主要问题)• 无中心,管理困难
目前流行的高性能并行计算机系统结构通常可以分成以下 5 类:• 并行向量处理机( PVP )• 对称式共享存储器多处理机( SMP )• 分布式共享存储器多处理机( DSM )• 大规模并行处理机( MPP )• 机群计算机( Cluster )( COW )
OpenMP 是一种用于 共享内存 并行系统的多线程程序设计方案,支持的编 程语言包括C 、 C++ 和 Fortran 。OpenMP 提供了对并行算法的高层抽象描述,特别适合在多核 CPU 机器上 的并行程序设计。编译器根据程序中添加的pragma 指令,自动将程序并 行处理,并在必要之处加入同步互斥以及通信,使用OpenMP 降低了并行 编程的难度和复杂度。当编译器不支持OpenMP 时,程序会退化成普通 (串行)程序。程序中已有的OpenMP 指令不会影响程序的正常编译运行。
OpenMP指导指令
OpenMP子句
消息传递式并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在 这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访 问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是 大 规模并行处理机(MPP )和机群( Cluster )采用的主要编程方式 。并行计算粒度大,特别适合于大规模可扩展并行算法用户决定问题分解策略、进程间的数据交换策略,在挖掘潜在并行性方面更主动 , 并行计算粒度大 , 特别适合于大规模可扩展并行算法
Numba 库了 Python 版 CPU 和 GPU 编程工具,速度比原生 Python 快数十倍甚 至更多。Numba 还提供了一个 GPU 模拟器,即使暂时没有 GPU 机器,也可以先使用这个模拟器来学习GPU 编程。
IPC 的四种基本操作• 发送( Send ):该操作由发送进程发起,旨在向接收进程传输数据。操作必须允许发送进程识别接收进程和定义待传数据。• 接收( Receive ):该操作由接收进程发起,旨在接收发送进程发来的数据操作必须允许接收进程识别发送进程和定义保存数据的内存空间,该内存随后被接收者访问。• 连接( Connect ):对面向连接的 IPC ,必须有允许在发起进程和指定进程间建立逻辑连击的操作:其中以进程发出请求连接操作而另一进程发出接受连接操作。• 断开连接( Disconnect ):对面向连接的 IPC ,该操作允许通信的双方关闭先前建立起来的某一逻辑连接
(1)如何定位网络上的一台或多台主机
IP 地址是唯一标识网络上的一台计算机(通信实体),网络中的域名都 对应着某一个IP 地址。端口号是标识正在计算机上运行的进程(程序)不同的进程有不同 的端口号,用16 位的二进制表示,即 0-65535 之间。常见的有 tomcat 的 8080端口, mysql 的 3306 端口。
IP 地址和端口号的组合,叫做网络套接字( Socket )。进程之间的通信需 要借助IP 地址和端口号,即网络套接字( Socket )来实现通信节点的定位。
(2)找到主机后如何可靠高效地进行数据传输
需要通过 TCP/UDP 等协议进行数据传输。网络协议就是一种通信双方共同遵循的约定。网络数据传输中,在网络 上经过的的网络节点都要遵循约定和规则,比如传输数据的格式。
进程的创建和撤销都是动态的,因此发送方几乎无法识别其他机器上的 进程。我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体 实现这个功能的进程是哪一个。有时我们会改换接收报文的进程,但并不需要通知所有的发送方。
Socket 是对网络中不同主机上的应用进程之间进行双向通信的 端点的抽象 。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协 议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网 络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网 络协议进行交互的接口。
序列化是将数据结构或对象转换成二进制串的过程。序列化后的二进制 数据才能通过底层网络进行传输。不同的序列化协议在性能和空间开销 上都有所不同。序列化后的字节数据体积越小,网络传输的数据量就越 小,速度也更快。在接到字节序列后,还要进行反序列化操作,将二进 制字节流转换成对象。常用的序列化方案包括: JDK 原生的序列化方案、 Protobuf 、 JSON 、 Hessian、 XML 等。
除了序列化与网络传输两个核心模块外,服务发现通常是必备模块。 客户端在做远程过程调用时,首先需要发现远程主机上可调用的服务。 实现方式是创建服务注册中心。服务端所有可调用的函数、对象都需要 在服务注册中心注册,客户端需要从注册中心处获得可调用的服务对象。 为了提升注册中心的可用性,避免单点故障,有些RPC 方案中还采用 Zookeeper集群作为注册中心
远程方法调用 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 是快 速开发应用原型的一个很好的候选工具。
虽然分布式系统有着诸多优点,但也存在着诸多需要解决的问题,一致 性问题就是其中的关键问题。分布式系统中的一致性问题通常发生在两 种场景中。( 1 )数据复制( 2 )分布式事务
复制机制的目的是为了保证数据的一致性。但是数据复制面临的主要难题也是如何保证多个副本之间的数据一致性。在分布式系统引入复制机制后,不同的数据节点之间由于网络延时等原 因很容易 产生数据不一致的情况。
分布式事务举例
数据库 ACID 原则在 单台服务器 就能完成任务的时代,很容易实现,但是 现在面对如此庞大的访问量和数据量,单台服务器已经不可能适应了, 而ACID 在集群环境下几乎不可能达到人们的预期,保证了 ACID ,效率就 会大幅度下降,为了达到这么高的要求,系统很难扩展,因此就出现了 CAP理论和 BASE 理论。
一致性指“ All nodes see the same data at the same time” ,即更新操作成 功并返回客户端完成后,所有节点在同一时间的数据完全一致。对于一 致性,可以分为从客户端和服务端两个不同的视角来看。• 从客户端来看,一致性主要指多并发访问时更新过的数据如何获取的问题。• 从服务端来看,则是如何将更新复制分布到整个系统,以保证数据的最终一致性问题。
二阶段提交 (Two-phaseCommit) 是指,在计算机网络以及数据库领域内, 为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性 而设计的一种算法
准备阶段
事务协调者 ( 事务管理器 ) 给每个参与者 ( 资源管理器 ) 发送 Prepare 消息,每 个参与者要么直接返回失败( 如权限验证失败 ) ,要么在本地执行事务,写 本地的redo (记录每条新增或者修改后的数据)和 undo (记录需要回滚 的数据)日志,但不提交
提交阶段
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送 回滚(Rollback) 消息;否则,发送提交 (Commit) 消息;参与者根据协调者 的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。 (注意 : 必须在最后阶段释放锁资源 )
二阶段提交的缺点
两种方案:– 口信消息解决方案( A Solution with oral message ) , O M(m) 算法– 签名消息解决方案( A solution with signed message ) , SM(m) 算法
在系统的实现层面,分布式文件系统内部按照数据块 (chunk) 来 组织数据,每个数据块的大小相同,每个数据可以包含多个 Blob对象或者定长块,一个大文件也可以拆分成为多个数据块。• 分布式文件系统将这些数据块分散存储到分布式存储集群中去, 处理数据的复制、一致性、负载均衡、容错等分布式系统难题, 并将用户对Blob 对象、定长块以及文件的操作映射成为对底层 数据块的操作。
分布式系统能够将数据分布到多个节点,并在多个节点之间实现负载均衡。其方式主要有两种:– 散列分布, 如一致性散列,代表系统为 Amazon 的 Dynamo 系统;– 顺序分布, 即每张表格上的数据按照主键整体有序,代表系统为 Google的 Bigtable 。
分布式存储的一个好处是实现了可扩展性,能够存储和处理比单台机器 所能容纳的大得多的数据集。而实现可扩展性的重要方式之一是对数据 进行分区。分区是指讲一个数据集拆分为多个较小的数据集,同时将存储和处理这些较小数据集的责任分配给分布式系统中的不同节点。 分区后,可以通过向系统中添加更多节点来增加系统存储和处理数据的规模。
垂直分区:对表的列进行拆分,将某些列的整列数据拆分到特定的 分区,并放入不同的表中。优点:减少了表的宽度,每个分区都包含了其中的列对应的所有行。 垂直分区也称为“行拆分”,每一行数据都要进行拆分。例如可以将包 含text 、 blob 类型的列垂直分区,确保完整性的同时提高了访问性能。
( 2 )水平分区:对表的行进行拆分,讲不同的行放入不同的表中,所有 在表中 定义的列在每个分区中都能找到,所以标的特性依然得以保留。例如,一个整年的销售表可以按月拆分成 12 张表,每个分区存储一个月 的数据
范围分区 哈希分区 一致性哈希
单主复制的优点• 简单易懂,易于实现。• 仅在主节点执行并发写的操作,能够保证操作的顺序,避免了在各个节点处理数据冲突这类复杂的情况,这个特性使得单主复制更容易支持事务类操作。• 对于大量读请求工作负载的系统,单主复制是可扩展的,可以通过增 加多个从节点来提升读的性能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。