分布式系统一、基础原理


一、分布式系统简介

1、什么是分布式系统?

      分布式这个词听起来很高大上, 实际上在我们以前经常构建分布式系统, 从最初的分离LAMP中的MySQL 到引入Varnish缓存页面, 再到使用LVS负载均衡Nginx|Apache, Nginx负载均衡Tomcat等等, 广义上都算是分布式系统.

       简单来说分布式就是将一个系统的各个组件(MySQL、PHP、Apache …)分布在网络上的各台主机, 并且各组件之间仅通过消息传递来通信并协调工作

定义:

        系统的各组件分布于网络上多台计算机,各组件彼此直接仅仅通过消息传递来通信并协调行动


2、分布式系统存在的意义

单机垂直(向上)扩展的性价比不高(比越来越低)

单机扩展存在性能上升临界点

出于稳定性及可用性考虑,单机会存在多方面的问题


3、单机扩展的方式

对单机进行垂直扩展无非通过扩展CPU,内存,IO来扩展单机的性能:

多CPU:

      多线程编程:

             互不通信的线程模型

             基于共享容器(消息队列)协同工作的模型

             通过事件协调的多线程模型

      多进程模型:


I/O:

     网络I/O机制:

            多进程:每个进程相应一个请求

            多线程:多进程,每个进程生成多个线程,每个线程响应一个用户请求

            多线程:每个线程直接响应多个请求

网络I/O机制又可以分为三类模式:      

       基于socket实现网络通信开发,其实现方式:

            BIO:Blocking IO  阻塞IO    一个socket套接字需要一个进程或一个线程来处理

                      一个进程或一个线程处理一个请求

            NIO:Nonblocking IO  

                       基于事件驱动(epool)思想,采用Reactor模式,每个socket套接字分配一个线程,一个线程可以处理多个套接字处理的工作

    AIO:异步 IO

                      基于事件驱动思想,采用Proactor模式


4、如何把应用从单机扩展至多机?

输出设备的变化?

输出设备的变化?

控制器的变化?

      独立的节点,

      实现模式:

             透明代理:

                   lvs的nat模式

                   haproxy,nginx

                   旁路模式

            名称服务:

                   DNS

    规则服务:

          Master/Slave机制:

运算器的变化?         

       独立的节点    

存储器的变化?

    

5、分布式系统实现的难点

缺乏全局时钟

面对故障时的独立性

很难处理单点故障

很难实现事务


事务要具有ACID(事务的测试标准). 但是这在分布式系统中很难实现:

A: Atomicity          原子性

C: Consistency      一致性

I: Isolation             隔离性

D: Durability         持久性

     很多数据库都能实现单机事务, 但是一旦构建为分布式系统, 单机的ACID就不能实现了, 

有两种选择: 1、放弃事务 2、引入分布式事务;


二、分布式事务的实现

1、一次事务中的主要角色

事务的参与者

支持事务的服务器

资源服务器

事务管理器


2、分布式事务的模型和规范

分布式事务的模型和规范: Distributed Transaction Processing: The XA Specification 

X/Open DTP: Distribution Transaction Process        #分布事务处理

X/Open(组织):XA(分布式事务规范)

X/Open DTP(分布式事务处理参考规范)定义了三个组件:

           AP:应用程序,即使用DTP模型的程序

           RMResource Manager,资源管理器,即DBMS系统

           TMTransaction Manager,事务管理器,负责协调和管理事务条例,提供给AP应用程序编程接口并管理资源管理器   


2PC

2PC : 两段式提交
     Two Phase Commitment Procotol

    如图: 一次事务首先要准备资源, 所有节点的资源都准备好后, 同时进行Commit(提交), 如果中途中断则会一起ROLLBACK(回滚), 从而实现数据一致性wKiom1fglObjznWPAACes4IPySY172.jpg


CAP

CAP:2000年7月 由 Eric Brewer提出, 并经过他人证明, 分布式系统不能同时满足CAP

     C:Consistency   一致性   所有主机的数据都是同步的

           任何一个读操作总是能够读取之前完成的写操作

      A:Availability   可用性   (指的是快速获取数据)   能够保证系统的可用性(有主机宕机不影响用户)

            每一次操作总是能够在确定的时间返回

      P:Tolerance of network Parttion    分区容错性: 即使网络出现故障从而分区, 不影响系统运行

