[TOC]
前言
一個專案剛開始的時候是為了實現基本功能,隨著版本和功能的迭代,大資料和高併發成了軟體設計必須考慮的問題!
本質很簡單,一個是慢,一個是等。
兩者是相互關聯的,因為慢,所以要等,因為等,所以慢,解決了慢,也就解決了等,解決了等,也就解決了慢。
關鍵是如何解決慢和等,
核心 一個是短,一個是少,一個是分流,最後一個是叢集/橫向擴張/讀寫分離/建立主從
短
是指路徑要短
- 頁面靜態化- 使用者可以直接獲取頁面,不用走那麼多流程,比較適用於頁面不頻繁更新。
- 使用快取– 第一次獲取資料從資料庫準提取,然後儲存在快取中,以後就可以直接從快取提取資料。不過需要有機制維持快取和資料庫的一致性。
- 使用儲存過程-那些處理一次請求需要多次訪問資料庫的操作,可以把操作整合到儲存過程,這樣只要一次資料庫訪問就可以了。
- 批量讀取 – 高併發情況下,可以把多個請求的查詢合併到一次進行,以減少資料庫的訪問次數
- 延遲修改 – 高併發情況下,可以把多次修改請求,先儲存在快取中,然後定時將快取中的資料儲存到資料庫中,風險是可能會斷電丟失快取中的資料,
- 使用索引 – 索引可以看作是特殊的快取,儘量使用索引就要求where字句中精確的給出索引列的值。
少
是指查詢的資料要少:
- 分表 – 把本來同一張表的內容,可以按照地區,類別等分成多張表,很簡單的一個思路,但是要儘量避免分出來的多表關聯查詢。
- 分離活躍資料 – 例如登入使用者業務,註冊使用者很多,但是活躍的登入使用者很少,可以把活躍使用者專門儲存一張表,查詢是先查詢活躍表,沒有的話再查總表,這也類似與快取啦。
- 分塊 – 資料庫層面的優化,對程式是透明的,查詢大資料只用找到相應塊就行。
分流
- 叢集 – 將併發請求分配到不同的伺服器上,可以是業務伺服器,也可以是資料庫伺服器。
- 分散式 – 分散式是把單次請求的多項業務邏輯分配到多個伺服器上,這樣可以同步處理很多邏輯,一般使用與特別複雜的業務請求。
- CDN – 在域名解析層面的分流,例如將華南地區的使用者請求分配到華南的伺服器,華中地區的使用者請求分配到華中的伺服器。
- 分庫分表 –
水平拆分【分表】:
對於訪問極為頻繁且資料量巨大的單表來說,首先要做的是減少單表的記錄條數,以便減少資料查詢所需的時間,提高資料庫的吞吐,這就是所謂的分表【水平拆分】
垂直拆分【分庫】:
是根據業務耦合性,將關聯度低的不同表儲存在不同的資料庫上,對資料庫進行拆分,從而提高資料庫寫入能力,即分庫【垂直拆分】
- 建立主從 – 讀寫分離就是隻在主伺服器上寫,只在從伺服器上讀,基本原理是讓主資料庫處理事務性查詢,而從資料庫處理select查詢,資料庫複製被用於把事務性查詢(增刪改)導致的改變更新同步到叢集中的從資料庫。