輸了:傳統(tǒng)架構(gòu)應(yīng)用快速橫向擴(kuò)容PK容器!
背景?
當(dāng)監(jiān)控平臺(tái)發(fā)現(xiàn)流量突增,業(yè)務(wù)系統(tǒng)應(yīng)用或鏈路監(jiān)控出現(xiàn)一定范圍的告警,此時(shí)我們查看問題的方向?yàn)椋?/p>
- APP或網(wǎng)站是否被攻擊了,如DDOS、CC、暴力破解等;
- 合作推廣帶來的業(yè)務(wù)流量增高,應(yīng)用系統(tǒng)壓力過大;
- 數(shù)據(jù)庫是否出現(xiàn)因連接數(shù)滿、事務(wù)死鎖導(dǎo)致壓力過大;
以上幾種情況都是我們在處理生產(chǎn)故障過程中比較常見的, 本次我們就應(yīng)用系統(tǒng)壓力過大的場景,需要進(jìn)行橫向擴(kuò)容的方向來講解。
需求?
當(dāng)應(yīng)用系統(tǒng)壓力過大,除了臨時(shí)調(diào)整線程數(shù)或直接橫向擴(kuò)容來解決外,更深入的優(yōu)化代碼以及調(diào)用鏈路上的耗時(shí)接口就更加滯后了。因此我們決定通過應(yīng)用橫向擴(kuò)容來應(yīng)對(duì)系統(tǒng)壓力過大,此時(shí)實(shí)現(xiàn)如何快速擴(kuò)容就成了我們重點(diǎn)關(guān)注的問題。
傳統(tǒng)架構(gòu)下,對(duì)于應(yīng)用橫向擴(kuò)容我們需要做的重點(diǎn)步驟如下:
- 閑置的服務(wù)器資源;
- 系統(tǒng)標(biāo)準(zhǔn)化部署步驟(應(yīng)用發(fā)布、標(biāo)準(zhǔn)目錄、配置發(fā)布、應(yīng)用啟動(dòng));
- 應(yīng)用啟動(dòng)自動(dòng)健康檢查;
- 應(yīng)用啟動(dòng)后自動(dòng)接入負(fù)載均衡或注冊中心;
- 應(yīng)用橫向擴(kuò)容后同步到系統(tǒng)監(jiān)控平臺(tái);
- CMDB資產(chǎn)同步添加到對(duì)應(yīng)業(yè)務(wù)分組;
- 應(yīng)用服務(wù)器同步至堡壘機(jī);
以上是新的應(yīng)用服務(wù)器上線在運(yùn)維管理過程中流轉(zhuǎn)涉及的各個(gè)主要環(huán)節(jié),除了提前準(zhǔn)備閑置的服務(wù)器資源以節(jié)省不必要的時(shí)間外,其他都是需要根據(jù)我們系統(tǒng)架構(gòu)及運(yùn)維平臺(tái)的實(shí)際情況去適配,我這里只是提供了一個(gè)思路。
假設(shè),一套比較主流的架構(gòu)為:
- CMDB,基礎(chǔ)設(shè)施統(tǒng)一納管
- Zabbix監(jiān)控,統(tǒng)一的健康檢查
- JumpServer堡壘機(jī),服務(wù)器統(tǒng)一登錄管理
- Spring Cloud 框架
- Eureka注冊中心
- Apollo配置中心
解決方案?
在此我們通過??Pipeline支撐運(yùn)維自動(dòng)化?
?的思想來實(shí)現(xiàn)應(yīng)用橫向擴(kuò)容,以流水線的形式編排不同級(jí)別的原子模塊來實(shí)現(xiàn)不同運(yùn)維場景的功能需求。
根據(jù)系統(tǒng)架構(gòu),應(yīng)用橫向擴(kuò)容流水線的實(shí)現(xiàn)涉及的功能模塊上圖中已經(jīng)標(biāo)注出來,其中:
- CMDB+事件推送網(wǎng)關(guān),可通過CMDB對(duì)空閑服務(wù)器資源分配觸發(fā)資產(chǎn)在Zabbix監(jiān)控和堡壘中自動(dòng)同步;
- 基礎(chǔ)組件安裝,實(shí)現(xiàn)了Java環(huán)境包括標(biāo)準(zhǔn)部署目錄、JDK環(huán)境、管理腳本等內(nèi)容的自動(dòng)配置;
當(dāng)然我們默認(rèn)空閑服務(wù)器已經(jīng)是按操作系統(tǒng)初始化(配置初始化、標(biāo)準(zhǔn)用戶、等保安全基線)交付的,因此我們在此沒有過多介紹。 - Apollo配置中心級(jí)原子模塊,實(shí)現(xiàn)應(yīng)用的配置發(fā)布;
- 系統(tǒng)監(jiān)控級(jí)原子模塊,擴(kuò)容后應(yīng)用的健康檢查同步添加到監(jiān)控平臺(tái);
具體實(shí)現(xiàn)?
1.構(gòu)建?
我們只需輸入應(yīng)用名、新應(yīng)用IP、版本號(hào),就可以實(shí)現(xiàn)應(yīng)用的橫向擴(kuò)容,但是目前只支持逐臺(tái)擴(kuò)容,還不能批量橫向擴(kuò)容。
2.構(gòu)建結(jié)果?
通過對(duì)流水線的stage的時(shí)間統(tǒng)計(jì),應(yīng)用擴(kuò)容耗主要為版本發(fā)布過程中的啟動(dòng)時(shí)間。
3.Pipeline?
PK容器?
彈性伸縮相對(duì)于傳統(tǒng)架構(gòu),操作系統(tǒng)CPU、內(nèi)存資源閾值的粒度太粗,無法精確地進(jìn)行適時(shí)擴(kuò)容;另外對(duì)于批量擴(kuò)容,需要提前準(zhǔn)備好資源,相對(duì)于容器的解決方案還是不夠靈活。
啟動(dòng)時(shí)間無論是容器還是傳統(tǒng)架構(gòu),限制快速擴(kuò)容的主要原因在于應(yīng)用的啟動(dòng)時(shí)間,這方面要提前進(jìn)行優(yōu)化。
IP地址分配傳統(tǒng)架構(gòu)無法做到IP地址的自動(dòng)分配,在生產(chǎn)環(huán)境使用DHCP不僅會(huì)導(dǎo)致keepalived切換產(chǎn)生腦裂,還會(huì)因租期問題產(chǎn)生其他問題。而云原生架構(gòu)的可以做到自定義IP池,因此后續(xù)擴(kuò)容會(huì)使用IP池中的地址。
以上幾點(diǎn)是通過本次對(duì)應(yīng)用自動(dòng)橫向擴(kuò)容,與容器使用過程中的幾點(diǎn)對(duì)比,印象比較深刻。
總結(jié)?
本次PK,傳統(tǒng)架構(gòu)雖然輸了,但也并不是一敗涂地。至少讓我發(fā)現(xiàn)只要細(xì)心,堅(jiān)持標(biāo)準(zhǔn)化、原子化、場景化的原則,我們還是有很大空間可以提升的。容器給了我們目標(biāo)和方向,剩下就要看我們自己了