http://blog.csdn.net/yyyiran/article/details/17174331
2013.12
一直都對(duì)海量服務(wù)后臺(tái)架構(gòu)很感興趣,最近看完了《大型網(wǎng)站技術(shù)架構(gòu) & 核心原理與案例分析(李智慧 著)》一書(shū),涵蓋了大型網(wǎng)站架構(gòu)的很多技術(shù)細(xì)節(jié),寫(xiě)得極其贊!這里結(jié)合自己的一些見(jiàn)解,整理一個(gè)筆記出來(lái)。
// =======================================================================================
單服務(wù)器LAMP
* 大學(xué)時(shí)期常搞的LAMP,Linux+Apache+MySQL+php,接入、應(yīng)用程序、數(shù)據(jù)庫(kù)、文件都在一臺(tái)服務(wù)器。流量小,一臺(tái)機(jī)器綽綽有余
* 增長(zhǎng)瓶頸:機(jī)器功能耦合
PS:架構(gòu)設(shè)計(jì)一個(gè)核心原則就是高內(nèi)聚低耦合,將網(wǎng)站的接入、邏輯、存儲(chǔ)分開(kāi)到專(zhuān)門(mén)的服務(wù)器是首先考慮的
應(yīng)用邏輯和存儲(chǔ)分離
* 3臺(tái)服務(wù)器各司其職:應(yīng)用服務(wù)器(CPU),文件服務(wù)器(磁盤(pán)容量),數(shù)據(jù)庫(kù)服務(wù)器(磁盤(pán)IO)
* 增長(zhǎng)瓶頸:數(shù)據(jù)庫(kù)訪問(wèn)壓力大
PS:數(shù)據(jù)庫(kù)最終會(huì)讀寫(xiě)磁盤(pán)文件,受到磁盤(pán)IO限制會(huì)首先成為瓶頸
引入緩存減少數(shù)據(jù)庫(kù)讀寫(xiě)
* 緩存是后臺(tái)開(kāi)發(fā)一種重要的方法,其背后遵循的是“局部性原理”,也稱“28定律”:即日常80%的訪問(wèn)會(huì)集中在20%的數(shù)據(jù)上。將這小部分“熱點(diǎn)”數(shù)據(jù)緩存在內(nèi)存中,就可以大大降低數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)
* 緩存分為2種,本地緩存和分布式緩存
1 本地緩存:數(shù)據(jù)緩存在應(yīng)用服務(wù)器上。優(yōu)點(diǎn)是本地內(nèi)存讀寫(xiě)操作(納秒級(jí)),速度最快;缺點(diǎn)是內(nèi)存大小受限,擴(kuò)展性較差
2 分布式緩存:數(shù)據(jù)緩存在專(zhuān)用的緩存服務(wù)器上。優(yōu)點(diǎn)是應(yīng)用和存儲(chǔ)低耦合,專(zhuān)門(mén)服務(wù)器維護(hù),易擴(kuò)展;缺點(diǎn)是讀寫(xiě)需網(wǎng)絡(luò)開(kāi)銷(xiāo)(毫秒級(jí))
* 緩存數(shù)據(jù)更新:應(yīng)用程序首先讀緩存,讀不到數(shù)據(jù)時(shí)再訪問(wèn)數(shù)據(jù)庫(kù),并將讀到的數(shù)據(jù)寫(xiě)入緩存。如果這時(shí)緩存是滿的,就必須淘汰一些已有數(shù)據(jù),常用的淘汰算法是LRU,即最近最少使用
* 增長(zhǎng)瓶頸:應(yīng)用服務(wù)器并發(fā)處理能力
使用應(yīng)用服務(wù)器集群提高網(wǎng)站并發(fā)處理能力
* “網(wǎng)站撐不住了,就拿機(jī)器頂!”,集群是海量服務(wù)中解決高并發(fā)的常用手段
* 負(fù)載均衡:多臺(tái)應(yīng)用服務(wù)器,如何將前端請(qǐng)求均勻分發(fā)到各臺(tái)機(jī)器上,這就需要前端加一個(gè)負(fù)載均衡服務(wù)器做請(qǐng)求分發(fā)。nginx簡(jiǎn)單靈活的負(fù)載均衡策略被廣泛使用,常見(jiàn)的負(fù)載均衡算法有輪詢、隨機(jī)、加權(quán)、來(lái)源地址hash等
增長(zhǎng)瓶頸:數(shù)據(jù)庫(kù)負(fù)載過(guò)高
PS:當(dāng)網(wǎng)站訪問(wèn)量繼續(xù)上升,雖然加了緩存,但是緩存不命中及應(yīng)用寫(xiě)操作(當(dāng)然也有只寫(xiě)緩存的策略)還是需要訪問(wèn)數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)讀寫(xiě)分離
* 數(shù)據(jù)庫(kù)服務(wù)器主從分離:一臺(tái)主數(shù)據(jù)庫(kù)服務(wù)器(Master)負(fù)責(zé)寫(xiě)操作,多臺(tái)從數(shù)據(jù)庫(kù)服務(wù)器(Slave)負(fù)責(zé)讀操作,主服務(wù)器被寫(xiě)之后會(huì)同步數(shù)據(jù)變更到從服務(wù)器
* 數(shù)據(jù)庫(kù)訪問(wèn)模塊封裝:將應(yīng)用程序?qū)?shù)據(jù)庫(kù)的操作封裝成模塊,使得后端數(shù)據(jù)庫(kù)讀寫(xiě)分離等變更對(duì)應(yīng)用程序透明(高內(nèi)聚低耦合)
到目前為止,網(wǎng)站總體架構(gòu)如下圖所示,已經(jīng)能支撐起大部分網(wǎng)站的訪問(wèn)需求了。當(dāng)然,不單單是網(wǎng)站,這些架構(gòu)關(guān)鍵點(diǎn)對(duì)任何海量服務(wù)的后臺(tái)開(kāi)發(fā)都是相通的
當(dāng)網(wǎng)站訪問(wèn)繼續(xù)增加,有日均PV過(guò)億的趨勢(shì),這時(shí)網(wǎng)站其實(shí)還有很多關(guān)鍵點(diǎn)可以繼續(xù)優(yōu)化:
使用反向代理和CDN做網(wǎng)站文件緩存
* 將網(wǎng)站一些靜態(tài)文件,如圖片、html頁(yè)面等緩存在反向代理服務(wù)器或者CDN服務(wù)器,用戶的請(qǐng)求可以不用到達(dá)應(yīng)用服務(wù)器就返回?cái)?shù)據(jù)給用戶。是網(wǎng)站加速、提高用戶體驗(yàn)的2種常用手段
1 反向代理:部署在網(wǎng)站中心機(jī)房
2 CDN,即內(nèi)容發(fā)布系統(tǒng):部署在網(wǎng)絡(luò)提供商各地的機(jī)房,常用于視頻和圖片文件的緩存
使用分布式文件系統(tǒng)
* 當(dāng)一臺(tái)文件服務(wù)器滿足不了網(wǎng)站文件存儲(chǔ)需求時(shí),接下來(lái)應(yīng)考慮的就是使用分布式文件系統(tǒng)。HDFS、HBase等是當(dāng)前海量文件存儲(chǔ)比較熱門(mén)的方案
使用分布式數(shù)據(jù)庫(kù)和NoSQL
* 關(guān)系型數(shù)據(jù)庫(kù)的分布式是大型網(wǎng)站業(yè)務(wù)持續(xù)增長(zhǎng)的最后手段,可通過(guò)不同業(yè)務(wù)模塊分庫(kù),相同業(yè)務(wù)模塊分表等方法實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分布式部署
* NoSQL相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)有更簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),更高的性能及更好的可擴(kuò)展性。但對(duì)業(yè)務(wù)需求的支持也相對(duì)有限。
應(yīng)用邏輯的業(yè)務(wù)模塊拆分
* 一個(gè)網(wǎng)站必定有多種業(yè)務(wù)模塊,比如購(gòu)物網(wǎng)站都有用戶模塊、商品模塊、訂單模塊等等,將這些業(yè)務(wù)模塊拆分并獨(dú)立維護(hù)。保證各業(yè)務(wù)模塊高內(nèi)聚低耦合,利于開(kāi)發(fā)上團(tuán)隊(duì)分工,也利于后期獨(dú)立部署運(yùn)營(yíng)
// =======================================================================================
大型網(wǎng)站架構(gòu)設(shè)計(jì)的一些價(jià)值觀:
* 大道至簡(jiǎn)。簡(jiǎn)單的設(shè)計(jì)使開(kāi)發(fā)和維護(hù)變得清晰有序
* 業(yè)務(wù)和功能的劃分和模塊化。各業(yè)務(wù)模塊,各功能模塊(接入-邏輯-存儲(chǔ))劃分清晰,高內(nèi)聚低耦合,塵歸塵土歸土
* 架構(gòu)來(lái)源于需求,而不是技術(shù)。架構(gòu)設(shè)計(jì)衡量標(biāo)準(zhǔn)是滿足用戶的產(chǎn)品需求,而不是為了技術(shù)而技術(shù)
* 架構(gòu)是演化而來(lái)的。別追求有完美的架構(gòu)設(shè)計(jì)后再上線,好的架構(gòu)往往都是不斷修改甚至推翻之后慢慢演化而來(lái)的
* 不要所有問(wèn)題都用技術(shù)來(lái)解決。有些技術(shù)上難以解決的問(wèn)題,往往可以用業(yè)務(wù)手段來(lái)解決,如12306的整點(diǎn)售票改為分時(shí)段售票,從業(yè)務(wù)上來(lái)平攤用戶請(qǐng)求量
* 衡量指標(biāo):性能、可用性、伸縮性、擴(kuò)展性、安全性。
聯(lián)系客服