分布式系统架构设计
分布式系统架构设计

分布式系统架构设计分布式系统架构设计是一个关键性的环节,它决定了整个系统的可靠性、可扩展性和性能。
一个好的架构设计可以提高系统的可用性,并且能够应对不同规模的负荷。
在分布式系统架构设计中,有几个关键的方面需要考虑,包括数据分割与分区、容错处理、通信协议和服务发现等。
一、数据分割与分区在分布式系统中,数据分布是非常重要的。
数据的分割与分区有助于提高系统的性能和伸缩性。
在进行数据分割与分区时,需要考虑以下几个方面:1. 数据的分割粒度:根据系统的实际需求,确定数据的分割粒度。
可以根据数据的特点、使用频率或者其他因素来进行分割,以达到负载均衡和高性能的目的。
2. 数据的分区策略:选择适当的分区策略,将数据分布到不同的节点上。
可以采用哈希分区、范围分区或者一致性哈希等策略,以实现数据的均衡分布和高可用性。
3. 数据的复制与同步:在分布式系统中,为了提高系统的可靠性和容错性,通常需要将数据进行复制和同步。
可以采用主从复制、多主复制或者分布式数据库等方式,来实现数据的备份和同步。
二、容错处理在分布式系统中,容错处理是非常重要的。
容错可以保证系统在面对节点故障或者网络故障时,能够继续正常运行。
在进行容错处理时,可以考虑以下几个方面:1. 副本和冗余:通过在系统中增加副本和冗余,可以提高系统的容错性和可用性。
可以采用主从复制、备份节点或者冗余路由等方式来实现。
2. 故障检测与恢复:及时检测节点故障,并采取相应的恢复措施。
可以采用心跳检测、超时设置或者一致性协议等方式来实现。
3. 容错算法和协议:选择适当的容错算法和协议,可以保证系统在面对故障时能够正确地处理。
可以采用Paxos、Raft或者拜占庭容错协议等方式来实现。
三、通信协议在分布式系统中,节点之间的通信非常重要。
选择合适的通信协议可以提高系统的性能和可靠性。
在进行通信协议的选择时,可以考虑以下几个方面:1. 可靠性与延迟:根据系统的实际需求,选择适当的通信协议。
分布式系统架构设计

分布式系统架构设计分布式系统架构设计是指将一个大型系统拆分成多个子系统,并通过网络连接起来,使得这些子系统能够并行工作,共同完成系统的功能需求。
在设计分布式系统架构时,需要考虑诸多因素,如可扩展性、容错性、数据一致性、性能等。
下面将从这些方面详细介绍分布式系统架构设计的内容。
首先,可扩展性是设计分布式系统的重要考虑因素之一、随着系统的规模增大,系统可能面临更高的负载压力,需要通过增加计算节点等方式来增加系统的容量。
因此,在设计分布式系统架构时,需要考虑如何实现系统的横向扩展性,使得新的节点能够简单地加入到系统中,并能够平衡负载。
其次,容错性也是一个关键的设计目标。
由于分布式系统中存在着网络延迟、节点故障等问题,因此需要考虑如何在节点故障时保证系统的正常运行。
通常的做法是通过冗余设计来提高系统的容错性,例如通过备份机制保证数据的可靠性,通过使用容器化技术保证节点的可替换性等。
数据一致性是分布式系统设计中的一个重要问题。
由于数据在不同的子系统中存储和处理,可能会面临数据一致性的问题。
在设计分布式系统架构时,可以采用两阶段提交协议、Paxos算法等技术来保证数据的一致性。
此外,还可以通过使用一致性哈希算法来解决数据分片的问题,将数据均匀地分布在不同的节点上,从而提高系统的性能。
性能是设计分布式系统时要考虑的另一个重要因素。
在分布式系统中,数据需要在不同的节点之间传输和处理,因此网络延迟、带宽等因素会影响系统的性能。
在架构设计时,可以使用缓存技术、异步消息队列等手段来优化系统的性能。
此外,还可以通过选择合适的数据存储引擎、调优系统配置等方式来提高系统的性能。
此外,随着云计算、大数据、物联网等技术的兴起,分布式系统架构设计面临着新的挑战和需求。
例如,在设计分布式系统架构时,需要考虑如何将系统部署在云环境中,充分利用云计算资源;如何处理大规模的数据流,实现实时分析和响应;如何处理大量的设备连接,保证系统的可扩展性和性能等。
大型分布式系统的架构设计与优化

