大型网站架构设计
“
大型網站的架構設計,涉及到的面非常多,并不像大家想象的那樣,就是一個網站這么簡單,今天拋磚引玉,希望能給想從事互聯網行業的同學一點初步的概念。
架構設計,其實就要清楚整個大型網站技術架構的演變歷程,知道每個階段的瓶頸在哪里,以及對應的解決方案。很多公司都是小做到大,特別是創業公司,如果一步步發展起來,網站架構演變都會經歷這些步驟,請重點注意順序。
大型網站架構演變過程
架構演變第一步:物理分離webserver和數據庫
架構演變第二步:增加頁面緩存
架構演變第三步:增加頁面片段緩存
架構演變第四步:數據緩存
架構演變第五步: 增加webserver(集群)
架構演變第六步:分庫(首先考慮)
架構演變第七步:分表、DAL和分布式緩存
架構演變第八步:增加更多的webserver
架構演變第九步:數據讀寫分離和廉價存儲方案
架構演變第十步:進入大型分布式應用時代和廉價服務器群夢想時代
由于篇幅的關系,今天不重點講如何一步步演變的歷程,我們倒序來查看,先看森林,再看樹木。
大型分布式應用架構組件
分布式緩存
高并發環境下,大量的讀寫請求涌向數據庫,磁盤的處理速度與內存顯然不在一個量級,從減輕數據庫的壓力和提高系統響應速度兩個角度來考慮,一般都會在數據庫之前加一層緩存。由于單臺機器的內存資源以及承載能力有限,并且,如果大量使用本地緩存,也會使相同的數據被不同的節點存儲多份,對內存資源造成較大的浪費,因此,才催生出了分布式緩存。
分布式緩存系統
memcached ,redis,動態、靜態數據的緩存,這里會涉及到:一致性hash算法、分布式session、數據復制多份、單臺緩存失效、集群間能夠自動復制和備份等知識點。
CDN
全稱:Content Delivery Network或Content Ddistribute Network,即內容分發網絡基本。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。
現在大型互聯網公司都建立由屬于自己的CDN基站,也有第三方專注于CDN的基站等。
持久化儲存
具體說就是以IBM為代表的主機、以ORACLE為代表的關系型數據庫,以及以EMC為代表的高端存儲設備,被新型的云計算技術所替換,也就是我們常說的“云化”,也就是廉價存儲方案。
IBM的產品,在我國的金融行業中占據著絕對的優勢,Oracle的數據庫,在電信、證券行業占著相當大的份額,EMC的存儲,在銀行、電信、證券等壟斷行業,都占據著較大的份額,要知道,EMC是全球最大的存儲公司。
由于互聯網技術發展日新月異,擴展速度十分迅速,這是傳統的電信、金融、證券、保險、電力等行業所不能比的。因此互聯網企業的后臺架構,需要具備很強的可擴展性。比如,假設一個網站,今年的活躍用戶數量只有10萬,明天就有可能上升到1000多萬,這就需要后臺架構具有很強的擴展性,可以根據用戶的數量進行靈活的擴展。
所以才有了阿里從2008年開始的轟轟烈烈的去IOE事件。
數據庫拆分
一般先分庫,如果分庫后查詢仍然慢,于是按照分庫的思想開始做分表的工作數據庫采用分布式數據庫(所有節點的數據加起來才算是整體數據),文件系統采用分布式文件系統任何強大的單一服務器都滿足不了大型系統持續增長的業務需求,數據庫讀寫分離隨著業務的發展最終也將無法滿足需求,需要使用分布式數據庫及分布式文件系統來支撐。
分布式數據庫是系統數據庫拆分的最后方法,只有在單表數據規模非常龐大的時候才使用,更常用的數據庫拆分手段是業務分庫,將不同的業務數據庫部署在不同的物理服務器上。
比如淘寶中期開始的數據庫端按照業務垂直拆分:按照業務交易數據庫、用戶數據庫、商品數據庫、店鋪數據庫等進行拆分。
還有就是水平擴展,分庫分表,再結合讀寫分離一起。當然,分庫分表需要涉及到對應的SQL路由規則主庫備庫等,淘寶設計了一套TDDL來解決這些問題,應用端只需配置對應的規則即可,對應用端的沒有任何侵入的設計。
消息系統
消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合,異步消息,流量削鋒等問題。實現高性能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。
目前使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
消息系統使用場景
典型的異步處理,應用解耦,流量削鋒和消息通訊四個場景。
除了以上還要設計運維(掌握分布式并行計算、報表、監控技術以及規則策略),安全、運營、服務、存儲、業務拆分、機房容災等等,要做好一個大型的網站真的很不容易。
你可能也喜歡:
總結
- 上一篇: 领域应用 | 金融资管领域知识图谱的构建
- 下一篇: 领域应用 | 到底什么时候使用图数据库?