任何一种分布式系统最多只能同时满足上述三项中的两项,因此分布式系统的目标加强A和P,在C上进行妥协

AP:放弃C,大多数分布式系统都选择此项(并不是真正放弃,而是通过其它方式实现)

CA:放弃p

CP:放弃A

一般情况下的分布式系统都是在C(Consistency)进行妥协


BASE     加强A和P,放弃C的模型

BASE模型:可替代ACID

   BA:Basically Availibale             基本可用性

       S: Soft state                            接受一段时间内的状态不同步

       E:Eventually Consisstent      最终一致性

相比于ACID而言, BASE并没有那么苛刻, BASE允许部分的失败但是不会引起系统的故障 
DNS就是最著名的Eventually Consistent的实现


3、一致性

强一致性:

     ACID

     在单机环境中,强一致性可以由数据库的事务来保证

     在多机环境中,强一致性很难做到

     分布式事务:性能太差,在互联网的应用中不适合

弱一致性(包括最终一致性):

      通过提交处理的半同步、半异步或全异步,取得最终一致性效 果

      最终一致性使得数据的提交具有延时性,而在一定范围的延时 性范围内(比如一秒),应用的可用性是正常的


服务器一致性:

N:节点的个数

W:更新的时候需要确认已经被更新的节点个数

R:读数据的时候读取数据的节点个数

W+R>N  强一致性(通常N=3,W=R=2)

W=N,R=1 最佳读

W=1,R=N  最佳写

W+R<=N 弱一致性


三、分布式存储和分布式文件系统

1、存储一般分为两种类型

集中式: 
       NAS: Network Attached Storage; 文件系统级别, 例如NFS, FTP, SAMBA… 
       SAN: Storage Aera Network; 块级别, 例如IP SAN, FC SAN…

分布式: 
       中心节点存储: 每个集群中有节点专门用来存储元数据, 其他节点则存储部分数据 
       无中心节点存储: 每个集群各节点都存储元数据和部分数据


2、分布式存储和分布式文件系统

存储: 无文件系统接口, 通过API访问

文件系统: 有文件系统接口


3、分布式系统挑战

节点间通信

数据存储

数据空间平衡

容错

文件系统支持


4、分布式文件系统设计目标

访问透明      

位置透明

并发透明(加锁)

失效透明(冗余)

硬件透明

可扩展性

复制透明:

迁移透明:                           


四、分布式文件系统或存储解决方案

GFS:Google File System              #适合存储少量大文件

      Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。

下面分布式文件系统都是类 GFS的产品。


HDFS:Hadoop Distributed File System (hadoop 分布式文件系统)       #适合存储少量大文件

      namenode:名称节点  中心节点(存储元数据)   元数据存储在内存中

      datanode:数据节点

使用场景:数量不太多的大文件。百万级没问题,通常所说的海量指亿级别

       Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。


TFS:Taobao FS  将元数据存储于关系型数据库或其它高性能存储中,从而能维护海量文件元数据