大型分布式系统的架构设计与优化一、引言随着信息技术的迅猛发展,大型分布式系统作为当前最成功的软件体系结构之一,得到了广泛的应用。
然而,在应用领域的多样性和复杂性背后,分布式系统的架构设计和优化成为了制约其性能和可靠性的关键因素。
因此,本文将从架构设计和优化两个方面分别讨论大型分布式系统的特点,问题和解决方案。
二、架构设计1.分布式系统架构类型目前,常见的分布式系统架构类型包括面向服务的架构(SOA)、微服务架构(Microservices)、分布式时间戳架构(DTS)、数据流架构(Dataflow)等。
其中,面向服务架构的特点是功能模块化和资源共享;而微服务架构的特点是分离度高和独立可部署;分布式时间戳架构强调时序的维护;数据流架构强调数据流的处理和传输。
具体采用哪种架构类型需要考虑实际需求和数据架构等一系列因素。
2.分布式系统中的关键问题2.1 数据一致性当分布式系统同时涉及到多个实例对数据进行写入和读取时,数据一致性成为了分布式系统中最重要的问题。
常用的解决方案包括基于锁的同步机制、基于消息传递的异步机制和基于版本的乐观并发控制。
2.2 容错和可靠性分布式系统中,容错和可靠性是至关重要的,这是由于分布式系统往往需要部署在多个节点上,而每个节点都可能成为故障的源头。
基于这种情况,常见的容错技术包括备份,超时重试和自我修复等。
2.3 可伸缩性随着系统规模的扩大,分布式系统需要能够处理更大并发量,更高的负载和更多的数据存储需求。
因此,分布式系统的可伸缩性需要考虑机器的横向和竖向扩展,以及数据分区和路由的支持等多种因素。
3.架构设计原则为了解决分布式系统架构中遇到的问题和挑战,需要遵循一些基本的架构设计原则。
首先是将应用程序拆分成独立的模块,以便每个单独的模块都可以部署和更新;其次是避免使用共享状态,以减少数据一致性的问题;最后是要保持低耦合度,以方便独立的部署和替换。
三、优化分布式系统1.资源管理和调度分布式系统往往有多个节点,各个节点之间会进行数据传输、计算协作等。
如何设计可扩展的分布式系统架构

如何设计可扩展的分布式系统架构设计可扩展的分布式系统架构是保证系统能够应对日益增长的负载和需求,实现高可用性和高性能的关键。
在设计分布式系统架构时,需要考虑各种因素包括系统规模、性能需求、可用性需求、数据一致性、容错能力、可维护性等。
下面将从以下几个方面进行介绍如何设计可扩展的分布式系统架构。
1.业务拆分与模块化设计:在设计分布式系统架构时,首先需要将系统按照业务功能进行合理的拆分,将复杂的系统划分成多个相互独立的模块,每个模块负责一部分业务功能。
这种模块化的设计有助于实现横向扩展,即通过增加相同的模块来提高系统性能。
同时,模块化设计也可以通过不同的团队并行开发,提高开发效率。
2.数据分区与负载均衡:将系统中的数据进行分区是设计可扩展分布式系统的常见策略。
通过将数据按照某种规则分散到不同的存储节点中,可以实现数据的分布式存储和查询。
同时,在查询时可以借助负载均衡技术将请求分布到各个存储节点上,达到负载均衡的效果,提高系统的响应性能。
3.异步消息和消息队列:在分布式系统中,通常会涉及到多个模块之间的数据传递和协作。
为了实现解耦和高可扩展性,可以采用异步消息传递的方式。
即将模块间的数据改变通过消息进行通知,接收到消息的模块可进行相应的处理。
同时,引入消息队列可以实现消息的持久化和可靠传递,提高系统的可用性和容错能力。
4.缓存和分布式缓存:缓存是提高系统性能和扩展性的常用策略。
将高频访问的数据缓存在内存中,可以减少磁盘读写和网络传输的开销,从而提高系统的响应性能。
而分布式缓存是将缓存数据分布在多个节点上,减少单个节点的压力,并提高系统对于负载和故障的容错能力。
5.横向扩展与自动伸缩:为了应对不断增长的负载,可以通过横向扩展来提高系统的性能和可扩展性。
即通过增加相同类型的节点来分担负载,实现负载均衡。
同时,为了应对负载波动的情况,可以采用自动伸缩技术来动态地增加或减少系统节点数量,以满足实时的负载需求。
分布式系统架构设计与优化

