讀書筆記: 大型網站系統與Java中介軟體實踐(2)
2 大型網站架構演進
大型網站並不是單指訪問量大的網站,如某些導航網站訪問量很大,但卻並不是大型網站。大型網站一般指有海量的資料,高併發的訪問量,同時本身的業務和系統的複雜度也較高。
2.2 大型網站的架構演進
簡單的系統,可能僅僅只需要一個伺服器,將應用系統和資料庫放在同一個伺服器上。隨著訪問量增大,伺服器壓力上升,需要將應用系統和資料庫分離開,分別放在應用伺服器和資料庫伺服器上。當系統進一步發展,單臺應用伺服器可能無法承受負載壓力,此時需要將應用伺服器從單臺伺服器擴充套件為叢集。演進過程如下圖所示:
2.2.1 分散式session
應用伺服器從單機變為叢集之後,一個請求進來之後交由叢集中的哪一臺機器進行處理,涉及到請求路由和負載均衡,可通過負載均衡軟體或服務註冊中心解決。同時,叢集環境也帶來了分散式session問題。分散式session有以下幾種解決方案。
Session Sticky
這種解決方案是在負載均衡器上做了處理,將同樣session的請求每次都發送到同一個伺服器上。此種方式帶來的問題是:如果某臺伺服器宕機或重啟,這臺伺服器中的session就會丟失,如果session中儲存有使用者的登入狀態資料,那麼使用者就需要重新登入。
Session Replication
這種方式在每一臺伺服器上覆制session。這樣來自用一個使用者的請求,不管是傳送到哪一臺伺服器上,都能找到該使用者的session。 但問題是同步session資料帶來了網路頻寬的消耗,另外也需要消耗更多的記憶體,在每一臺伺服器上儲存同樣的session。
Session集中儲存
這種方式是將session集中儲存起來,如儲存到分散式快取伺服器上或持久化到資料庫中()。當web伺服器使用Session資料時,從這個集中儲存session資料的地方來讀取。此種方案存在的問題是,如果幾種儲存Session的機器或叢集宕機,就會影響應用。
Cookie Based
這種方案是將Session資料方法放到Cookie中,然後在Web伺服器上從Cookie中生成對應的Session資料。但問題是一來Cookie存在安全方面的問題,而是Cookie資料長度是有限制的。
在實際中,大部分情況都會採用Session集中儲存的解決方案,另一篇文章中也提到過分散式session解決方案-分散式快取。
2.2.2 資料庫讀寫分離
當資料庫壓力大時,可對資料庫進行讀寫分離。這會帶來兩個問題:一是資料複製,而二是資料來源的選擇。
對於資料複製,資料庫系統一般都提供了此功能,可以直接使用,如mysql的主從複製。但資料複製也存在著時延,在某些場景下可能會出現主庫和從庫資料不一致的問題。
讀寫分離之後,寫操作需要選擇寫庫,讀操作需要選擇讀庫,帶來了資料來源的選擇問題。
2.2.3 搜尋引擎
當根據商品關鍵字搜尋商品,或其他模糊查詢時,使用SQL查詢代價是很大的。更好的方式是引入垂直化搜尋引擎。
2.2.4 其他分散式系統基礎設施
本章還大概介紹了分散式快取,持久化儲存方案擴充套件,訊息中介軟體等。整體上介紹得比較散,內容都屬於分散式系統的基礎設施。這些內容在博主的另一篇讀書筆記(分散式系統基礎設施)中都有介紹,而且集中一些,這裡不再重複。