分布式系统

分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个系统。

分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。

从进程角度看,多个程序分别运行在多个主机的进程上,它们相互协作最终完成同一个服务或者功能,这些程序所组成的系统称作是分布式系统。

这些程序可以是不同的,也可以是相同的。如果是相同的程序,我们又可以称之为"集群"。

集群,就是将相同的程序,通过不断横向扩展,以提高服务能力的方式。

集中式系统

集中式系统跟分布式系统是完全相反的两个概念。集中式系统就是把所有的程序、功能都集中到一台主机上,从而往外提供服务的方式。

分布式的优势

性能扩展——系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力。

增强可靠性——软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度。

分布式的缺陷

建立一个分布式的数据管理系统的时候,必须得面对"一致性"问题。

对数据一致性要求很高,就不得不容忍一些缺陷例如规模伸缩困难;而如果放弃一致性,就可以轻松伸缩规模,但必须解决好由此带来的一系列数据不一致导致的问题。(CAP 问题)

CAP

Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)

一个分布式系统里面,节点组成的网络本来应该是连通的。

而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域,数据就散布在了这些不连通的区域中,这就叫分区。

当一个数据项只在一个节点中保存,分区出现后,和这个节点不连通的部分就访问不到这个数据了,这时分区就是无法容忍的。

提高分区容忍性的办法就是一个数据项复制到多个节点上,出现分区之后,这一数据项就可能分布到各个区里,容忍性就提高了。

然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。

要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。

数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。

为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

设计分布式系统时面临的挑战

异构性:分布式系统由于基于不同的网络、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通信协议来屏蔽异构系统之间的差异。一般交由中间件来处理这些差异。

缺乏全球时钟:

在程序需要协作时,它们通过交换消息来协调它们的动作。

紧密的协调经常依赖于对程序动作发生时间的共识。

但是实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。

这是通过网络发送消息作为唯一的通信方式这一事实带来的直接结果。

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

故障的独立性:

任何计算机都有可能故障,且各种故障不尽相同。

他们之间出现故障的时机也是相互独立的。

一般分布式系统要设计成被允许出现部分故障而不影响整个系统的正常使用。

并发:

分布式系统的目的,是为了更好的共享资源。

那么系统中的每个资源都必须被设计成在并发环境中是安全的。

透明性:分布式系统中任何组件的故障、或者主机的升级、迁移对于用户来说都是透明的,不可见的。

开放性:分布式系统由不同的程序员来编写不同的组件,组件最终要集成成为一个系统,那么组件所发布的接口必须遵守一定的规范且能够被互相理解。

安全性:

加密用于给共享资源提供适当的保护,在网络上所有传递的敏感信息,都需要进行加密。

拒绝服务攻击仍然是一个有待解决的问题。

可扩展性:系统要设计成随着业务量的增加,相应的系统也必须要能扩展来提供对应的服务。


老污的猫
30 声望5 粉丝

« 上一篇
Restful

引用和评论

0 条评论