分布式系统架构设计与优化随着互联网时代的到来,分布式系统逐渐成为了现代软件开发中不可或缺的一部分。
分布式系统可以让多台计算机协同工作,共同完成复杂的任务,提高整个系统的可用性和性能。
在这篇文章中,我们将探讨如何设计和优化分布式系统的架构。
一、分布式系统的架构设计要设计一个好的分布式系统,需要考虑以下几个方面:1. 分布式系统的目标在设计分布式系统之前,需要明确分布式系统的目标和任务。
不同的目标可能需要不同的架构方式。
例如,某些系统需要高可用性,某些系统需要高吞吐量,而某些系统则需要高扩展性。
2. 服务的划分对于一个大型的分布式系统来说,服务的划分非常重要。
将服务划分为更小的、独立的子系统,有助于减少不同服务之间的依赖性,降低系统的复杂度,并且可以更灵活地进行扩展和升级。
3. 通信协议的选择分布式系统中不同的服务需要进行通信,因此通信协议的选择也非常重要。
应该选择高效、可靠的通信协议,同时保证通信过程中的数据安全性。
分布式系统中数据存储也是一个非常重要的问题。
可以选择传统的关系型数据库或者分布式数据库。
同时,还需要考虑数据的备份和容灾等问题。
5. 异常处理在分布式系统中,异常处理非常重要,因为分布式系统中不同的服务可能会由于不同的原因出现故障。
因此,需要考虑如何检测和处理异常,提高整个系统的可靠性。
二、分布式系统的架构优化除了设计好的架构,还需要不断地优化分布式系统,以提高系统的性能和可靠性。
下面是一些分布式系统的架构优化技巧:1. 负载均衡在分布式系统中,负载均衡非常重要。
负载均衡可以让请求被分配到不同的计算机上,降低单个计算机的负载,提高整个系统的性能。
可以选择硬件负载均衡器或软件负载均衡器。
2. 缓存使用缓存可以大大提高分布式系统的性能。
在分布式系统中,缓存一般分为本地缓存和分布式缓存。
本地缓存适用于一些相对静态的数据,而分布式缓存适用于需要共享的数据。
优化数据库也是提高系统性能的一个关键点。
分布式架构设计方案

分布式架构设计方案一、引言随着互联网和云计算的快速发展,分布式架构设计方案成为了现代软件系统开发中不可忽视的关键要素。
本文将介绍分布式架构概念、设计原则以及常用的分布式架构模式,并提供一个实际的分布式架构设计方案,以供参考。
二、分布式架构概述分布式架构是指将一个软件系统的不同功能模块或组件分布在多台服务器上,以实现高性能、高可靠性和可扩展性的设计方案。
它能够将系统负载分散到不同节点上,提高并发处理能力,并提供容错机制以保证系统的高可用性。
三、分布式架构设计原则1. 服务解耦:将系统拆分为独立的服务,每个服务负责特定的业务功能,通过接口进行通信,实现解耦和独立部署。
2. 异步通信:采用消息队列等异步通信方式,降低系统耦合度,提高系统的可扩展性和可靠性。
3. 水平扩展:通过水平扩展增加系统的处理能力,将负载均衡在不同的节点上,提高系统的性能和可用性。
4. 数据分区:将数据按照一定的规则进行分区存储,降低单一节点的负载压力,并提高系统的数据处理能力。
5. 容错设计:采用冗余备份和自动容错机制,保证系统的高可用性和数据的安全性。
四、常用的分布式架构模式1. 服务化架构:将系统拆分为多个微服务,每个微服务负责特定的业务功能,并通过RESTful API等方式进行通信。
2. 分层架构:将系统按照不同的职责和功能划分为多个层次,包括展示层、业务逻辑层、数据访问层等,实现功能模块的独立发展。
3. 多层缓存架构:通过在不同节点上设置缓存层,提高数据的读取速度和系统的响应性能。
4. 数据库分库分表架构:将数据库按照一定的规则进行分片存储,提高系统的数据存储能力和查询性能。
5. 分布式消息队列架构:采用消息队列作为通信中介,实现系统间的解耦和异步通信。
五、分布式架构设计方案示例为了让读者更好地理解分布式架构设计方案的实际应用,本文以一个电子商务系统为例,提供以下设计方案:1. 服务化架构:将系统拆分为用户服务、商品服务、订单服务等多个微服务,每个微服务可以独立部署和扩展。
如何进行分布式系统架构设计

