W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統(tǒng)能夠同時并行處理很多請求。
響應時間:系統(tǒng)對請求做出響應的時間。例如系統(tǒng)處理一個HTTP請求需要200ms,這個200ms就是系統(tǒng)的響應時間。
吞吐量:單位時間內處理的請求數(shù)量。
QPS:每秒響應請求數(shù)。在互聯(lián)網(wǎng)領域,這個指標和吞吐量區(qū)分的沒有這么明顯。
并發(fā)用戶數(shù):同時承載正常使用系統(tǒng)功能的用戶數(shù)量。例如一個即時通訊系統(tǒng),同時在線量一定程度上代表了系統(tǒng)的并發(fā)用戶數(shù)。
互聯(lián)網(wǎng)分布式架構設計,提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。
垂直擴展:提升單機處理能力。垂直擴展的方式又有兩種:
(1)增強單機硬件性能,例如:增加CPU核數(shù)如32核,升級更好的網(wǎng)卡如萬兆,升級更好的硬盤如SSD,擴充硬盤容量如2T,擴充系統(tǒng)內存如128G;
(2)提升單機架構性能,例如:使用Cache來減少IO次數(shù),使用異步來增加單服務吞吐量,使用無鎖數(shù)據(jù)結構來減少響應時間;
常見互聯(lián)網(wǎng)分布式架構如上,分為:
(1)客戶端層:典型調用方是瀏覽器browser或者手機應用APP
(2)反向代理層:系統(tǒng)入口,反向代理
(3)站點應用層:實現(xiàn)核心應用邏輯,返回html或者json
(4)服務層:如果實現(xiàn)了服務化,就有這一層
(5)數(shù)據(jù)-緩存層:緩存加速訪問存儲
(6)數(shù)據(jù)-數(shù)據(jù)庫層:數(shù)據(jù)庫固化數(shù)據(jù)存儲
整個系統(tǒng)各層次的水平擴展,又分別是如何實施的呢?
反向代理層的水平擴展
反向代理層的水平擴展,是通過“DNS輪詢”實現(xiàn)的:dns-server對于一個域名配置了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip。
當nginx成為瓶頸的時候,只要增加服務器數(shù)量,新增nginx服務的部署,增加一個外網(wǎng)ip,就能擴展反向代理層的性能,做到理論上的無限高并發(fā)。
站點層的水平擴展,是通過“nginx”實現(xiàn)的。通過修改nginx.conf,可以設置多個web后端。
當web后端成為瓶頸的時候,只要增加服務器數(shù)量,新增web服務的部署,在nginx配置中配置上新的web后端,就能擴展站點層的性能,做到理論上的無限高并發(fā)。
服務層的水平擴展,是通過“服務連接池”實現(xiàn)的。
站點層通過RPC-client調用下游的服務層RPC-server時,RPC-client中的連接池會建立與下游服務多個連接,當服務成為瓶頸的時候,只要增加服務器數(shù)量,新增服務部署,在RPC-client處建立新的下游服務連接,就能擴展服務層性能,做到理論上的無限高并發(fā)。如果需要優(yōu)雅的進行服務層自動擴容,這里可能需要配置中心里服務自動發(fā)現(xiàn)功能的支持。
數(shù)據(jù)層的水平擴展
在數(shù)據(jù)量很大的情況下,數(shù)據(jù)層(緩存,數(shù)據(jù)庫)涉及數(shù)據(jù)的水平擴展,將原本存儲在一臺服務器上的數(shù)據(jù)(緩存,數(shù)據(jù)庫)水平拆分到不同服務器上去,以達到擴充系統(tǒng)性能的目的。
互聯(lián)網(wǎng)數(shù)據(jù)層常見的水平拆分方式有這么幾種,以數(shù)據(jù)庫為例:
按照范圍水平拆分
每一個數(shù)據(jù)服務,存儲一定范圍的數(shù)據(jù),上圖為例:
user0庫,存儲uid范圍1-1kw
user1庫,存儲uid范圍1kw-2kw
這個方案的好處是:
(1)規(guī)則簡單,service只需判斷一下uid范圍就能路由到對應的存儲服務;
(2)數(shù)據(jù)均衡性較好;
(3)比較容易擴展,可以隨時加一個uid[2kw,3kw]的數(shù)據(jù)服務;
不足是:
(1)請求的負載不一定均衡,一般來說,新注冊的用戶會比老用戶更活躍,大range的服務請求壓力會更大;
每一個數(shù)據(jù)庫,存儲某個key值hash后的部分數(shù)據(jù),上圖為例:
user0庫,存儲偶數(shù)uid數(shù)據(jù)
user1庫,存儲奇數(shù)uid數(shù)據(jù)
這個方案的好處是:
(1)規(guī)則簡單,service只需對uid進行hash能路由到對應的存儲服務;
(2)數(shù)據(jù)均衡性較好;
(3)請求均勻性較好;
不足是:
(1)不容易擴展,擴展一個數(shù)據(jù)服務,hash方法改變時候,可能需要進行數(shù)據(jù)遷移;
這里需要注意的是,通過水平拆分來擴充系統(tǒng)性能,與主從同步讀寫分離來擴充數(shù)據(jù)庫性能的方式有本質的不同。
通過水平拆分擴展數(shù)據(jù)庫性能:
(1)每個服務器上存儲的數(shù)據(jù)量是總量的1/n,所以單機的性能也會有提升;
(2)n個服務器上的數(shù)據(jù)沒有交集,那個服務器上數(shù)據(jù)的并集是數(shù)據(jù)的全集;
(3)數(shù)據(jù)水平拆分到了n個服務器上,理論上讀性能擴充了n倍,寫性能也擴充了n倍(其實遠不止n倍,因為單機的數(shù)據(jù)量變?yōu)榱嗽瓉淼?/n);
通過主從同步讀寫分離擴展數(shù)據(jù)庫性能:
(1)每個服務器上存儲的數(shù)據(jù)量是和總量相同;
(2)n個服務器上的數(shù)據(jù)都一樣,都是全集;
(3)理論上讀性能擴充了n倍,寫仍然是單點,寫性能不變;
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統(tǒng)能夠同時并行處理很多請求。
提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。前者垂直擴展可以通過提升單機硬件性能,或者提升單機架構性能,來提高并發(fā)性,但單機性能總是有極限的,互聯(lián)網(wǎng)分布式架構設計高并發(fā)終極解決方案還是后者:水平擴展。
互聯(lián)網(wǎng)分層架構中,各層次水平擴展的實踐又有所不同:
(1)反向代理層可以通過“DNS輪詢”的方式來進行水平擴展;
(2)站點層可以通過nginx來進行水平擴展;
(3)服務層可以通過服務連接池來進行水平擴展;
(4)數(shù)據(jù)庫可以按照數(shù)據(jù)范圍,或者數(shù)據(jù)哈希的方式來進行水平擴展;
各層實施水平擴展后,能夠通過增加服務器數(shù)量的方式來提升系統(tǒng)的性能,做到理論上的性能無限。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: