故障轉(zhuǎn)移,服務(wù)發(fā)現(xiàn),負(fù)載均衡,居然都和它有關(guān)?。?!
沒錯,說的就是連接池,玩互聯(lián)網(wǎng)架構(gòu),連接池是必須要掌握的。
什么是連接池?
創(chuàng)建與管理連接緩沖池的技術(shù),本質(zhì)是資源復(fù)用,不用頻繁創(chuàng)建與銷毀連接,能提高性能。
畫外音:數(shù)據(jù)庫連接池,服務(wù)連接池,都是連接池。
微服務(wù)分層架構(gòu)中,連接池扮演著極其重要的角色。
如上圖:
- 上層虛線框,是web集群;
- 下層虛線框,是service集群;
- 綠色框,代表一條上下游建立的連接;
- 藍(lán)色框,代表連接池;
此例中,一個調(diào)用方會與一個服務(wù)節(jié)點建立2條連接,服務(wù)集群共3個集群,故連接池總共6條連接,從c1到c6。
上層調(diào)用方,除了會從連接池中拿連接收發(fā)報文訪問下游服務(wù)外,互聯(lián)網(wǎng)架構(gòu)中,還有哪些技術(shù)點與連接池相關(guān)呢?
一、故障轉(zhuǎn)移與服務(wù)發(fā)現(xiàn)
如上圖:
- 故障轉(zhuǎn)移,假如舊的服務(wù)節(jié)點s1出現(xiàn)了故障,c1和c2連接失效,會被從連接池中剔除,后續(xù)請求不會再發(fā)送到故障的節(jié)點中;
- 服務(wù)發(fā)現(xiàn),假如新的服務(wù)節(jié)點s4上線,c7和c8連接建立,會被加入到連接池中來,后續(xù)請求會發(fā)送到新增的節(jié)點中;
動態(tài)刪除連接與新增連接,這就是動態(tài)連接池。
服務(wù)發(fā)現(xiàn),如何感知到新的節(jié)點s4上線呢?詳見《改了配置,不想重啟,怎么整?》。
二、負(fù)載均衡
采用輪詢的策略,逐個使用連接池中的連接,可以實現(xiàn)對下游服務(wù)訪問的負(fù)載均衡。
采用完全隨機的策略,也能實現(xiàn)負(fù)載均衡。
如上圖:
給每個連接一個相同的權(quán)重,取連接訪問下游時,采用一個隨機算法,落到哪個格子用哪個連接,還是上面的例子:
- n = random() % 6 + 1;
當(dāng)
- n=[1,2],訪問s1;
- n=[3,4],訪問s2;
- n=[5,6],訪問s3;
3個區(qū)間的寬度相同,即落到某個服務(wù)的概率相等,負(fù)載是均衡的。
那么,如果服務(wù)節(jié)點的服務(wù)能力有差異,有的處理能力強,有的處理能力弱,怎么辦呢?
三、靜態(tài)權(quán)重負(fù)載均衡
如上圖:
給每個服務(wù)配置一個不同的權(quán)重,連接池初始化時,不同服務(wù)的區(qū)間大小有差異,取連接訪問下游時,落到某個格子的概率也會有差異:
- n = random() % 16 + 1;
當(dāng)
- n=[1,2],訪問s1;
- n=[3,6],訪問s2;
- n=[7,16],訪問s3;
3個區(qū)間的寬度與服務(wù)的權(quán)重成正比,即落到某個服務(wù)的概率等同權(quán)重。
畫外音:nginx就支持這么玩,但靜態(tài)權(quán)重實在太粗暴了。
那么,如果服務(wù)節(jié)點的服務(wù)能力有差異,但又很難用靜態(tài)權(quán)重標(biāo)識,怎么辦呢?
四、動態(tài)權(quán)重負(fù)載均衡
如上圖:連接池初始化時,為連接分配一個動態(tài)的權(quán)重。
畫外音:服務(wù)不再需要配置了。
仍按照之前的方法分配負(fù)載,只是:
- 連接處理超時,動態(tài)權(quán)重下降;
- 連接處理成功,動態(tài)權(quán)重上升;
更具體的細(xì)節(jié),詳見《異構(gòu)服務(wù)器的負(fù)載均衡,怎么設(shè)計?》。
如此一來,就能夠根據(jù)服務(wù)的實際處理能力分配負(fù)載了,是不是有點意思?
故障轉(zhuǎn)移,服務(wù)發(fā)現(xiàn),負(fù)載均衡,靜態(tài)權(quán)重/動態(tài)權(quán)重負(fù)載均衡,你有收獲嗎?
【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】