大型網站技術架構核心原理(1)
阿新 • • 發佈:2020-08-26
### 序
- 書籍是人類進步的階梯,字裡行間傳達的是作者縝密的態度、思維的火花。盛世繁華之下,太多的人都伴隨著有生活的窘迫、工作的無奈以及情感的羈絆,煩躁之餘不妨讀一本書,放下不快,或許能給你帶來思維的拓展、情感的愉悅以及內心的寧靜,在此感謝《大型網站技術架構》的作者的分享。私以為,網際網路技術迭代日新月異,但核心架構理念是非常值得學習的,願好書有更多人學習參考,謹以此筆記分享 :)
### 一、大型網站架構技術演化
- 核心:技術的更新是因為業務的發展,技術是來解決業務問題的
- 誤區:技術不能解決所有問題,業務問題需要通過業務手段來解決
- 要素:效能、可用性、伸縮性、擴充套件性、安全性這五個特性間的關係需要進行平衡處理
##### 平衡策略
- 衡量效能的一般指標:
- 響應時間
- TPS(TransctionPerSecond,每秒系統能夠處理的交易或事務的數量)
- 系統性能計數器
1. 客戶端:
- 瀏覽器快取、頁面壓縮、減少Cookie傳輸、合理佈局頁面
- 使用 CND加速,靜態資源分發至離使用者最進的網路服務商機房,同時在網站機房部署反向代理伺服器,快取熱點檔案,加快請求相應速度,減輕應用伺服器負載壓力
2. 服務端:
- 伺服器本地快取和分散式快取
- 非同步操作,將使用者請求傳送至訊息佇列等待後續任務處理,當前請求直接返回響應給使用者
- 高併發情況下,將多臺應用伺服器組成一個叢集共同對外服務,提高整體處理能力,改善效能
- 程式碼中,使用多執行緒、改善記憶體管理等手段優化效能
3. 資料庫服務端:
- 索引、快取、SQL優化
- 使用 NoSQL,通過優化資料模型、儲存結構、伸縮特性等手段
##### 可用性策略
- 衡量標準:假設任意一臺伺服器宕機時,以及出現各種不可預期的問題時,系統整體是否依然可用
1. 應用伺服器:
- 多臺伺服器通過負載均衡裝置組成叢集,有個前提,應用伺服器是不你儲存`會話資訊` ,否則伺服器宕機,即使將使用者請求轉發到其他伺服器上也無法完成業務處理
2. 儲存伺服器:
- 資料冗餘備份,宕機時保證資料依然可用
3. 開發階段:
- 開發人員程式碼質量保證
- 自動化測試,自動化釋出
##### 伸縮性
- 衡量標準:是否可以用多臺伺服器構建叢集,是否容易向叢集中新增新的伺服器,加入新伺服器後是否可以提供與原來的伺服器無差別的服務,叢集中可容納的伺服器數量是否有限制
1. 應用伺服器叢集:
- 伺服器上不儲存資料,所有伺服器都是對等的,可以通過使用合適負載均衡裝置向叢集中不斷加入伺服器
2. 快取伺服器叢集:
- 加入新的伺服器可能會使快取路由失效,進而導致叢集中大不符快取資料都無法訪問,如果應用嚴重依賴快取,需要改進快取路由演算法
- 使用NoSQL資料庫快取,而不是使用 關係型資料庫
##### 擴充套件性
- 衡量標準:增加新業務時對現有產品基本透明無影響,或者僅需改動很少既有業務
- 實現手段:
- 事件驅動:該型別網站使用`訊息佇列` 實現,訊息產生(生產者)和訊息處理(消費者)分開,增加小的訊息勝者任務或者小的訊息消費者任務即可提高系統性能
- 分散式服務:`業務` 和`可複用服務` 分離開,通過分散式服務框架呼叫。新增產品可以通過呼叫可複用的服務實現自身的業務邏輯,而對現有產品牡羊座任何影響
##### 安全性
- 衡量標準:針對現存或潛在的各種攻擊手段與竊密手段,是否有可靠的應對策略
#### 1. 大型網站演化歷程
- 思考角度:
- 單體應用侷限性
- 資料庫分庫分表、主從複製
- 快取效能、時效性
- 叢集、負載均衡
- 分散式(業務、檔案系統、配置、資料一致性、排程)
- 非同步
- 自動化
- 安全
##### 1.1 單伺服器應用
- 特點:應用程式、資料庫、檔案系統統一放在一個伺服器上
- 隱患:
- 資料庫和檔案系統會隨著網站執行時間增長,儲存空間不再滿足需求,擴充套件困難
- 當用戶量或併發量增大時,應用程式與資料庫間會有爭奪記憶體,很大概率會宕機
##### 1.2 應用服務和資料服務分離
- 特點:應用服務、資料庫、檔案系統 **放在不同的伺服器上**
- 應用伺服器部署在`CPU有強大計算能力的伺服器上`
- 資料庫伺服器部署在`記憶體很大的伺服器上,便於快速磁碟檢索與磁碟快取`
- 檔案系統伺服器部署在`有大空間的儲存硬碟上`
- 隱患:解決了單伺服器儲存的瓶頸
- 使用者增多,對資料庫的訪問壓力增大,導致有延遲,影響體驗
##### 1.3 使用快取減小資料庫壓力
- 特點:經常訪問的資料進行快取,使用者獲取資料時直接從快取中獲取,減小資料庫壓力(二八定律)
- 本地快取:訪問速度更快,但是受本地記憶體限制,快取數量有限
- 遠端分散式快取:叢集,部署**大記憶體的** 的伺服器作為專門快取伺服器,`可以做到理論上不受記憶體容量限制的快取服務`
- 隱患:`單一應用處理請求的連線數有限,應用伺服器成為網站的的瓶頸`
- 解決方案:增加應用伺服器,通過應用伺服器叢集,負載均衡排程伺服器來將連線分發到合適的應用伺服器
##### 1.4 解決快取問題:主從複製,讀寫分離
- 特點:快取過期,或快取訪問不命中,寫操作就會請求訪問資料庫,使用者規模到某一程度時,資料庫會負載壓力過高。
- 解決方案:通過主庫`寫資料` ,然後同步更新到`讀資料的` 從庫資料伺服器,讀寫分離,降低資料庫壓力
##### 1.5 CDN加速和反向代理加速網站響應
- 特點:基本原理都是快取,一方面加快訪問速度,一方面降低服務端壓力
- CDN:使用者請求服務時,從距離自己最近的網路提供商機房獲取資料
- 反向代理:在服務端,請求傳送到服務端後,若服務端有資料則會返回資料;同時反向代理在請求量到一定規模時,也可以通過負載均衡將請求分發的合適的應用伺服器上
##### 1.6 分散式 檔案系統 和 分部式 資料庫系統
- 特點:表單數量過大時採用
- 解決方案:按業務拆分資料庫
- 隱患:隨著網站使用者及業務量發展,分散式資料庫不能滿足需求,也需要使用分散式檔案系統,這中情況只有在表單規模非常巨大使才使用,`常用的資料庫拆分手段是將不同的業務資料庫部署在不同的伺服器上`
##### 1.6 使用NoSQL 以及搜尋引擎
##### 1.7 業務拆分
- 特點:每個應用獨立部署,應用間通過`超連結` 或`訊息佇列` 進行資料分發;或者通過訪問同一個資料儲存系統來構成一個關聯的完整系統
##### 1.8 分散式服務
- 特點:獨立部署公用業務,由這些可複用的業務連線資料庫,提供共用業務服務。`應用系統只需要管理使用者介面,通過分散式服務呼叫共用業務完成具體業務操作`
- 解決的問題:
- 資料庫連線有限,公用業務進行資料庫訪問,然後為應用提供資料服務即可,減小資料伺服器壓力
- 公用業務得到複用,系統更好的維護
##### 1.9 雲端計算平臺
- 情景:大型網站通過上述演化,已通過組合和改進現有技術架構`解決海量資料的管理 和 高併發事物的處理` 。因此大公司可以將這些解決方案應用到網站以外的業務上去,中小型公司不需要關注技術架構問題,直接購買即可獲得`更大的儲存空間 和更多的計算資源`
- 特點:成熟的架構體系和資源,大型網站開始搭建`雲端計算平臺` ,為中小型企業提供計算服務;一方面使大型網站本身的資源(伺服器、架構方案),充分得到再利用,另一方面使得中小型公司可以`專注業務的發展,不必再架構上試錯` ,通過購買計算服務即可。
#### 2. 大型網站架構模式
##### 2.1 分層
- 橫向分割(邏輯分層),也在物理層面上分層,將不同層級分別部署在不同的伺服器上
- 應用層
- 服務層
- 資料層
- 優點
- 便於分工合作和維護
- 各層之間具有一定的獨立性,只要維持呼叫的介面不變,各層可以根據**具體問題獨立演化發展,並且不影響其他層**
- 注意事項
- 各層級不能跨層級呼叫
- 必須合理規劃層次邊界和介面
##### 2.2 分割
- 層級內縱向分割。例應用層可分多個(服務層也可根據需要分層)
- 搜尋
- 購物
- 廣告
- 論壇
##### 2.3 分散式
- 基礎條件:`分層` 和`分割` ,將不同模組部署在不同的伺服器是和,通過遠端呼叫協同工作
- 實現:分散式用於處理訪問量大和資料量大的應用,通過使用更多的計算機、CPU、記憶體、儲存空間,提高併發訪問量、負載均衡、計算及儲存效能
- 問題:
- 宕機:一臺伺服器宕機,這太服務的其他子伺服器也不能正常使用,資源浪費,網站可用性降低
- 網路:網路波動會影響效能
- 資料:分散式環境中資料保持一致性
###### 2.3.1 分散式應用和服務
- 基礎條件:應用和服務模組分層分割分散式部署,
- 優點:
- 改善網站效能和併發性,加快開發和釋出,減少資料庫連線資源損耗
- 提高服務的`複用性` ,便於業務功能的擴充套件
###### 2.3.2 分散式靜態資源
- 動靜分離,靜態資源分散式部署減輕應用伺服器的壓力。通過使用`獨立域名`,由使用者體驗部開發等措施,可以加快瀏覽器併發訪問速度
###### 2.3.3 分散式資料和儲存
###### 2.3.4 分散式計算
- 計算什麼:搜尋引擎的索引構建 和 資料倉庫的資料分析統計
- 實現:利用 `Hadoop` 及其` MapReduce ` 分散式計算框架進行`批處理計算`,優點如下:
- 計算:移動計算 而不是 移動資料,將計算程式分發到資料所在的位置以加速計算和分散式計算
- 分散式配置:網站線上伺服器配置實時更新 分散式配置
- 分散式鎖:分散式環境下實現兵法和協同的分散式鎖
- 分散式檔案系統
###### 2.3.3 叢集
- 相同應用用多臺伺服器部署,通過閘道器控制實現負載均衡,當一臺伺服器不能使用了,不會導致應用崩潰
###### 2.3.4 快取
- 目的:將資料存放在離計算機最近的位置以加快處理速度。
- 使用快取的條件:
- 熱點資料應該放在快取中
- 資料不會在短期失效,否則會產生`zhang讀`
- 實現:
- CDN
- 反向代理
- 本地快取
- 分散式快取
###### 2.3.5 非同步
- 實現:
- 單一伺服器:內部通過多執行緒`共享記憶體佇列` 的方式實現非同步,在業務操作前面的執行緒將輸出寫到佇列中,後面的執行緒從佇列中讀取資料進行處理;
- 分散式系統中:多個伺服器叢集通過`分散式訊息佇列` 實現非同步,分散式訊息佇列可以看作記憶體佇列的分散式部署
- 特點:典型的`生產者和消費者模式` ,兩者不存在直接呼叫,只要保持資料結構不變,彼此功能實現可以隨意變化而不互相影響,這網站擴充套件新功能非常便利。
- 優點
- 提高系統可用性:消費者伺服器故障,生產者伺服器可以繼續處理業務請求;消費者伺服器恢復後,繼續處理訊息佇列中的資料
- 加快網站響應速度:生產者伺服器處理完業務請求後將資料寫入訊息佇列,不需要等待消費者伺服器處理就可返回,響應延遲減少
- 消除併發訪問高峰:併發高峰時,消費者訪問請求放到訊息佇列中,等待消費者伺服器依次處理,雖然響應可能會慢點,但是不會對網站負載造成太大的壓力
###### 2.3.6 冗餘
- 情景:網站需要 7x24 小時連續執行,伺服器規模比較大時,宕機是必然事件。所以避免資料丟失,需要對資料週期進行`冗餘備份`
- 常見方式:
- 冷備份,資料定期備分
- 熱備份,資料庫主從分離
- 災備資料重心
###### 2.3.7 自動化
- 自動化釋出
- 自動化程式碼管理
- 自動化測試
- 自動化安全檢測
- 自動化部署
- 自動化監控
- 自動化報警
- 自動化失效轉移
- 自動化失效恢復
- 自動化降級
- 自動化分配資源
###### 2.3.8 安全
- 敏感資訊加密
- 對於常見的攻擊網站的 XSS 攻擊、SQL 注入、進行編碼轉換等相應處理
- 對垃圾資訊進行過濾
- 對交易轉賬業務進行`風險控制`