可扩展的Web架构和分布式系统

原文连接:http://www.aosabook.org/en/distsys.htmlhtml

开源软件已经成为一些大型网站的基石。随着这些网站的发展,围绕其架构的最佳实践和指导原则应运而生。本章旨在讨论设计大型网站时须要考虑的一些关键问题,以及用于实现这些目标的一些构建模块。算法

本章主要集中在Web系统上,尽管有些材料也适用于其余分布式系统。数据库

1.1 分布式网站设计原则

构建和操做可伸缩的Web站点或应用程序究竟意味着什么?在原始层,它只是经过Internet链接用户与远程资源,可伸缩性的部分是指资源或访问这些资源的方式分布在多个服务器上。缓存

与生活中的大多数事情同样,从长远来看在构建Web服务时花时间预先计划能够有所帮助;理解大型网站背后的一些考虑和权衡能够在建立较小的Web站点时作出更明智的决定。下面是一些影响大型Web系统设计的关键原则:服务器

  • 可用性:网站的正常运行时间对许多公司的声誉和功能相当重要。对于一些较大的在线零售网站来讲,即便几分钟不可用,也可能致使数千美圆或数百万美圆的收入损失,所以,设计他们的系统持续可用和失效快速恢复,是一项基本的业务和技术要求。分布式系统中的高可用性要求仔细考虑关键部件的冗余,部分系统故障时的快速恢复,以及问题发生时的优雅降级。
  • 性能:网站的性能已成为大多数网站的重要考虑因素。网站的速度影响用户的使用和用户满意度,以及搜索引擎排名,这是与收入和保持直接相关的一个因素。所以,建立一个对快速响应和低延迟进行优化的系统是关键。
  • 可靠性:系统须要是可靠的,对数据的请求将始终返回相同的的数据。若是数据更改或更新,则同一请求应返回新数据。用户须要知道,若是某个东西被写入系统,或者被存储,它将继续存在,而且能够被信赖,以备未来检索
  • 可伸缩性当涉及到任何大型分布式系统时,规模只是可扩展要考虑的一个方面。一样重要的是增长处理大量负载所需的工做量,一般称为系统的可伸缩性。可伸缩性能够指系统的许多不一样参数:它能处理多少额外的流量,增长存储容量有多容易,甚至能处理多少事务。
  • 管理性:设计一个易于操做的系统是另外一个重要的考虑因素。系统的可管理性等同于操做的可伸缩性:维护和更新。可管理性要考虑的问题是,简单诊断和理解发生的问题,容易修改和更新,系统操做简单(即,是否常常无端障或异常运行)
  • 成本:成本是一个重要因素。这显然包含硬件和软件成本。可是考虑部署和维护须要的其余方面也是很重要的。系统开发所需的开发人员时间,运行系统所需的操做工做量,甚至所需的培训也都要考虑在内。成本是全部开销的总和。

这些设计原则为分布式Web系统架构提供了决策基础。可是,他们也可能相互矛盾,实现一个目标就要牺牲另外一个。例如:经过简单的添加更多服务器(可伸缩性)来解决容量问题,代价是可管理性(你必须操做额外的服务器)和成本(服务器价格)网络

在设计任何类型的Web应用程序时,考虑这些原则很重要,即便知道一个设计可能牺牲其中一个或者多个。架构

1.2 基础知识

大型网站设计须要考虑的核心问题:服务,冗余,分区和失败处理负载均衡

实例:图片托管应用异步

  用户能够上传本身的图像到服务器,经过网络连接或者API请求图像,像Filckr 和Picasa分布式

服务

  1)图像的读写由一个server完成

  2)将读图像和写图像分红不一样的服务:服务异常,将致使全部服务不可用

       3)不一样的用户分布在不一样的碎片上,一个碎片只影响部分用户

冗余:

  服务:设计成无共享架构,避免单点故障

分区:

  纵向扩容 : 增长单个服务器资源

  横向扩容:增长更多的节点,服务分解成分区的或者碎片 风险:不一致性,数据局部性,网络访问资源时间延长

1.3 快速可扩展数据组成部分

 数据存取:

缓存:

  本地缓存

    全局缓存

 分布式缓存

代理:

  将多个请求(数据相同,数据相近)合成一个请求。 LAN代理

索引:读取快,更新慢:不止更新数据,还要更新索引

  多级索引,数据库经常使用技术

  嵌套索引

负载均衡:

  随机选取,轮换,特定算法(依据内存,CPU)

  开源软件:HAProxy

队列:

  异步

  请求队列

  开源:RabbitMQ,ActiveMQ,BeanstalkMQ,Redis,Zookeeper

相关文章
相关标签/搜索