原文链接:http://www.aosabook.org/en/distsys.html

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

本章主要集中在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

可扩展的Web架构和分布式系统的更多相关文章

  1. 可扩展的 Web 架构与分布式系统

    作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...

  2. 可扩展Web架构与分布式系统

    原文:可扩展Web架构与分布式系统 开放源代码已经成为一些大型网站的基本原则.而在这些网站成长的过程中,一些优秀的实践经验和规则也出现在他们的结构中.本文旨在介绍一些在大型网站结构设计的过程中需要注意 ...

  3. 可扩展Web架构与分布式系统(转)

    1.1. web分布式系统的设计原则 搭建和运营一个可伸缩的web站点或者应用程序意味着什么?在原始层面上这仅仅是用户通过互联网连接到远程资源-使系统变得可伸缩的部分是将资源.或者访问的资源,分布于多 ...

  4. 可伸缩Web架构与分布式系统(1)

    开源软件近年来已变为构建一些大型网站的基础组件.并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露.这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件 ...

  5. 可伸缩Web架构与分布式系统(2)

    开源软件近年来已变为构建一些大型网站的基础组件.并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露.这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件 ...

  6. 可扩展的Web系统和分布式系统(Scalable Web Architecture and Distributed Systems)

    Open source software has become a fundamental building block for some of the biggest websites. And a ...

  7. 架构与思维:互联网高性能Web架构

    1 什么是高性能Web架构 在互联网业务中,我们经常会面临流量巨大的复杂的分布式场景.这就要求我们在设计系统的时候保证系统具有承载高并发(High Concurrency)的能力,同时能够保证系统的高 ...

  8. web架构延变

    在现代的软件系统中,几乎所有的系统都使用到了数据库,不论是关系型数据,例如MySql.SQLite.Oracle.SQLServer等,还是非关系性数据,例如mongoDB.redis等.本文已web ...

  9. 使用Docker、CoreOS、Mesos部署可扩展的Web应用

    [编者的话]本文作者重点介绍了如何使用Docker.CoreOS.Mesos.Vulcand.对象存储来部署一个可扩展的Web应用,他首先介绍了为什么要选择这些工具以及与其它工具相比这些工具的优势.紧 ...

随机推荐

  1. webpack dev-server 允许移动端调试

    "dev": "cross-env NODE_ENV=development webpack-dev-server --host 0.0.0.0 --open --hot ...

  2. 【转】HashMap集合中key只能为引用数据类型,不能为基本类型

    在HashMap中,为什么不能使用基本数据类型作为key? 其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序.无索引.不能存储重复元素. 存储元素采用的是hash表存储数据 ...

  3. 逆元知识普及(进阶篇) ——from Judge

    关于一些逆元知识的拓展 刚艹完一道 提高- 的黄题(曹冲养猪) ,于是又来混一波讲解了 ——承接上文扫盲篇   四.Lucas定理(求大组合数取模)   题外话 这里Lucas定理的证明需要用到很多关 ...

  4. 【原创】大数据基础之Ambari(3)通过Ambari部署Airflow

    ambari2.7.3(hdp3.1) 安装 airflow1.10 ambari的hdp中原生不支持airflow安装,下面介绍如何通过mpack方式使ambari支持airflow安装: 1 下载 ...

  5. 【原创】数据库基础之Mysql(2)主从库配置

    一 安装 # wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm# yum -y insta ...

  6. 【转载】IIS出现“HTTP 错误 500.0,C:\php\php-cgi.exe - FastCGI 进程意外退出”解决方法

    昨天给大家介绍了在windows+iis的平台上搭建支持php+mysql平台的文章,教程步骤都是笔者一步一个操作然后一个记录介绍给大家的,实机演练,教程绝对切实可用,但是不同的同学在不同的环境下按照 ...

  7. Caffe+Matlab'hole

    有时候,多坚持一小下下就成功了,遇到问题就频繁重装系统并不可取!放弃很容易,但坚持真的很酷! 1.安装依赖库也能出问题 命令行输入: sudo apt-get install libprotobuf- ...

  8. C++中几个输入函数的用法和区别(cin、cin.get()、cin.getline()、getline()、gets()、getchar())

    1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream>using namespace std;main (){int a,b; ...

  9. MySQL视图,函数,触发器,存储过程

    1. 视图 视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来, ...

  10. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...