分布式系统架构的基本原则和实践概述

1、分布式系统遵循几个基本原则

1. CAP原理

CAP Theorem,CAP原理中,有三个要素:node

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容忍性(Partition tolerance)

CAP原理指的是,在分布式系统中这三个要素最多只能同时实现两点,不可能三者兼顾。所以在进行分布式架构设计时,必须作出取舍。而对于分布式数据系统,分区容忍性是基本要求,不然就失去了价值。所以设计分布式数据系统,就是在一致性和可用性之间取一个平衡。对于大多数web应用,其实并不须要强一致性,所以牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。web

从客户端角度,多进程并发访问时,更新过的数据在不一样进程如何获取的不一样策略,决定了不一样的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。若是能容忍后续的部分或者所有访问不到,则是弱一致性。若是通过一段时间后要求能访问到更新后的数据,则是最终一致性。 但web应用也有例外,好比支付宝系统,就要求数据(银行帐户)的强一致性,并且面对大量淘宝用户,可用性要求很高,所以只能牺牲数据的分区冗余。这一点也曾在和支付宝工程师交流时,获得验证。算法

2. C10K问题

分布式系统另外一个理论是C10K问题,即系统的并发用户增长1万(customer ten thousand,过去一台服务器承载假设为1万用户,如今平均3~5万),是否意味着增长一台机器就能解决问题?答案一般是否认 由于这涉及到系统的应用架构问题----串行系统和并行系统的架构和性能提高的关系: 串行系统通常设备越多,性能成一条向下弯曲的曲线,最差状况,可能性能不增反降;而并行分布式系统设备越多,性能是正比例线性增加的直线mongodb

1

3. 串行系统和并行系统的可靠性问题

一个大系统通常都有超过 30 个环节(串行):若是每一个环节都作到 99% 的准确率,最终系统的准确率是 74%; 若是每一个环节都作到98%的准确率,最终系统的准确率 54%。一个 74% 的系统是可用的(有商业价值的),一个 54% 的系统仅比随机稍好一点,不可用。这就是作大系统的魅力和挑战! 而以上描述只是各模块串行系统所遇到的问题数据库

若是是并行系统,准确率=1-(1-A)^B ,其中A是单个模块准确率,B是并行模块个数 如系统中每一个模块的准确率是70%,那么3个模块并行,总体准确率=1-0.3^3=97.3%,若是是4个并行,准确率=1-0.3^4=99.19%,我在想这就是负载均衡靠谱的数学原理 5个9或6个9的QoS必定是指数思惟的结果,线性思惟等于送死后端

而对系统单一模块优化,准确性和可用性提高一个百分点,越接近100%,难度越大,投入成本越不可控(系统熵永不为零) 所以可靠性系统必然选择并行分布式做为架构的基本方法。服务器

从数据的存储角度,多份冗余也是可靠性保障的一个方法。分布式存储的冗余备份常规是3份(aws就这么干的),古埃及的罗塞塔rosetta石碑用古埃及象形文字、埃及拼音和古希腊文三种文字记录一段历史,就算象形文字缺了一部分,没人能看懂,也能破译补全,这大概也是raid5的思想起源吧网络

2

2、分布式系统架构的实践概述

1. 分布式存储架构

** 分布式存储架构现阶段有3种模式 **架构

1.1 物理存储采用集中式,存储节点采用多实例的方式

例如NFS挂载SAN、NAS并发

3

1.2 带有中央控制器的分布式存储

luster、moosefs、googlefs、TFS(taobao FS)

分布式存储通常特征是具有2个角色metadata server和storage node,将文件的元数据(描述数据的数据,如文件位置、大小等等)和数据块文件分开存储 其中metadata server除保存文件的元数据外,还维护存储节点的ip、状态等信息。

luster架构

  • MDS--meatadata server
  • MDT--metadata target
  • OSS--obj storage server
  • OST--obj starage target 其中MDT和OST是能够挂在NAS等中央存储上的;可见,luster借鉴了上面中央存储的模式,不管元数据服务仍是节点服务都将服务实例和存储分离,但进化了一步,将元数据和数据块分离

