首页 > 代码库 > 什么是分布式系统

什么是分布式系统


什么是分布式系统
分布式系统有多个含义:
1)表示计算机科学的一个研究领域,研究方向。这个层面的分布式系统比较学术,不是本文讨论的对象。
2)工程领域的实际使用的分布式系统。分布式系统是互联网应用的基石,是底层的支撑平台。本文讲的分布式系统指这个层面。

互联网应用的特点是:高并发,海量数据。互联网应用的用户数是没有上限的(取决于其开放特性),这也是和传统应用的本质区别。高并发指系统单位时间内收到的请求数量(取决于使用的用户数),没有上限。海量数据包括:海量数据的存储和海量数据的处理。这两个工程难题都可以使用分布式系统来解决。

简单理解,分布式系统就是把一些计算机通过网络连接起来,然后协同工作。协同工作需要解决两个问题:
1)任务分解
把一个问题拆解成若干个独立任务,每个任务在一台节点上运行,实现多任务的并发执行。

2)节点通信
节点之间互相通信,需要设计特定的通信协议来实现。协议可以采用RPC或Message Queue等方式。

架构
集群系统主要有两种风格的架构:
client server(C/S)架构

任务分解

任务分成两部分,client和server。client和server执行不同的任务,client需要调用server来实现自己的任务。


节点通信

在基于B/S架构的设计中,广泛采用HTTP作为通信协议。


三层架构(多层架构,3-tier architecturen-tier architecture)

这个架构是C/S架构的衍生,某些server可以再运行client任务,调用其他server,形成一个层次级联。多层架构的通信协议可以有多种。
数据库系统都会提供专用客户程序,来访问数据库。这个客户程序内部实现了数据库访问协议。

peer-to-peer架构

peer-to-peer的分布式系统中,各个节点都是对等的,运行同种类型的任务。各个节点协同工作,整个分布式系统对外看来,就像一台机器,只不过性能更强。这种p2p架构的分布式系统其实就是集群


分布式系统和集群的关系

分布式系统和集群从表面上看是很类似的,都是将几台机器通过网络连接,解决某个问题或提供某个服务。
从广义上说,集群是分布式系统的一种类型,即基于P2P架构的分布式系统。


从狭义上说还是可以做一些区分:

集群:所有节点一起工作,实现同一服务。一个节点挂掉,不会对集群有任何影响。

分布式系统:系统每一个节点,都实现不同的服务,如果一个节点挂了,这个服务就不可访问了。在实际部署中,分布式系统中的每个节点都可以是一个集群,这样可以提高服务的可用性,性能等。


关于集群的介绍,可以参考之前的博文《什么是集群》


tier和layer的区别

这两个词的中文翻译都是层,而且在各种架构描述中大量使用。他们之间有什么区别?

tier用来描述系统的物理架构,或者说基础设施(infrastructure)设计。不同的tier之间是互相独立的,可以单独部署、监控。

layer用来描述系统的逻辑层次结构。针对每一个tier,可以使用layer来描述其设计实现架构。通常不同layer之间是有依赖关系的(上层依赖下层),而且运行在同一个进程空间中,比如经典的TPC/IP分层(layer)设计。


分布式系统实例

openstack架构

openstack包含了若干个组件(component),nova ,neturon,cinder,keystone等。其中的每个组件都是一个分布式系统。关于openstack的介绍可以看我的博文,有好多篇。


以nova为例来分析下这个系统
任务分解
nova中的任务分解以service为单位,每个service提供不同的功能,service也会调用其他的service。每个service可以单独部署在一台物理机器上。nova中的service介绍可以参考《openstack学习之概念篇》

nova中的service分成两类:一类似乎基于REST访问,一类是基于RPC访问。REST服务提供给外部访问,RPC服务由openstack内部使用。

简易架构图
openstack中的这些service本身是无状态的,因此理论上可以实现集群部署。openstack中有状态的服务是消息队列和数据库系统(这两个服务共整个openstack使用,其他的component同样使用)。常用的消息队列是RabbitMQ,数据库是MySQL。在大规模部署时,这两个服务可能会成为瓶颈,可以考虑集群部署。

节点通信
openstack中存在两种通信协议:REST和RPC
调用图中的Rest API service使用REST协议,其余的服务使用RPC协议。conductor service访问数据库需要相应的客户端。

openstac中RPC基于消息队列实现,具体参考博文《openstack学习之RPC》


Java EE架构
Java EE这个架构非常经典,绝大多数的Web站点都是基于这个思路搭建的。不知道3-tier architecture是谁发明的,但大家可能都是通过Java EE学到这个概念的。Java EE其实就是这个3-tier architecture的细化和规范化。

通常的3-tier architecture自然包括3个tier:
来源于http://en.wikipedia.org/wiki/3-tier_architecture

任务分解

任务分成3部分:

展现层(presentation tier, or web tier)

给用户提供操作界面GUI来使用该系统。一般是生成页面,使用HTTP协议访问,在浏览器中展现。随着移动端的流行,需要生成适合移动端访问的页面。


Java EE中在这一层,提供了很多的技术与规范,来支持应用开发。

Servlet:web tier的基石。

JSP

Unified Expression Language (EL)

JavaServer Pages Standard Tag Library (JSTL) 1.2 1.2

JavaServer Faces (JSF) 


业务逻辑层(business tier, or application tier)

具体的业务代码实现。web层会调用这一层。系统中的一些通用服务(所谓的cross cutting)也可以放在这一层来实现,如安全,日志等,数据检索等服务。


Java EE在这一层的技术与规范

Java API for RESTful Web Services (JAX-RS) :开发基于rest的服务。rest是目前的主流技术了。

Enterprise JavaBeans (EJB) :ejb的服务。早起的EJB过于复杂和笨重,不知ejb lite是否会好点。

Java Transaction API (JTA):事物处理API,支持XA协议。

Java Persistence API (JPA) :OR mapping API,源于Hibernate的API。


数据层

用来保存系统中的持久化数据。数据层的存储方式可以是:

关系数据库 + SAN storage

分布式文件系统(根据文本的描写,应叫文件系统集群)

NoSQL系统:NOSQL的数据模型,各不相同,产品也多种多样,根据业务特点选择。

  Amazon的 S3

  mongo


缓存

目前的web系统都会使用缓存来提高系统性能,传统的三层架构中没有谈到缓存。

缓存可以分成

数据缓存:比如memcached

页面缓存:如CSN系统


节点通信

Web层广泛采用HTTP作为通信协议。

业务逻辑层使用web service(REST).

数据层,不同产品有不同的协议。针对关系数据库,Java提供了JDBC访问接口。