大數據和高並發的解決方案匯總
1.3海量數據解決方案
1.使用緩存:
使用方式:1,使用程序直接保存到內存中。主要使用Map,尤其ConcurrentHashMap。
2,使用緩存框架。常用的框架:Ehcache,Memcache,Redis等。
最關鍵的問題是:什么時候創建緩存,以及其失效機制。
對於空數據的緩沖:最好用一個特定的類型值來保存,以區別空數據和未緩存的兩種狀態。
2.數據庫優化:
1,表結構優化。
2,SQL語句優化,語法優化和處理邏輯優化。可記錄各語句執行時間,有針對性的分析。
3,分區
4,分表
5,索引優化
6,使用存儲過程代替直接操作
3.分離活躍數據
例如用戶,可以分為活躍用戶和不活躍用戶。
4.批量讀取和延遲修改
高並發情況可以將多個查詢請求合並到一個。
高並發且頻繁修改的可以暫存緩存中。
5.讀寫分離
上圖,數據庫服務器配置多個,配置主從數據庫。寫用主數據庫,讀用從數據庫。
6.分布式數據庫
將不同的表存放到不同的數據庫中,然后再放到不同的服務器中。有些復雜問題,如:事務處理,多表查詢。
7.NoSql和Hadoop
NoSql,not only SQL。沒有關系型數據庫那么多限制,比較靈活高效。
Hadoop,將一個表中的數據分層多塊,保存到多個節點(分布式)。每一塊數據都有多個節點保存(集群)。集群可以並行處理相同的數據,還可以保證數據的完整性。
1.4高並發的解決方案。
1.應用和靜態資源分離。
將靜態資源(js,css,圖片等)放到專門的服務器中。
2.頁面緩存
將應用生成的頁面緩存起來可以節省大量cpu資源。
對於部分頁面經常變換數據的,可以使用ajax來處理。
3.集群和分布式
集群,多台服務器具有相同的功能,主要起分流的作用。
分布式,將不同的業務放到不同的服務器中,處理一個請求可能需要多台服務器,進而提高一個請求的處理速度。
又分為靜態資源集群和應用程序集群。后者較復雜,經常要考慮session同步等問題。
4.反向代理
客戶端直接訪問的服務器並不是直接提供服務的服務器,它從別的服務器獲取資源,然后將結果返回給用戶。
代理服務器和反向代理服務器:
代理服務器是代我們訪獲取資源,然后將結果返回。例如,訪問外網的代理服務器。反向代理服務器是我們正常訪問一台服務器的時候,服務器自己調用了別的服務器。
代理服務器我們主動使用,是為我們服務的,不需要有自己的域名;反向代理是服務器自己使用的,我們並不知道,有自己的域名。
5,CDN
CDN是一種特殊的集群頁面緩沖服務器,和普通的集群的多台頁面緩沖服務器相比主要區別是:其存放位置和分配請求方式不同。
CDN的服務器分布在全國各地,接收到請求后會將請求分配到最合適的CDN服務器節點來獲取數據。其每一個CDN節點就是一個頁面緩存服務器。
分配方式:並不是普通的負載均衡,而是專門的CDN域名解析服務器在解析域名的時候就分配好的,一般的做飯是:ISP那里使用CNAME將域名解析到一個特定的域名,然后再將解析到的那個域名用專門的CDN服務器解析(返回給瀏覽器,再訪問)到相應的CDN節點。每個節點可能也集群了多台服務器。
你可以知道處理高並發的業務邏輯是:
- 前端:異步請求+資源靜態化+cdn
- 后端:請求隊列+輪詢分發+負載均衡+共享緩存
- 數據層:redis緩存+數據分表+寫隊列
- 存儲:raid陣列+熱備
- 網絡:dns輪詢+DDOS攻擊防護
網站架構的整個演變主要圍繞大數據和高並發而展開。解決的方案主要是使用緩存和多資源兩種類型。多資源:多存儲,多CPU,多網絡。可以單個資源處理一個請求,也可以多個。
使用復雜框架之前一定要將項目的業務優化好,基礎中的基礎,重中之重!