分布式系统架构设计.docx
《分布式系统架构设计.docx》由会员分享,可在线阅读,更多相关《分布式系统架构设计.docx(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本文作者Kate Matsudaira 是一位秀丽的女工程副总裁,曾在Sun Microsystems、微软、亚马逊这些一流的IT 公司任职。她有着格外丰富的工作阅历和团队治理阅历,当过程序员、工程经理、产品经理以及人事经理。专注于构建和操作大型Web 应用程序/网站,目前她的主要争论方向是SaaS软件即效劳应用程序和云计算如大家所说的大数据。本文是作者在AOSA 一书介绍如何构建可扩展的分布式系统里的内容,在此翻译并共享给大家。开源软件已经成为很多大型网站的根本组成局部,随着这些网站的逐步壮大,他们的网站架构和一些指导原则也开放在开发者们的面前,赐予大家切实有用的指导和帮助。这篇文章主要侧重
2、于Web 系统,并且也适用于其他分布式系统。Web 分布式系统设计的原则构建并运营一个可伸缩的Web 站点或应用程序到底是指什么?在最初,仅是通过互联网连接用户和访问远程资源。和大多数事情一样,当构建一个Web 效劳时,需要提前抽出时间进展规划。了解大型网站创立背后的留意事项以及学会权衡,会给你带来更加明智的决策。下面是设计大型Web 系统时,需要留意的一些核心原则: 可用性 性能 牢靠性 可扩展 易治理 本钱上面的这些原则给设计分布式Web 架构供给了肯定的根底和理论指导。然而,它们也可能彼此相左,例照实现这个目标的代价是牺牲本钱。一个简洁的例子:选择地址容量,仅通过 添加更多的效劳器可伸缩
3、性,这个可能以易治理你不得不操作额外的效劳器和本钱作为代价效劳器价格。无论你想设计哪种类型的Web 应用程序,这些原则都是格外重要的,甚至这些原则之间也会相互羁绊,做好它们之间的权衡也格外重要。根底当涉及到系统架构问题时,这几件事情是必需要考虑清楚的:什么样的模块比较适宜?如何把它们组合在一起?如何进展恰当地权衡?在扩大投资之前,它通常需要的并不是一个精明的商业命题,然而,一些深谋远虑的设计可以帮你在将来节约大量的时间和资源。本文争论的重点几乎是构建全部大型Web 应用程序的核心:效劳、冗余、分区和故障处理力量。这里的每个因素都会涉及到选择和妥协,特别是前面所争论的那些原则。解释这些核心的最正
4、确方法就是举例子。图片托管应用程序有时,你会在线上传图片,而一些大型网站需要托管和传送大量的图片,这对于构建一个具有本钱效益、高可用性并具有低延时快速检索的架构是一项挑战。在一个图片系统中,用户可以上传图片到一个中心效劳器里,通过网络连接或API 对这些图片进展恳求,就像Flickr 或者Picasa。简洁点,我们就假设这个应用程序只包含两个核心局部:上传写图片和检索图片。图片上传时最好能够做到高效,传输速度也是我们最关心的,当有人向图片发出恳求时例如是一个Web 页面或其他应用程序。这是格外相像的功能,供给Web 效劳或内容分发网络一个CDN 效劳器可以在很多地方存储内容, 所以无论是在地理
5、上还是物理上都更加接近用户,从而导致更快的性能边缘效劳器。该系统需要考虑的其他重要方面:图片存储的数量是没有限制的,所以存储应具备可伸缩,另外图片计算也需要考虑下载/恳求需要做到低延迟用户上传一张图片,那么图片就应当始终在那里图片数据的牢靠性 系统应当易于维护易治理由于图片托管不会有太高的利润空间,所以系统需要具备本钱效益图 1 是个简化的功能图图 1 图片托管系统的简化构造图在这个例子中,系统必需具备快速、数据存储必需做到牢靠和高度可扩展。构建一个小型的应用程序就微缺乏道了,一台效劳器即可实现托管。假设这样,这篇文章就毫无兴趣和吸引力了。假设我们要做的应用程序会渐渐成长成Flickr 那么大
6、。效劳当我们考虑构建可伸缩的系统时,它应有助于解耦功能,系统的每个局部都可以作为自己的效劳并且拥有清楚的接口定义。在实践中,这种系统设计被称作面对效劳的体系构造SOA。对于此类系统,每个效劳都有它自己的独特功能,通过一个抽象接口可以与外 面的任何内容进展互动,通常是面对公众的另一个效劳API。把系统分解成一组互补性的效劳,在相互解耦这些操作块。这种抽象有助于在效劳、根本环境和消费者效劳之间建立格外清楚的关系。这种分解可以有效地隔离问题,每个块也可以相互伸缩。这种面对效劳的系统设计与面对对象设计格外相像。在我们的例子中,全部上传和检索恳求都在同一台效劳器上处理。然而,由于系统需要具备可伸缩性,所
7、以把这两个功能打破并集成到自己的效劳中是有意义的。快进并假设效劳正在大量使用;在这种状况下,很简洁看到写图片的时间对读图片时间会产 生多大影响他们两个功能在彼此竞争共享资源。依据各自体系,这种影响会是巨大的。即使上传和下载速度一样这是不行能的,对于大多数的IP 网络来说,下载速度:上传速度至少是 3:1,通常,文件可以从缓存中读取,而写入,最终是写到磁盘中或许在最终全都的状况下,可以被多写几次。即使是从缓存或者磁盘类似SSD中读取,数据写 入都会比读慢Pole Position,一个开源DB 基准的开源工具和结果。这种设计的另一个潜在问题是像Apache 或者Lig d 这些Web 效劳器通常
8、都会有一个并发连接数上限默认是500,但也可以更多,这可能会花费高流量,写可能会快速消掉所 有。既然读可以异步或利用其他性能优化,比方gzip 压缩或分块传输代码,Web 效劳可以快速切换读取和客户端来效劳于更多的恳求,超过每秒的最大连接数Apache 的最大连接数设置为 500,这种状况并不常见,每秒可以效劳几千个读取恳求。另一方面,写通常倾向于保持一个开放的链接进展持续上传,所以,使用家庭网络上传一个 1 MB 的文件花费的时间可能会超过 1 秒,所以,这样的效劳器只能同时满足500 个写恳求。图 2:读取分别规划这种瓶颈的一个格外好的做法是把读和写进展分别,如图2 所示。这样我们就可以对
9、 它们单独进展扩展始终以来读都比写多但也有助于弄明白每个点的意思。这种分别更易于排解故障和解决规模方面问题,如慢读。这种方法的优点就是我们能够彼此独立解决问题在同种状况下,无需写入和检索操作。这两种效劳仍旧利用全球语料库的图像,但是他们可以自由地优化性能和效劳方法例如排 队恳求或者缓存流行图片下面会介绍更多。从维护和本钱角度来看,每一个效劳都可 以依据需要独立进展扩展,但假设把它们进展合并或交织在一起,那么有可能无意中就会对 另一共性能产生影响,如上面争论的情景。固然,假设你有两个不同的端点,上面的例子可能会运行的很好事实上,这格外类似于几个云存储供给商之间的实现和内容分发网络。虽然有很多种方
10、法可以解决这些瓶颈,但每个人都会有不同的权衡,所以承受适合你的方法才是最重要的。例如,Flickr 解决这个读/写问题是通过分发用户跨越不同的碎片,每个碎片只能处理一组用户,但是随着用户数的增加,更多的碎片也会相应的添加到群集里请参阅 Flickr 的扩展介绍。在第一个例子中,它更简洁基于硬件的实际用量进展扩展在整个系统中的读/写数 量,而Flickr 是基于其用户群进展扩展(but forces the assumption of equal usage across users so there can be extra capacity)。而前面的那个例子,任何一个中断或者问题都会降低整
11、个系统功能例如任何人都没方法执行写操作,而Flickr 的一个中断只会影响到其所在碎片的用户数。在第一个例子中,它更简洁通过整个数据集进展操作例如,更写服 务,包括的元数据或者通过全部的图片元数据进展搜寻而 Flickr 架构的每个碎片都需要被更或搜寻或者需要创立一个搜寻效劳来收集元数据事实上,他们就是这样做 的。当谈到这些系统时,其实并没有格外正确的答案,但有助于我们回到文章开头处的原则上看 问题。确定系统需求大量的读或写或者两个都进展、级别并发、跨数据查询、范围、种类等等,选择不同的基准、理解系统是如何出错的并且对以后的故障发生状况做些扎实的计 划。冗余为了可以正确处理错误,一个Web 架
12、构的效劳和数据必需具备适当的冗余。例如,假设只有一个副本文件存储在这台单独的效劳器上,那么假设这台效劳器消灭问题或丧失,那么该文件也随即一起丧失。丧失数据并不是什么好事情,避开数据丧失的常用方法就是多创立几个文件或副本或冗余。同样也适用于效劳器。假设一个应用程序有个核心功能,应确保有多个副本或版本在同时运行,这样可以避开单节点失败。在系统中创立冗余,当系统发生危机时,假设需要,可以消退单点故障并供给备份或备用功 能。例如,这里有两个一样的效劳例如在生产环境中运行,假设其中一个发生故障或者降低, 那么该系统容错转移至那个安康的副本上。容错转移可以自动发生也可以手动干预。效劳冗余的另一重要组成局部
13、是创立一个无共享架构。在这种体系构造中,每个节点都能相 互独立运行,并且没有所谓的中心“大脑”治理状态或协调活动其他节点。这对系统的可扩展帮助很大,由于节点在没有特别要求或学问的前提下被添加。然而,最重要的是,这些系统是没有单点故障的,所以失败的弹性就更大。例如在我们的图片效劳器应用程序中,全部的图片在另一个硬件上都有冗余副本抱负状况 下是在不同的地理位置,避开在数据中心发生一些火灾、地震等自然事故,效劳去访问图片将被冗余,全部潜在的效劳恳求。参见图3:承受负载均衡是实现这点的最好方法,在下面还会介绍更多方法图 3 图片托管应用程序冗余分区数据集有可能格外大,无法安装在一台效劳器上。也有可能这
14、样,某操作需要太多的计算资 源、性能降低并且有必要增加容量。在这两种状况下,你有两种选择:纵向扩展或横向扩展。纵向扩展意味着在单个效劳器上添加更多的资源。所以,对于一个格外大的数据集来说,这可能意味着添加更多或更大的硬件设备,来使一台效劳器能容下整个数据集。在计算操作下,这可能意味着移动计算到一个更大的效劳器上,拥有更快的CPU 或更大的内存。在各种状况下,纵向扩展可以通过提升单个资源的处理力量来完成。横向扩展在另一方面是添加更多的节点,在大数据集下,这可能会使用其次效劳器来存储部 分数据集,对于计算资源来说,这意味着分割操作或跨节点加载。为了充分利用横向扩展, 它应作为一种内在的系统架构设计
15、原则,否则修改或拆分操作将会格外麻烦。当谈到横向扩展时,最常见的做法是把效劳进展分区或碎片。分区可以被派发,这样每个逻 辑组的功能就是独立的。可以通过地理界限或其他标准,如非付费与付费用户来完成分区。这些方案的优点是他们会随着容量的增加供给一个效劳或数据存储。在我们的图片效劳器案例中,用来存储图片的单个文件效劳器可能被多个文件效劳器取代, 每个里面都会包含一套自己独特的图像。见图 4这种架构将允许系统来填充每一个文件/图片效劳器,当磁盘填满时会添加额外的效劳器。这样的设计需要一个命名方案,用来捆 绑图片文件名到其相应的效劳器上。图像名字可以形成一个全都的哈希方案并映射到整个效劳器上;或者给每张
16、图片安排一个增量ID,当客户端对图片发出恳求时,图片检索效劳只 需要检索映射到每个效劳器上例如索引的ID。图 4 图片托管应用程序冗余和分区固然,跨越多个效劳器对数据或功能进展分区还是有很多挑战的。其中的关键问题是数据本 地化。在分布式系统中,数据操作或计算点越接近,系统性能就会越好。因此,它也可能是个潜在问题,当数据分散在多个效劳器上时。有时数据不是在本地,那么就要迫使效劳器通 过网络来猎取所需的信息,这个猎取的过程就会设计到本钱。另一潜在问题是不全都。当这里有多个效劳对一个共享资源执行读写操作时,潜在可能会有另一个效劳器或数据存储参与进来,作为竞选条件一些数据需要更,但是读的优先级高于更在
17、这种状况下,数据就是不全都的。例如在图片托管方案中,有可能消灭的不全都是:假设一个客户端发送更“狗”图片恳求,进展重命名,把“Dog”改成“Gizmo”,但同时,另一个客户端正在读这张图片。在这种状况下,标题就是不清楚的。“Dog”或“Gizmo” 应当被其次个客户端接收。固然,在进展数据分区时会产生一些障碍,但是分区允许把每个问题拆分到治理群里通 过数据、负载、使用模式等。这样对可扩展和易治理都是有帮助的,但也不是没有风险的。这里有很多方式来降低风险和故障处理;然而,为了简便起见,并未在本文中具体说明,如 果你有兴趣,可以访问我的博客。总结以上介绍的都是设计分布式系统需要考虑的核心要素。可用
18、性、性能、牢靠性、可扩展、易治理、本钱这几个原则格外重要,但在实际应用中可能会以牺牲某个原则来实现另外一个原则, 在这个过程中就要做好权衡工作,做到因时制宜。在下面的构建分布式系统实战中,我们将会深入介绍如何设计可扩展的数据访问,包括负载均衡、代理、全局缓存、分布式缓存等。摘要:在上一篇构建高可扩Web 架构和分布式系统实战中,我们举例争论了设计分布式系统需要考虑的核心要素:可用性、性能、牢靠性、可扩展、易治理、本钱。而在这篇文章中,我们将深入介绍如何设计可扩展的数据访问,包括负载均衡、代理、全局缓存、分布式缓存等。本文作者Kate Matsudaira 是一位秀丽的女工程副总裁,曾在Sun
19、Microsystems、微软、亚马逊这些一流的IT 公司任职。她有着格外丰富的工作阅历和团队治理阅历,当过程序员、工程经理、产品经理以及人事经理。专注于构建和操作大型Web 应用程序/网站,目前她的主要争论方向是SaaS软件即效劳应用程序和云计算如大家所说的大数据。本文是作者在AOSA 一书介绍如何构建可扩展的分布式系统里的内容,我们进展了翻译并分为上下两篇分布共享给大家。在上一篇构建高可扩 Web 架构和分布式系统实战中, 我们举例争论了设计分布式系统需要考虑的核心要素:可用性、性能、牢靠性、可扩展、易治理、本钱。而在这篇文章中,我们将深入介绍如何设计可扩展的数据访问,包括负载均衡、代理、
20、全局缓存、分布式缓存等。构建快速可伸缩的数据访问块在争论完设计分布式系统的核心考虑因素后,下面让我们再一起争论难点局部:可扩展的数据访问。大多数简洁的Web 应用程序,例如LAMP 堆栈应用程序,看起来如图5 所示:图 5:简洁的Web 应用程序随着系统渐渐扩大,他们将面临两大主要挑战:构建可扩展的应用程序效劳器和数据访问机制。在一个高可扩的应用程序设计中,通常最小化的应用程序或Web效劳往往能表达 一种无共享的架构。这就使得应用程序效劳器层要进展横向扩展,这种设计的结果就是把繁重的工作转移到堆栈下层的数据库效劳和配置效劳上,这才是这一层上真正的可扩展和性能挑战。本文的剩余局部特地争论一些常见
21、策略和方法来使这些效劳可以快速和可扩展,提升数据的访问速度。图 6 过于简化的的Web 应用程序大多数系统可能会简化成图 6 那样,这是个格外不错的起点。假设你有大量的数据,想要快速便捷地访问,就好比在你书桌抽屉的最上面有一堆糖果。虽然过于简化,但也示意了两个难题:可扩展存储和快速的数据访问。为了这个例子,让我们假设有很多太字节TB数据,并且允许用户随机访问一小局部数据见图 7。这与本文图片应用程序里的在文件效劳器上定位一个图片文件格外相像。图 7 访问特定数据这也是个格外大的挑战,把 TB 级数据加载到内存中的本钱比较昂贵,这可以直接转化到磁盘上进展IO。从磁盘上读取要比内存慢的多内存访问和
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 系统 架构 设计
限制150内