使用场景:海量小文件

      TFS(Taobao !FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

官网 : http://code.taobao.org/p/tfs/wiki/index/


GlusterFS:去中心化的设计模式   (越来越流行)       


ceph:linux内核级实现的文件系统,已经被直接收录进Linux内核(现在还不稳定,BUG较多)

        是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。

说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。

可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。


轻量级文件系统(也可以达到千万):

MooseFS:mfs   性能效果不理想 

              1、支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多(豆辩在用),适合数量少的大文件   

             2、高可用性(数据可以存储在多个机器上的多个副本)

             3、通用文件系统,不需要修改上层应用就可以使用(那些需要专门api的dfs好麻烦哦!)。
             4、可以在线扩容,体系架构可伸缩性极强。(官方的case可以扩到70台了!)
             5、部署简单。(sa们特别高兴,领导们特别happy!)
             6、体系架构高可用,所有组件无单点故障。 (您还等什么?
             7、件对象高可用,可设置任


MogileFS:大众点评,perl语言开发       

           由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。

MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。

MogileFS由3个部分组成:

  第1个部分是server端,包括mogilefsd和mogstored两个程序。

前者即是 mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。

后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。

  第2个部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。

  第3个部分是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能。


FastDFS:C语言开发,元数据存储在内存中,

       国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能。简洁高效

     是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,

功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。

特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

官方论坛  http://bbs.chinaunix.net/forum-240-1.html

FastDfs google Code     http://code.google.com/p/fastdfs/

分布式文件系统FastDFS架构剖析   http://www.programmer.com.cn/4380/


五、如何区分分布式、集群、并行文件系统

       分布式文件系统、集群文件系统、并行文件系统,这三种概念很容易混淆,实际中大家也经常不加区分地使用。总是有人问起这三者的区别和联系,其实它们之间在概念上的确有交叉重叠的地方,但是也存在显著不同之处。
 
分布式文件系统:
       自然地,“分布式”是重点,它是相对与本地文件系统而言的。

分布式文件系统通常指C/S架构或网络文件系统用户数据没有直接连接到本地主机,而是存储在远程存储服务器上。NFS/CIFS是最为常见的分布式文件系统,
这就是我们说的NAS系统。分布式文件系统中,存储服务器的节点数可能是1个(如传统NAS),也可以有多个(如集群NAS)。对于单个节点的分布式文件系统来说,存在单点故障和性能瓶颈问题。
除了NAS以外,典型的分布式文件系统还有AFS,以及集群文件系统(如Lustre, GlusterFS, PVFS2等)。
 
集群文件系统
     “集群”主要分为高性能集群HPC(High Performance Cluster)、高可用集群HAC(High Availablity Cluster)和负载均衡集群LBC(Load Balancing Cluster)。
集群文件系统是指协同多个节点提供高性能、高可用或负载均衡的文件系统,它是分布式文件系统的一个子集,消除了单点故障和性能瓶问题。对于客户端来说集群是透明的,
它看到是一个单一的全局命名空间,用户文件访问请求被分散到所有集群上进行处理。此外,可扩展性(包括Scale-Up和Scale-Out)、可靠性、易管理等也是集群文件系统追求的目标。
在元数据管理方面,可以采用专用的服务器,也可以采用服务器集群,或者采用完全对等分布的无专用元数据服务器架构。
目前典型的集群文件系统有SONAS, ISILON, IBRIX, NetAPP-GX, Lustre, PVFS2, GlusterFS, Google File System, LoongStore, CZSS等。

 
并行文件系统

       这种文件系统能够支持并行应用,比如MPI。在并行文件系统环境下,所有客户端可以在同一时间并发读写同一个文件。并发读,大部分文件系统都能够实现。
并发写实现起来要复杂许多,既要保证数据一致性,又要最大限度提高并行性,因此在锁机制方面需要特别设计,如细粒度的字节锁。
通常SAN共享文件系统都是并行文件系统,如GPFS、StorNext、GFS、BWFS,集群文件系统大多也是并行文件系统,如Lustre, Panasas等。
 
如何区分?
        区分这三者的重点是“分布式”、“集群”、“并行”三个前缀关键字。

简单来说,非本地直连的、通过网络连接的,这种为分布式文件系统;
分布式文件系统中,服务器节点由多个组成的,这种为集群文件系统;支持并行应用(如MPI)的,这种为并行文件系统。
在上面所举的例子中也可以看出,这三个概念之间具有重叠之处,比如Lustre,它既是分布式文件系统,也是集群和并行文件系统。
但是,它们也有不同之处。集群文件系统是分布式文件系统,但反之则不成立,比如NAS、AFS。
SAN文件系统是并行文件系统,但可能不是集群文件系统,如StorNext。GFS、HDFS之类,它们是集群文件系统,但可能不是并行文件系统。
实际中,三者概念搞理清后,分析清楚文件系统的特征,应该还是容易正确地为其划分类别的。



本文出自 “xiexiaojun” 博客,请务必保留此出处http://xiexiaojun.blog.51cto.com/2305291/1728371

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告