一、大型網站架構演化 1、大型網站特點 高併發,大流量 高可用 海量數據 用戶分佈廣泛,網路情況複雜 安全環境惡劣 需求快速變更,發佈頻繁 漸進式發展 2、大型網站架構發展歷程 文件伺服器,資料庫伺服器,應用伺服器分離 應用伺服器增加本地緩存,本地緩存優先,增加分散式緩存伺服器 使用應用程式伺服器集 ...
一、大型網站架構演化
1、大型網站特點
- 高併發,大流量
- 高可用
- 海量數據
- 用戶分佈廣泛,網路情況複雜
- 安全環境惡劣
- 需求快速變更,發佈頻繁
- 漸進式發展
2、大型網站架構發展歷程
- 文件伺服器,資料庫伺服器,應用伺服器分離
- 應用伺服器增加本地緩存,本地緩存優先,增加分散式緩存伺服器
- 使用應用程式伺服器集群提高網站的併發,由負載均衡伺服器統一調度分發
- 使用分散式文件系統和分散式資料庫系統
- 使用CDN網路加速和反向代理伺服器:基本原理都是緩存,CDN部署在網路提供商的機房,是用戶在請求網路服務時,可以從距離自己最近的網路提供商機房獲取數據。而反向代理是部署在中心機房,當用戶的請求到達中心機房後,首先訪問的是反向代理伺服器,如果反向代理伺服器中緩存這用戶請求的資源,就將其直接返回給用戶,目的都是儘早返回數據給用戶,加快用戶訪問速度,減輕後端伺服器的壓力。
- 使用Nosql和搜索伺服器
- 業務拆分,根據不同的產品,不同的業務,將一個網站拆分成不同的應用,每個應用獨立部署維護,各個應用之間通過消息中間件或者訪問同一個數據存儲系統來構成一個相互關聯的完整系統
- 分散式服務,將公用的業務提取出來,獨立部署,為其他應用伺服器提供可復用的共用業務服務(可以通過dubbo和zookeeper集群實現)
3、網站架構的價值觀和設計誤區
- 架構的選取隨網站所需靈活應對
- 主要驅動力量是網站的業務發展
- 不可一味追隨大公司的架構設計,照搬照抄
- 網站技術是為了業務存在的,不可為了技術而技術
- 不要企圖使用技術解決一切問題。技術是用來解決業務問題的,同樣業務問題也可以採用業務手段,通過修改業務架構來解決
二、大型網站架構模式
1、分層
將系統在橫向緯度上分成幾個部分,每個部分負責單一職責,通過上層對下層的依賴和調用組成一個完整的系統。網路的7層通訊協議,電腦硬體、操作系統、應用軟體,都採用了分層的思想。將網站系統分為應用層、服務層、數據層,三層結構分別部署在不同的伺服器上
- 應用層:負責具體業務和視圖展示
- 服務層:為應用層提供服務支持,如用戶管理服務、購物車服務
- 數據層:提供數據存儲訪問服務,如資料庫、緩存、文件、搜索引擎等
2、分割
在縱向方面對系統進行劃分,比如應用層,可以將不同業務分割,將購物、論壇、搜索、廣告分割成不同的應用,由獨立的團隊負責。部署在不同的伺服器上。
3、分散式
分層和分割的目的就是為了切分後的模塊便於分散式部署,將不同的模塊部署在不同的伺服器上。同時,分散式也帶來了很多問題,
- 不同伺服器之間的通信對網路依賴很大
- 保持數據一致性比較困難
- 網站依賴錯綜複雜,開發維護困難
常見的分散式方案有以下幾種
- 分散式應用和服務。
- 分散式靜態資源
- 分散式數據和存儲
- 分散式計算
- 分散式文件系統
- 分散式鎖
- 分散式配置。支持網站線上服務配置實時更新
4、集群
雖然分散式已經將各個應用分開部署,但是對於用戶集中訪問的模塊,還需要獨立部署伺服器集群化,即多台伺服器部署相同應用構成一個集群,通過負載均衡設備共同對外提供服務。並且支持線性擴展,發生故障時的失效轉移。即使是訪問量很小的分散式應用和服務也至少要部署兩台構成小的集群,提高系統的可用性
5、緩存
緩存是改善軟體性能的第一手段。大型網站很多方面都使用了緩存設計:
- CDN,即內容分髮網絡。在這裡緩存網站的一下靜態資源(較少變化的數據),可以就近以最快速度返回給用戶。如視頻網站和門戶網站會將用戶訪問量大的熱點內容緩存在CDN
- 反向代理。當用戶的請求到達數據中心時,最先訪問到的是反向代理伺服器,這裡緩存網站的靜態資源,無需繼續將請求轉發給應用伺服器,直接返回給用戶
- 本地緩存。在應用伺服器本地緩存這熱點數據,應用程式可以在本地記憶體中直接訪問,無需訪問數據層
- 分散式緩存。將數據存儲在專門的分散式緩存集群中,應用伺服器通過網路通訊訪問緩存數據。
緩存同時也存在著緩存擊穿、緩存雪崩、緩存熱點不集中的問題
6、非同步
在單一伺服器內部可通過多線程共用記憶體隊列的方式實現非同步,在分散式系統中,多個伺服器集群通過分散式消息隊列實現非同步。非同步架構是典型的生產者-消費者模式。使用非同步消息隊列能夠帶來如下好處:
- 提高系統可用性
- 提高系統響應速度
- 消除併發訪問高峰。消息隊列能夠把突然增加的訪問請求數據放入到隊列中,等待消費者處理,不會對網站造成太大壓力
7、冗餘
為了提高系統的可用性,防止某些伺服器宕機的情況下系統依然可以繼續服務,需要一定的伺服器冗餘運行、數據冗餘備份。資料庫除了定期備份實現冷備份之外,還需要主從分離,實時同步實現熱備份。為了抵禦海嘯、地震等不可抗力,還需要在全球範圍內部署災備數據中心。
8、自動化
發佈過程自動化:自動化代碼管理,自動化測試,自動化安全測試,自動化部署。系統運行過程中還有:自動化監控、自動化報警、自動化失效轉移、自動化失效恢復、自動化降級、自動化資源分配。
9、架構模式在新浪微博的應用
新浪微博系統分為三層:
- 最下層是基礎服務層,提供資料庫、緩存、搜索、存儲等基礎服務
- 中間層是平臺服務和應用服務層,微博的核心是微博、用戶、關係,這些服務被分割成獨立的模塊,通過依賴調用和對共用基礎服務構成微博的業務基礎
- API層,是微博的業務層,包括網站、app、第三方應用,通過調用API集成到微博系統中,共同組成一個生態系統
微博的發佈,早起使用同步推模式,用戶發表微博後會立即將這條微博插入到資料庫所有粉絲的訂閱列表中,用戶量比較大時,會引起大量的資料庫寫操作,超出負載,導致系統性能下降。後來改用非同步推拉方式,用戶發表微博之後立刻寫到消息隊列中然後立刻返回,消息隊列消費者將微博推送給當前線上粉絲的訂閱列表中,非線上用戶等登錄後在根據關註列表拉取微博訂閱列表
由於微博頻繁刷新,微博使用多級緩存策略,熱門微博和明星微博緩存在所有的微博伺服器上,線上用戶的微博和近期微博緩存在分散式緩存集群中
三、大型網站核心結構要素
1、性能。系統吞吐量幾個重要參數:QPS(TPS)、併發數、響應時間
QPS(TPS):每秒鐘request/事務 數量
併發數: 系統同時處理的request/事務數
響應時間: 一般取平均響應時間
QPS(TPS)= 併發數/平均響應時間
2、高可用
指的是網站可以保證大部分時間系統都是可用的,一些知名大型網站可以得到99.99%的時間都是可用的。高可用的設計目標是當有部分伺服器宕機時,整體的服務或者應用依然可用。
- 保證網站高可用的主要手段就是冗餘,應用部署在多台伺服器上同時提供訪問,數據存儲在多個伺服器上互相備份,任何一臺伺服器宕機都不會影響應用的整體可用。
- 網站的高可用還需要軟體開發過程的質量保證,通過預發佈驗證、自動化測試、自動化發佈、灰度發佈等手段,減少將故障引入線上環境的可能。
3、伸縮性
衡量的主要指標就是是否可以用多台服務構架集群,是否容易向集群中添加新的伺服器,加入的新的伺服器是否可以提供和原來伺服器無差別的服務,集群可容納的總伺服器數量是否有限制。
- 應用伺服器,通過使用合適的負載均衡設備,就可以向集群中不斷加入伺服器
- 緩存伺服器集群,加入新的伺服器可能會導致緩存路由失效,如果對緩存的依賴嚴重,可能會導致系統崩潰。
- 關係資料庫。雖然支持主從複製,主從熱備,但是很難做到大規模集群的可伸縮性。因此關係型資料庫的可伸縮性方案必須在資料庫之外實現,通過路由分區等手段,將多個部署的資料庫伺服器集成一個集群。
- NoSql資料庫。由於其先天就是為了海量數據而生的,因此對可伸縮性的支持非常好。
4、擴展性
衡量的主要標準就是網站增加新的業務產品時,是否會對現有產品產生影響,不需要改動或很少改動既有業務就可以上線新產品,不同產品之間很少的耦合,一個產品改動對其他產品沒有影響。
網站的可擴展架構的主要手段是事件驅動架構和分散式服務
- 事件驅動,通常利用消息隊列實現,把消息的生產者和消費者分開,這樣可以透明的增加新的生產者和消費者
- 分散式服務則是將業務和可復用服務拆分開,通過分散式服務調用可復用服務。可復用服務升級變更的時候,也可以通過提供多版本服務實現透明升級,不需要強制應用同步變更。
5、安全性
網站的安全架構需要保證網站不受惡意訪問和攻擊、保護網站的重要數據不被竊取。
四、網站的高性能架構
1、網站性能測試
性能測試指標。主要指標有響應時間、併發數、吞吐量、性能計數器
2、Web前端性能優化
瀏覽器訪問優化
- 減少http請求。合併css、JavaScript、圖片,將瀏覽器一次訪問需要的資源合併成一個文件
- 使用瀏覽器緩存。通過設置http頭部中的Cache-Control和Expires屬性,設置瀏覽器緩存。將css、javascript、圖片等靜態資源通過瀏覽器緩存起來,如果需要靜態資源及時應用到客戶端瀏覽器,可通過改變文件名實現。
十四、架構師領導藝術
1、關註人而不是產品
一定要堅信:一群優秀的人做一件他們熱愛的事,一定能取得成功。
領導的真諦:尋找一個值得共同奮鬥的目標,營造一個讓大家都能最大限度發揮自我價值的工作氛圍。
沒有懶惰的員工,只有沒被激發出來的激情。所有強迫員工加班的管理者都應該為自己的無能感到羞愧。
2、發掘人的優秀
是事情成就了人,而不是人成就了事。
發掘人的優秀比發掘優秀的人更有意義。
3、共用美好藍圖
架構師要和項目組全體成員共同描繪一個藍圖,這個藍圖是真個團隊能夠認同的,是團隊共同奮鬥的目標。這個藍圖應該是表述清楚的、形象的、簡單的。
4、共同參與架構
不要只有架構師一人擁有架構,讓其他人參與架構的設計和維護
5、學會妥協
不要企圖在項目中證明自己是正確的,一定要記住,你是來做軟體的,不是來做老大的。架構師越早被項目組遺忘,越表示架構非常成功;項目組越離不開架構師,越表示架構還有很多缺陷。
6、成就他人
想要成就自己,先要成就他人
十五、網站架構師職場攻略
1、發現問題,尋找突破
所謂問題,就是體驗不能滿足期望,就會覺得出了問題。消除問題有兩個方法:降低期望、改善體驗
2、提出問題,尋求支持
- 把“我的問題”變成“我們的問題”
- 給上司提封閉式問題,給下屬提開放式問題
- 指出問題,而不是批評人
- 用贊同的方式提出問題
3、解決問題,達成績效