本文內容主要來自於浩東2011年6月的ppt。css
目錄:html
一、大型網站架構的目標與挑戰前端
二、網站架構演變及其技術脈絡java
三、架構設計理論與原則mysql
何爲「大型」網站?web
沒有統一的判斷標準,流量大小是一個重要指標(日均流量至少IP>1,000,000纔算大型網站)redis
1、大型網站架構的目標與挑戰算法
每一個目標背後面臨着技術、設計、維護等諸多方面的挑戰; 而目標自己的指望值也會根據實際狀況進行調整,這也意味着網站架構建設是個不斷調整的過程。sql
2、網站架構演變及其技術脈絡數據庫
一、Web動靜態資源分離及其與DB物理分離
Web Server(Apache\Nginx\IIS\JBoss…)、
Database Server(Mysql\Oracle\Redis…)
注意:通常地,本文提到的物理服務器都是泛指pc級物理服務器;Web Server泛指HTTP服務器和應用服務器綜合體對於一個試水性網站來講爲了節約成本,Web Server和DB Server都放在同一臺pc Server服務器上是常見的事情。當網站訪問量增大,cpu處理能力是瓶頸的時候,經過把web Server和Db Server簡單物理分開的,效果明顯!
web動靜態資源分離:
-->img,doc,js,css等靜態資源使用單獨的Web HTTP Server處理請求
-->動態頁面靜態化處理
二、採起緩存處理
訪問量持續增大,頁面響應愈來愈慢。考慮到網站還處在試水性成長階段,節約成本,硬件不動,着重應用自己優化。採起緩存處理機制是個必然的選擇。
訪客向網站發出訪問請求,由前端頁面緩存器負擔原服務器的處理進程作出響應,獲取原服務器的相應網頁內容,將其儲存在自身的內存中,與 此同時,傳送給訪客這一緩存的內容;若有另外一訪客也請求訪問以前的相同內容,前端頁面緩存器毋須再次獲取原服務器上的相應內容,而直接從自身的內存中獲取,將這一內容傳送給訪客。反之,前端頁面緩存器也可緩存訪客的GET和POST請求。 訪客實際面對的是前端頁面緩存器,與網站之間的通信徹底由前端頁面緩存器反向代理,而非原服務器直接響應訪客,這將大大加快訪客上網流暢度,有效提高訪問量,顯著下降帶寬佔用,減輕原始服務器的繁忙度,加快響應速度,毋須不停地購置大內存,大硬盤,擴容電力設施爲服務器端節省成本。
注意:採用具有緩存功能的http反向代理服務器做前端頁面緩存器,Varnish\Squid\Ncache\AiCache(商業)…【硬件F5】
ESI是一個基於XML的標記語言,目的是在HTTP中組裝各類資源。在實際環境中,一個動態生成的頁面,當中可能只有少許的內容是頻繁變化的或是個性化的,對於傳統的Cache服務器來講,爲了可以保證頁面的時效性,卻因爲頁面中這些少許的動態內容而沒法將整個頁面進行緩存。ESI經過使用簡單的標記語言來對那些能夠緩存和不能緩存的網頁中的內容片段進行描述,每一個網頁都被劃分紅不一樣的小部分分別賦予不一樣的緩存控制策略,使Cache服務器能夠根據這些策略在將完整的網頁發送給用戶以前將不一樣的小部分動態地組合在一塊兒。經過這種控制,能夠有效地減小從服務器抓取整個頁面的次數,而只用從原服務器中提取少許的不能緩存的片段,所以能夠有效下降原服務器的負載,同時提升用戶訪問的響應時間。
ESI須要服務器端支持,常見apache(mod_esi)、WebLogic、JSP標籤庫(JESI)等。
(4)本地數據緩存
(4.1)關係數據庫系統(如:Oracle\MySql)Query Cache策略:通常以sql爲key來緩存查詢結果,儘可能不要拼sql,使用PreparedStatement的「?」模式sql;Query Cache大小要根據數據庫系統具體狀況合理設置,過大隻會浪費內存,參考值:128M
(4.2)關係數據庫系統Data Buffer策略:就是數據庫數據內存緩存器,其訪問命中率決定數據庫性能,可根據實際物理內存大小適量增大,如:MySql建議buffer值爲物理內存60-80%
(4.3)應用服務器Cache包括:對象緩存(例如:對象線程安全,作成單例),更新頻率不大數據考慮緩存(如:基表數據、配置文件信息),考慮使用線程池,對象池,鏈接池等
(4.4)常見java解決方案:map\OSCache\EHCache等
注意:一、須要從數據庫系統和Web應用服務器兩個層面考慮緩存優化
二、常見緩存算法:(貝萊蒂算法、最近最少使用算法、最近最頻繁使用算法、僞LRU算法)
三、增長機器作HA、數據庫讀寫分離
LVS(LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序)
各個關係數據庫廠商針對dal及replication都有本身方案
獨立的DAL Proxy服務器(MySQL: mysqlproxy,Amoeba;PostgreSQL: PL/Proxy )
DAL API(Java: Hibernate Shard,Ibatis Shard,HiveDB,Guzz;Python: Pyshards)
四、CDN、分佈式緩存、分庫
網站業務發展迅速,數據量大幅增大是當前最大的挑戰,用戶分散各地區,某些地方用戶訪問響應很慢,影響體驗和業務發展;同時,因爲數據量過大,數據緩存在本地內存已經不現實,分佈式緩存是必然選擇了
CDN的全稱是Content Delivery Network,即內容分發網絡。其目的是經過在現有的Internet中增長一層新的網絡架構,將網站的內容發佈到最接近用戶的網絡"邊緣",使用戶能夠就近取得所需的內容,解決 Internet網絡擁擠的情況,提升用戶訪問網站的響應速度。從技術上全面解決因爲網絡帶寬小、用戶訪問量大、網點分佈不均等緣由所形成的用戶訪問網站響應速度慢的問題。 (也就是一個服務器的內容,平均分部到多個服務器上,服務器智能識別,讓用戶獲取離用戶最近的服務器,提升速度。
(2)分佈式緩存
垂直分庫後,各模塊數據之間如何關聯查詢?垂直分庫前提是良好的鬆耦合的模塊化設計
水平分區中,Shard是分佈式解決方案,與數據庫集中式的表空間分區是兩個不一樣方案(分片Key識別(劃分檢索依據)是關鍵)
五、多個數據中心,向分佈式存儲和計算的架構體系邁進
DFS提供了一個全局命名空間的高可用(經過跨機器(和跨機架)的文件數據複製來達到高可用性,免受傳統文件存儲系統沒法避免的許多失敗的影響)文件系統,解決高容量數據高效、可靠存儲問題;Map/Reduce的計算框架,它與DFS緊密協做,幫助處理收集到的海量數據;Key-Value DB代替傳統的數據庫,經過一些主鍵來組織海量數據,並實現高效的查詢。
Google(GFS|Map/Reduce|BigTable)
Apache Hadoop(HDFS|Map/Reduce|HBase)
3、架構設計理論與原則
一、關於數據一致性—ACID vs BASE