如何进行分布式系统架构设计在当今互联网时代,随着大数据和云计算的崛起,分布式系统架构设计越来越成为互联网应用领域的主流趋势。
分布式系统架构设计的核心目标在于提高系统的可靠性、可伸缩性和可维护性。
一、概述随着数据量的不断增加,单一系统已经无法承载大规模的数据处理需求。
为了提高系统的处理能力和可靠性,分布式系统应运而生。
在分布式系统中,不同的计算资源被分布在多个计算节点之上,形成了一个协同工作的整体系统。
因此,分布式系统架构设计需要兼顾系统结构和实现方式两个方面。
二、分布式系统结构设计原则1. 服务分类和分层在分布式系统中,通常将系统中的服务按照功能划分为不同的服务分类。
不同的服务之间可以根据实际需要进行不同的部署和管理。
同时,可以通过分层来实现系统的各个服务之间的上下游功能调用。
2. 模块化设计在分布式系统中,系统的各个服务在功能上可以进行细分,每个细分功能模块可以独立的运行和部署。
这样,可以让系统更加模块化,架构更加清晰。
3. 异步化设计在分布式系统中,由于各个服务之间的通信以及数据的传输,通常需要较长的时延。
因此,在系统设计上可以采用异步化的方案,减少系统响应时间,提升系统的处理能力。
三、分布式系统实现方式1. 服务端框架服务端框架可以帮助我们快速搭建分布式系统,例如:Dubbo、Spring Cloud、Apache Thrift等。
这些框架提供了完善的服务化治理方案,可以通过框架来完成服务发布和服务的管理。
2. 消息中间件消息中间件是分布式系统实现的一种重要方式,通过消息中间件,可以实现分布式系统之间的异步通信。
目前业界比较主流的消息中间件有:Apache Kafka、RabbitMQ等。
3. 分布式存储分布式系统离不开分布式存储。
分布式存储可以通过对象存储、分布式文件系统、键值存储等多种方式实现。
常见的分布式存储方案有:Hadoop HDFS、Ceph、GlusterFS、MongoDB等。
分布式系统的架构设计及实现

