原文连接:http://www.aosabook.org/en/distsys.htmlhtml
开源软件已经成为一些大型网站的基石。随着这些网站的发展,围绕其架构的最佳实践和指导原则应运而生。本章旨在讨论设计大型网站时须要考虑的一些关键问题,以及用于实现这些目标的一些构建模块。算法
本章主要集中在Web系统上,尽管有些材料也适用于其余分布式系统。数据库
构建和操做可伸缩的Web站点或应用程序究竟意味着什么?在原始层,它只是经过Internet链接用户与远程资源,可伸缩性的部分是指资源或访问这些资源的方式分布在多个服务器上。缓存
与生活中的大多数事情同样,从长远来看在构建Web服务时花时间预先计划能够有所帮助;理解大型网站背后的一些考虑和权衡能够在建立较小的Web站点时作出更明智的决定。下面是一些影响大型Web系统设计的关键原则:服务器
这些设计原则为分布式Web系统架构提供了决策基础。可是,他们也可能相互矛盾,实现一个目标就要牺牲另外一个。例如:经过简单的添加更多服务器(可伸缩性)来解决容量问题,代价是可管理性(你必须操做额外的服务器)和成本(服务器价格)网络
在设计任何类型的Web应用程序时,考虑这些原则很重要,即便知道一个设计可能牺牲其中一个或者多个。架构
大型网站设计须要考虑的核心问题:服务,冗余,分区和失败处理负载均衡
实例:图片托管应用异步
用户能够上传本身的图像到服务器,经过网络连接或者API请求图像,像Filckr 和Picasa分布式
服务:
1)图像的读写由一个server完成
2)将读图像和写图像分红不一样的服务:服务异常,将致使全部服务不可用
3)不一样的用户分布在不一样的碎片上,一个碎片只影响部分用户
冗余:
服务:设计成无共享架构,避免单点故障
分区:
纵向扩容 : 增长单个服务器资源
横向扩容:增长更多的节点,服务分解成分区的或者碎片 风险:不一致性,数据局部性,网络访问资源时间延长
数据存取:
缓存:
本地缓存
全局缓存
分布式缓存
代理:
将多个请求(数据相同,数据相近)合成一个请求。 LAN代理
索引:读取快,更新慢:不止更新数据,还要更新索引
多级索引,数据库经常使用技术
嵌套索引
负载均衡:
随机选取,轮换,特定算法(依据内存,CPU)
开源软件:HAProxy
队列:
异步
请求队列
开源:RabbitMQ,ActiveMQ,BeanstalkMQ,Redis,Zookeeper