什么是高并發(fā)?
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一楔壤,它通常是指鹤啡,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請求。
高并發(fā)相關(guān)的常見指標(biāo)有哪些蹲嚣?
- 響應(yīng)時(shí)間(Response Time)
- 吞吐量(Throughput)
- 每秒查詢率QPS(Query Per Second)
- 并發(fā)用戶數(shù)
什么是響應(yīng)時(shí)間递瑰?
系統(tǒng)對請求做出響應(yīng)的時(shí)間。
例如:系統(tǒng)處理一個(gè)HTTP請求需要200ms隙畜,這個(gè)200ms就是系統(tǒng)的響應(yīng)時(shí)間抖部。
什么是吞吐量?
單位時(shí)間內(nèi)處理的請求數(shù)量议惰。
什么是QPS慎颗?
每秒響應(yīng)請求數(shù)。在互聯(lián)網(wǎng)領(lǐng)域,這個(gè)指標(biāo)和吞吐量區(qū)分的沒有這么明顯俯萎。
什么是并發(fā)用戶數(shù)傲宜?
同時(shí)承載正常使用系統(tǒng)功能的用戶數(shù)量。
例如:一個(gè)即時(shí)通訊系統(tǒng)夫啊,同時(shí)在線量一定程度上代表了系統(tǒng)的并發(fā)用戶數(shù)函卒。
如何提升系統(tǒng)的并發(fā)能力?
互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)撇眯,提高系統(tǒng)并發(fā)能力的方式报嵌,方法論上主要有兩種:
- 垂直擴(kuò)展(Scale Up)
- 水平擴(kuò)展(Scale Out)
什么是垂直擴(kuò)展?
垂直擴(kuò)展是指叛本,提升單機(jī)處理能力沪蓬,垂直擴(kuò)展的方式又有兩種:
(1)增強(qiáng)單機(jī)硬件性能,例如:增加CPU核數(shù)如32核来候,升級更好的網(wǎng)卡如萬兆跷叉,升級更好的硬盤如SSD,擴(kuò)充硬盤容量如2T营搅,擴(kuò)充系統(tǒng)內(nèi)存如128G云挟;
(2)提升單機(jī)架構(gòu)性能,例如:使用Cache來減少IO次數(shù)转质,使用異步來增加單服務(wù)吞吐量园欣,使用無鎖數(shù)據(jù)結(jié)構(gòu)來減少響應(yīng)時(shí)間;
畫外音:在互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展非常迅猛的早期休蟹,如果預(yù)算不是問題沸枯,強(qiáng)烈建議使用“增強(qiáng)單機(jī)硬件性能”的方式提升系統(tǒng)并發(fā)能力,因?yàn)檫@個(gè)階段赂弓,公司的戰(zhàn)略往往是發(fā)展業(yè)務(wù)搶時(shí)間绑榴,而“增強(qiáng)單機(jī)硬件性能”往往是最快的方法。
垂直擴(kuò)展有什么瓶頸盈魁?
不管是提升單機(jī)硬件性能翔怎,還是提升單機(jī)架構(gòu)性能,都有一個(gè)致命的不足:單機(jī)性能總是有極限的杨耙。
如何突破單機(jī)的極限赤套?
互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì),高并發(fā)終極解決方案還是水平擴(kuò)展珊膜。
什么是水平擴(kuò)展容握?
只要增加服務(wù)器數(shù)量,就能線性擴(kuò)充系統(tǒng)性能车柠。
常見的互聯(lián)網(wǎng)分層架構(gòu)如何唯沮?
各層該如何落地水平擴(kuò)展脖旱?
常見互聯(lián)網(wǎng)分布式架構(gòu)如上,分為:
(1)客戶端層:典型調(diào)用方是瀏覽器browser或者手機(jī)應(yīng)用APP介蛉;
(2)反向代理層:系統(tǒng)入口萌庆,反向代理;
(3)站點(diǎn)應(yīng)用層:實(shí)現(xiàn)核心應(yīng)用邏輯币旧,返回html或者json践险;
(4)服務(wù)層:如果實(shí)現(xiàn)了服務(wù)化,就有這一層吹菱;
(5)數(shù)據(jù)-緩存層:緩存加速訪問存儲(chǔ)巍虫;
(6)數(shù)據(jù)-數(shù)據(jù)庫層:數(shù)據(jù)庫固化數(shù)據(jù)存儲(chǔ);
要想真?zhèn)€系統(tǒng)支持水平擴(kuò)展鳍刷,就必須每一層都支持水平擴(kuò)展占遥。
反向代理層如何進(jìn)行水平擴(kuò)展?
反向代理層的水平擴(kuò)展输瓜,是通過“DNS輪詢”實(shí)現(xiàn)的:dns-server對于一個(gè)域名配置了多個(gè)解析ip瓦胎,每次DNS解析請求來訪問dns-server,會(huì)輪詢返回這些ip尤揣。
當(dāng)nginx成為瓶頸的時(shí)候搔啊,只要增加服務(wù)器數(shù)量,新增nginx服務(wù)的部署北戏,增加一個(gè)外網(wǎng)ip负芋,就能擴(kuò)展反向代理層的性能,做到理論上的無限高并發(fā)嗜愈。
站點(diǎn)層如何進(jìn)行水平擴(kuò)展旧蛾?
站點(diǎn)層的水平擴(kuò)展,是通過“nginx”實(shí)現(xiàn)的蠕嫁,通過修改nginx.conf锨天,可以設(shè)置多個(gè)web后端。
畫外音:nginx是個(gè)例子拌阴,有可能是LVS或者F5等反向代理。
當(dāng)web后端成為瓶頸的時(shí)候奶镶,只要增加服務(wù)器數(shù)量迟赃,新增web服務(wù)的部署,在nginx配置中配置上新的web后端厂镇,就能擴(kuò)展站點(diǎn)層的性能纤壁,做到理論上的無限高并發(fā)。
服務(wù)層如何進(jìn)行水平擴(kuò)展捺信?
服務(wù)層的水平擴(kuò)展酌媒,是通過“服務(wù)連接池”實(shí)現(xiàn)的欠痴。
站點(diǎn)層通過RPC-client調(diào)用下游的服務(wù)層RPC-server時(shí),RPC-client中的連接池會(huì)建立與下游服務(wù)多個(gè)連接秒咨,當(dāng)服務(wù)成為瓶頸的時(shí)候喇辽,只要增加服務(wù)器數(shù)量,新增服務(wù)部署雨席,在RPC-client處建立新的下游服務(wù)連接菩咨,就能擴(kuò)展服務(wù)層性能,做到理論上的無限高并發(fā)陡厘。
畫外音:如果需要優(yōu)雅的進(jìn)行服務(wù)層自動(dòng)擴(kuò)容抽米,這里可能需要配置中心里服務(wù)自動(dòng)發(fā)現(xiàn)功能的支持。
數(shù)據(jù)層如何進(jìn)行水平擴(kuò)展糙置?
在數(shù)據(jù)量很大的情況下云茸,數(shù)據(jù)層(緩存,數(shù)據(jù)庫)涉及數(shù)據(jù)的水平擴(kuò)展谤饭,將原本存儲(chǔ)在一臺(tái)服務(wù)器上的數(shù)據(jù)(緩存标捺,數(shù)據(jù)庫)水平拆分到不同服務(wù)器上去,以達(dá)到擴(kuò)充系統(tǒng)性能的目的网持。
互聯(lián)網(wǎng)數(shù)據(jù)層常見的水平拆分方式有這么幾種宜岛,以數(shù)據(jù)庫為例:
一、按照范圍水平拆分
每一個(gè)數(shù)據(jù)服務(wù)功舀,存儲(chǔ)一定范圍的數(shù)據(jù)萍倡,上圖為例:
- user0庫,存儲(chǔ)uid范圍1-1kw
- user1庫辟汰,存儲(chǔ)uid范圍1kw-2kw
這個(gè)方案的好處是:
(1)規(guī)則簡單列敲,service只需判斷一下uid范圍就能路由到對應(yīng)的存儲(chǔ)服務(wù);
(2)數(shù)據(jù)均衡性較好帖汞;
(3)比較容易擴(kuò)展戴而,可以隨時(shí)加一個(gè)uid[2kw,3kw]的數(shù)據(jù)服務(wù);
不足是:
(1)請求的負(fù)載不一定均衡翩蘸,一般來說所意,新注冊的用戶會(huì)比老用戶更活躍,大range的服務(wù)請求壓力會(huì)更大催首;
二扶踊、按照哈希水平拆分
每一個(gè)數(shù)據(jù)庫,存儲(chǔ)某個(gè)key值hash后的部分?jǐn)?shù)據(jù)郎任,上圖為例:
- user0庫秧耗,存儲(chǔ)偶數(shù)uid數(shù)據(jù)
- user1庫,存儲(chǔ)奇數(shù)uid數(shù)據(jù)
這個(gè)方案的好處是:
(1)規(guī)則簡單舶治,service只需對uid進(jìn)行hash能路由到對應(yīng)的存儲(chǔ)服務(wù)分井;
(2)數(shù)據(jù)均衡性較好车猬;
(3)請求均勻性較好;
不足是:
(1)不容易擴(kuò)展尺锚,擴(kuò)展一個(gè)數(shù)據(jù)服務(wù)珠闰,hash方法改變時(shí)候,可能需要進(jìn)行數(shù)據(jù)遷移缩麸;
通過水平拆分來擴(kuò)充系統(tǒng)性能铸磅,與主從同步讀寫分離來擴(kuò)充數(shù)據(jù)庫性能,有什么本質(zhì)的不同杭朱?
畫外音:這兩個(gè)方案千萬別搞混阅仔。
通過水平拆分?jǐn)U展數(shù)據(jù)庫性能:
(1)每個(gè)服務(wù)器上存儲(chǔ)的數(shù)據(jù)量是總量的1/n,所以單機(jī)的性能也會(huì)有提升弧械;
(2)n個(gè)服務(wù)器上的數(shù)據(jù)沒有交集八酒,那個(gè)服務(wù)器上數(shù)據(jù)的并集是數(shù)據(jù)的全集;
(3)數(shù)據(jù)水平拆分到了n個(gè)服務(wù)器上刃唐,理論上讀性能擴(kuò)充了n倍羞迷,寫性能也擴(kuò)充了n倍(其實(shí)遠(yuǎn)不止n倍,因?yàn)閱螜C(jī)的數(shù)據(jù)量變?yōu)榱嗽瓉淼?/n)画饥;
通過主從同步讀寫分離擴(kuò)展數(shù)據(jù)庫性能:
(1)每個(gè)服務(wù)器上存儲(chǔ)的數(shù)據(jù)量是和總量相同衔瓮;
(2)n個(gè)服務(wù)器上的數(shù)據(jù)都一樣,都是全集抖甘;
(3)理論上讀性能擴(kuò)充了n倍热鞍,寫仍然是單點(diǎn),寫性能不變衔彻;
緩存層的水平拆分和數(shù)據(jù)庫層的水平拆分類似薇宠,也是以范圍拆分和哈希拆分的方式居多,就不再展開艰额。
總結(jié)
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一澄港,它通常是指,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請求柄沮。
提高系統(tǒng)并發(fā)能力的方法主要有兩種:
- 垂直擴(kuò)展(Scale Up)
- 水平擴(kuò)展(Scale Out)
前者垂直擴(kuò)展可以通過提升單機(jī)硬件性能回梧,或者提升單機(jī)架構(gòu)性能,來提高并發(fā)性祖搓,但單機(jī)性能總是有極限的狱意,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)高并發(fā)終極解決方案還是后者:水平擴(kuò)展。
互聯(lián)網(wǎng)分層架構(gòu)中棕硫,各層次水平擴(kuò)展的實(shí)踐又有所不同:
(1)反向代理層可以通過“DNS輪詢”的方式來進(jìn)行水平擴(kuò)展髓涯;
(2)站點(diǎn)層可以通過nginx來進(jìn)行水平擴(kuò)展袒啼;
(3)服務(wù)層可以通過服務(wù)連接池來進(jìn)行水平擴(kuò)展哈扮;
(4)數(shù)據(jù)庫可以按照數(shù)據(jù)范圍纬纪,或者數(shù)據(jù)哈希的方式來進(jìn)行水平擴(kuò)展;
各層實(shí)施水平擴(kuò)展后滑肉,能夠通過增加服務(wù)器數(shù)量的方式來提升系統(tǒng)的性能包各,做到理論上的性能無限。
思路比結(jié)論重要靶庙。