分布式系统的架构设计及实现随着互联网的蓬勃发展,大量的数据处理需求不再是单一的、独立的任务,而是需要多方协作共同完成的任务。
这就引出了分布式系统的概念,通过将一个巨大的系统分解成许多小的子服务,利用不同的计算节点完成不同的任务,分布式系统不仅可以提高系统的可拓展性和稳定性,还可以让我们更好的处理数据,实现更高的运算效率和运算速度。
一、分布式系统的架构设计在分布式系统的架构设计中,我们要考虑到许多因素,例如系统的可靠性、可拓展性、安全性等等。
下面分别对这些因素进行论述:1. 可靠性在设计分布式系统时,我们需要预见到其中的风险,并采取措施来消除或降低这些风险。
例如,我们如何防止网络抖动,如何防止单个计算节点宕机等等。
通常,我们采用的方案是冗余和容错。
通过使用冗余计算节点,系统可以继续运行,即使有某些计算节点宕机了。
而容错能力则可以保证数据的正确性,例如通过使用额外的校验位,修复数据被损坏的问题。
2. 可拓展性当需求增加时,分布式系统应该可以轻松地增加节点,而不会导致系统的瘫痪或降低。
为此,我们需要采用可伸缩性架构来解决这个问题。
可伸缩性架构需要满足以下两个条件:其一,能够水平扩展,即在多个计算节点间分配负载,以避免单个节点过度负担所导致的性能下降;其二,能够垂直扩展,即提高单个节点的处理能力,以克服单个节点的限制。
3. 安全性在分布式系统中,各个计算节点之间的通信是很容易受到黑客攻击和嗅探的。
因此,系统安全性很重要。
我们需要考虑到如何为数据保密、如何保证数据真实性、如何防止拒绝服务攻击等等问题。
通常,我们采用加密和身份认证来保障系统安全。
通过使用加密技术,我们可以使得数据传输无法被黑客窃听,而身份认证则可以保证只有授权用户才有权限进行数据的读、写和修改。
二、分布式系统的实现在实现分布式系统时,我们通常会遇到许多问题,例如如何选择技术栈、如何设计数据模型等等。
下面分别对这些问题进行论述:1. 技术栈的选择在选择技术栈时,我们需要考虑到系统的适用场景、技术的稳定性和可拓展性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文作者Kate Matsudaira是一位美丽的女工程副总裁,曾在Sun Microsystems、微软、亚马逊这些一流的IT公司任职。
她有着非常丰富的工作经验和团队管理经验,当过程序员、项目经理、产品经理以及人事经理。
专注于构建和操作大型Web应用程序/网站,目前她的主要研究方向是SaaS(软件即服务)应用程序和云计算(如大家所说的大数据)。
本文是作者在一书介绍如何构建可扩展的分布式系统里的内容,在此翻译并分享给大家。
开源软件已经成为许多大型网站的基本组成部分,随着这些网站的逐步壮大,他们的网站架构和一些指导原则也开放在开发者们的面前,给予大家切实有用的指导和帮助。
这篇文章主要侧重于Web系统,并且也适用于其他分布式系统。
Web分布式系统设计的原则构建并运营一个可伸缩的Web站点或应用程序到底是指什么?在最初,仅是通过互联网连接用户和访问远程资源。
和大多数事情一样,当构建一个Web服务时,需要提前抽出时间进行规划。
了解大型网站创建背后的注意事项以及学会权衡,会给你带来更加明智的决策。
下面是设计大型Web系统时,需要注意的一些核心原则:•可用性•性能•可靠性•可扩展•易管理•成本上面的这些原则给设计分布式Web架构提供了一定的基础和理论指导。
然而,它们也可能彼此相左,例如实现这个目标的代价是牺牲成本。
一个简单的例子:选择地址容量,仅通过添加更多的服务器(可伸缩性),这个可能以易管理(你不得不操作额外的服务器)和成本作为代价(服务器价格)。
无论你想设计哪种类型的Web应用程序,这些原则都是非常重要的,甚至这些原则之间也会互相羁绊,做好它们之间的权衡也非常重要。
基础当涉及到系统架构问题时,这几件事情是必须要考虑清楚的:什么样的模块比较合适?如何把它们组合在一起?如何进行恰当地权衡?在扩大投资之前,它通常需要的并不是一个精明的商业命题,然而,一些深谋远虑的设计可以帮你在未来节省大量的时间和资源。
本文讨论的重点几乎是构建所有大型Web应用程序的核心:服务、冗余、分区和故障处理能力。
这里的每个因素都会涉及到选择和妥协,特别是前面所讨论的那些原则。
解释这些核心的最佳办法就是举例子。
图片托管应用程序有时,你会在线上传图片,而一些大型网站需要托管和传送大量的图片,这对于构建一个具有成本效益、高可用性并具有低延时(快速检索)的架构是一项挑战。
在一个图片系统中,用户可以上传图片到一个中央服务器里,通过网络连接或API对这些图片进行请求,就像Flickr或者Picasa。
简单点,我们就假设这个应用程序只包含两个核心部分:上传(写)图片和检索图片。
图片上传时最好能够做到高效,传输速度也是我们最关心的,当有人向图片发出请求时(例如是一个Web页面或其他应用程序)。
这是非常相似的功能,提供Web服务或内容分发网络(一个CDN服务器可以在许多地方存储内容,所以无论是在地理上还是物理上都更加接近用户,从而导致更快的性能)边缘服务器。
该系统需要考虑的其他重要方面:•图片存储的数量是没有限制的,所以存储应具备可伸缩,另外图片计算也需要考虑•下载/请求需要做到低延迟•用户上传一张图片,那么图片就应该始终在那里(图片数据的可靠性)•系统应该易于维护(易管理)•由于图片托管不会有太高的利润空间,所以系统需要具备成本效益图1是个简化的功能图图1 图片托管系统的简化结构图在这个例子中,系统必须具备快速、数据存储必须做到可靠和高度可扩展。
构建一个小型的应用程序就微不足道了,一台服务器即可实现托管。
如果这样,这篇文章就毫无兴趣和吸引力了。
假设我们要做的应用程序会逐渐成长成Flickr那么大。
服务当我们考虑构建可伸缩的系统时,它应有助于解耦功能,系统的每个部分都可以作为自己的服务并且拥有清晰的接口定义。
在实践中,这种系统设计被称作面向服务的体系结构(SOA)。
对于此类系统,每个服务都有它自己的独特功能,通过一个抽象接口可以与外面的任何内容进行互动,通常是面向公众的另一个服务API。
把系统分解成一组互补性的服务,在互相解耦这些操作块。
这种抽象有助于在服务、基本环境和消费者服务之间建立非常清晰的关系。
这种分解可以有效地隔离问题,每个块也可以互相伸缩。
这种面向服务的系统设计与面向对象设计非常相似。
在我们的例子中,所有上传和检索请求都在同一台服务器上处理。
然而,因为系统需要具备可伸缩性,所以把这两个功能打破并集成到自己的服务中是有意义的。
快进并假设服务正在大量使用;在这种情况下,很容易看到写图片的时间对读图片时间会产生多大影响(他们两个功能在彼此竞争共享资源)。
根据各自体系,这种影响会是巨大的。
即使上传和下载速度相同(这是不可能的,对于大多数的IP网络来说,下载速度:上传速度至少是3:1),通常,文件可以从缓存中读取,而写入,最终是写到磁盘中(也许在最终一致的情况下,可以被多写几次)。
即使是从缓存或者磁盘(类似SSD)中读取,数据写入都会比读慢(,一个开源DB基准的开源工具和)。
这种设计的另一个潜在问题是像Apache或者Lighttpd这些Web服务器通常都会有一个并发连接数上限(默认是500,但也可以更多),这可能会花费高流量,写可能会迅速消掉所有。
既然读可以异步或利用其他性能优化,比如gzip压缩或分块传输代码,Web服务可以快速切换读取和客户端来服务于更多的请求,超过每秒的最大连接数(Apache的最大连接数设置为500,这种情况并不常见,每秒可以服务几千个读取请求)。
另一方面,写通常倾向于保持一个开放的链接进行持续上传,所以,使用家庭网络上传一个1 MB的文件花费的时间可能会超过1秒,所以,这样的服务器只能同时满足500个写请求。
图2:读取分离规划这种瓶颈的一个非常好的做法是把读和写进行分离,如图2所示。
这样我们就可以对它们单独进行扩展(一直以来读都比写多)但也有助于弄明白每个点的意思。
这种分离更易于排除故障和解决规模方面问题,如慢读。
这种方法的优点就是我们能够彼此独立解决问题——在同种情况下,无需写入和检索操作。
这两种服务仍然利用全球语料库的图像,但是他们可以自由地优化性能和服务方法(例如排队请求或者缓存流行图片——下面会介绍更多)。
从维护和成本角度来看,每一个服务都可以根据需要独立进行扩展,但如果把它们进行合并或交织在一起,那么有可能无意中就会对另一个性能产生影响,如上面讨论的情景。
当然,如果你有两个不同的端点,上面的例子可能会运行的很好(事实上,这非常类似于几个云存储供应商之间的实现和内容分发网络)。
虽然有很多种方法可以解决这些瓶颈,但每个人都会有不同的权衡,所以采用适合你的方法才是最重要的。
例如,Flickr解决这个读/写问题是通过分发用户跨越不同的碎片,每个碎片只能处理一组用户,但是随着用户数的增加,更多的碎片也会相应的添加到群集里(请参阅)。
在第一个例子中,它更容易基于硬件的实际用量进行扩展(在整个系统中的读/写数量),而Flickr是基于其用户群进行扩展(but forces the assumption of equal usage across users so there can be extra capacity)。
而前面的那个例子,任何一个中断或者问题都会降低整个系统功能(例如任何人都没办法执行写操作),而Flickr的一个中断只会影响到其所在碎片的用户数。
在第一个例子中,它更容易通过整个数据集进行操作——例如,更新写服务,包括新的元数据或者通过所有的图片元数据进行搜索——而Flickr架构的每个碎片都需要被更新或搜索(或者需要创建一个搜索服务来收集元数据——事实上,他们就是这样做的)。
当谈到这些系统时,其实并没有非常正确的答案,但有助于我们回到文章开始处的原则上看问题。
确定系统需求(大量的读或写或者两个都进行、级别并发、跨数据查询、范围、种类等等),选择不同的基准、理解系统是如何出错的并且对以后的故障发生情况做些扎实的计划。
冗余为了可以正确处理错误,一个Web架构的服务和数据必须具备适当的冗余。
例如,如果只有一个副本文件存储在这台单独的服务器上,那么如果这台服务器出现问题或丢失,那么该文件也随即一起丢失。
丢失数据并不是什么好事情,避免数据丢失的常用方法就是多创建几个文件或副本或冗余。
同样也适用于服务器。
如果一个应用程序有个核心功能,应确保有多个副本或版本在同时运行,这样可以避免单节点失败。
在系统中创建冗余,当系统发生危机时,如果需要,可以消除单点故障并提供备份或备用功能。
例如,这里有两个相同的服务示例在生产环境中运行,如果其中一个发生故障或者降低,那么该系统容错转移至那个健康的副本上。
容错转移可以自动发生也可以手动干预。
服务冗余的另一重要组成部分是创建一个无共享架构。
在这种体系结构中,每个节点都能相互独立运行,并且没有所谓的中央“大脑”管理状态或协调活动其他节点。
这对系统的可扩展帮助很大,因为新节点在没有特殊要求或知识的前提下被添加。
然而,最重要的是,这些系统是没有单点故障的,所以失败的弹性就更大。
例如在我们的图片服务器应用程序中,所有的图片在另一个硬件上都有冗余副本(理想情况下是在不同的地理位置,避免在数据中心发生一些火灾、地震等自然事故),服务去访问图片将被冗余,所有潜在的服务请求。
(参见图3:采用负载均衡是实现这点的最好方法,在下面还会介绍更多方法)图3 图片托管应用程序冗余分区数据集有可能非常大,无法安装在一台服务器上。
也有可能这样,某操作需要太多的计算资源、性能降低并且有必要增加容量。
在这两种情况下,你有两种选择:纵向扩展或横向扩展。
纵向扩展意味着在单个服务器上添加更多的资源。
所以,对于一个非常大的数据集来说,这可能意味着添加更多(或更大)的硬件设备,来使一台服务器能容下整个数据集。
在计算操作下,这可能意味着移动计算到一个更大的服务器上,拥有更快的CPU或更大的内存。
在各种情况下,纵向扩展可以通过提升单个资源的处理能力来完成。
横向扩展在另一方面是添加更多的节点,在大数据集下,这可能会使用第二服务器来存储部分数据集,对于计算资源来说,这意味着分割操作或跨节点加载。
为了充分利用横向扩展,它应作为一种内在的系统架构设计原则,否则修改或拆分操作将会非常麻烦。
当谈到横向扩展时,最常见的做法是把服务进行分区或碎片。
分区可以被派发,这样每个逻辑组的功能就是独立的。
可以通过地理界限或其他标准,如非付费与付费用户来完成分区。
这些方案的优点是他们会随着容量的增加提供一个服务或数据存储。
在我们的图片服务器案例中,用来存储图片的单个文件服务器可能被多个文件服务器取代,每个里面都会包含一套自己独特的图像。
(见图4)这种架构将允许系统来填充每一个文件/图片服务器,当磁盘填满时会添加额外的服务器。