luster系统很好解决了数据分布式存储,,在超级计算领域Lustre应用普遍,如美国LLNL国家实验室计算机系统、我国的天河超级计算机系统均采用Lustre搭建分布式存储系统。Lustre在全球排名前30个超级计算机系统中有15个在使用。

但有一个问题,就是metadata server的SPoF(single point of failure)问题,即单点故障;一旦metadata server挂了,整个集群也就挂了。实际应用中,是有解决方案的,如dell的官网有个pdf,就是采用heart beat和drbd网络raid的方式,启动2个实例,再如和keepalived一块儿组成故障转移的方案等等,能够本身试试 4

moosefs架构

moosefs架构和luster很类似,但进化了一步,mater(也就是metadata server)能够有从机备份了,并且能够多个 并且服务实例和存储放在一块儿,没有像luster,自此服务和数据不离不弃了;其实luster也能够简化成不离不弃模式,moosefs也能够学他搞个后端存储,但随着云计算、追求低成本的趋势,采用SAN这样存储设备就太贵了 5

1.3 去中心化、全对称的架构(non-center or symmetric)

其设计思想是采用一致性哈希consistent hash算法(DHT的一种实现,关于一致性hash具体参考后面的连接)来定位文件在存储节点中的位置,从而取消了metadata server的角色

6

整个系统只有storage node一个角色,不区分元数据和数据块; 典型系统如sheepdog,但sheepdog是为知足kvm镜像和类EBS块存储而设计的,不是常规的分布式文件系统,架构以下 7

为了维护存储节点的信息,通常采用P2P技术的totem single ring算法(corosync是一种实现)来维护和更新node路由信息 对称架构有一个问题,采用totem single ring算法的存储节点数量有限,由于node数量超过1000,集群内的通讯风暴就会产生(此处更正,应该是环太大,令牌传递效率降低,不会产生通讯风暴),效率降低,sheepdog提出了一个解决方案,就是在一致性hash环上作嵌套处理,如图 8

1.4 半对称结构

其实介于1.2metadata server中央控制和1.3全对称的架构之间还有一种,就是把metadata也作成对称结构,咱们能够称半对称结构,典型应用如fastdfs,淘宝一大牛fishman写的,主要用做图片存储,能够实现排重存储 看图,tracker cluster就是metadata server的角色,实现了对称架构设计 国内几个大的网站都使用了fastdfs,在实际使用中,发现storage server之间同步数据较慢,一直没仔细研究 10

2. 分布式数据库架构

分布式数据库通常都基于分布式文件系统实现数据的分片sharding,每中数据库都有本身的应用特性,就不作介绍,列出几个典型的应用,供参考 Google的big table,实现数据的追加存储append,顺序写入快速,不适合随机读的场景 hadoop的HBase mongodb hypertable 2010年之前,百度在用,今年infoq的中国qcon,百度的杨栋也讲了百度用hypertable的血泪史

###3. 分布式应用架构 分布式应用架构涉及具体应用场景,设计上除考虑上面的CAP和C10K等等经典分布式理论,还应根据业务进行权衡。 基本的思路是

3.1 在作完需求和模块设计后,要对各模块进行解藕Decoupling

传统的企业应用设计通常是一条操做从头跑到尾(串行系统),拿视频网站的流程距离,传统应用设计是先上传是视频,而后存储,编码,最后发布一条龙 以下图 11

3.2 先将各模块解藕,经过异步消息通知的方式将各模块连接

12

3.3 要考虑这个应用的压力承载点在哪,根据用户规模估算各模块的并行数量

(如本例中的encode压力大,就增长encode模块的并行系统数量),以下图 13

以上是分布式系统构建的基本原则和实践步骤,在实际应用中,仍有不少细节要考虑。但有一点要再强调,就是要根据业务来选择各层、各模块的技术,作好业务适用、成本和难度之间的权衡。

技术本无好坏,在于适当的使用和积累。

参考:

相关文章
相关标签/搜索