原文連接: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