新聞中心
背景?
當監(jiān)控平臺發(fā)現(xiàn)流量突增,業(yè)務(wù)系統(tǒng)應(yīng)用或鏈路監(jiān)控出現(xiàn)一定范圍的告警,此時我們查看問題的方向為:

創(chuàng)新互聯(lián)主營松陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),松陽h5微信小程序定制開發(fā)搭建,松陽網(wǎng)站營銷推廣歡迎松陽等地區(qū)企業(yè)咨詢
- 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)壓力過大的場景,需要進行橫向擴容的方向來講解。
需求?
當應(yīng)用系統(tǒng)壓力過大,除了臨時調(diào)整線程數(shù)或直接橫向擴容來解決外,更深入的優(yōu)化代碼以及調(diào)用鏈路上的耗時接口就更加滯后了。因此我們決定通過應(yīng)用橫向擴容來應(yīng)對系統(tǒng)壓力過大,此時實現(xiàn)如何快速擴容就成了我們重點關(guān)注的問題。
傳統(tǒng)架構(gòu)下,對于應(yīng)用橫向擴容我們需要做的重點步驟如下:
- 閑置的服務(wù)器資源;
- 系統(tǒng)標準化部署步驟(應(yīng)用發(fā)布、標準目錄、配置發(fā)布、應(yīng)用啟動);
- 應(yīng)用啟動自動健康檢查;
- 應(yīng)用啟動后自動接入負載均衡或注冊中心;
- 應(yīng)用橫向擴容后同步到系統(tǒng)監(jiān)控平臺;
- CMDB資產(chǎn)同步添加到對應(yīng)業(yè)務(wù)分組;
- 應(yīng)用服務(wù)器同步至堡壘機;
以上是新的應(yīng)用服務(wù)器上線在運維管理過程中流轉(zhuǎn)涉及的各個主要環(huán)節(jié),除了提前準備閑置的服務(wù)器資源以節(jié)省不必要的時間外,其他都是需要根據(jù)我們系統(tǒng)架構(gòu)及運維平臺的實際情況去適配,我這里只是提供了一個思路。
假設(shè),一套比較主流的架構(gòu)為:
- CMDB,基礎(chǔ)設(shè)施統(tǒng)一納管
- Zabbix監(jiān)控,統(tǒng)一的健康檢查
- JumpServer堡壘機,服務(wù)器統(tǒng)一登錄管理
- Spring Cloud 框架
- Eureka注冊中心
- Apollo配置中心
解決方案?
在此我們通過??Pipeline支撐運維自動化??的思想來實現(xiàn)應(yīng)用橫向擴容,以流水線的形式編排不同級別的原子模塊來實現(xiàn)不同運維場景的功能需求。
根據(jù)系統(tǒng)架構(gòu),應(yīng)用橫向擴容流水線的實現(xiàn)涉及的功能模塊上圖中已經(jīng)標注出來,其中:
- CMDB+事件推送網(wǎng)關(guān),可通過CMDB對空閑服務(wù)器資源分配觸發(fā)資產(chǎn)在Zabbix監(jiān)控和堡壘中自動同步;
- 基礎(chǔ)組件安裝,實現(xiàn)了Java環(huán)境包括標準部署目錄、JDK環(huán)境、管理腳本等內(nèi)容的自動配置;
當然我們默認空閑服務(wù)器已經(jīng)是按操作系統(tǒng)初始化(配置初始化、標準用戶、等保安全基線)交付的,因此我們在此沒有過多介紹。 - Apollo配置中心級原子模塊,實現(xiàn)應(yīng)用的配置發(fā)布;
- 系統(tǒng)監(jiān)控級原子模塊,擴容后應(yīng)用的健康檢查同步添加到監(jiān)控平臺;
具體實現(xiàn)?
1.構(gòu)建?
我們只需輸入應(yīng)用名、新應(yīng)用IP、版本號,就可以實現(xiàn)應(yīng)用的橫向擴容,但是目前只支持逐臺擴容,還不能批量橫向擴容。
2.構(gòu)建結(jié)果?
通過對流水線的stage的時間統(tǒng)計,應(yīng)用擴容耗主要為版本發(fā)布過程中的啟動時間。
3.Pipeline?
@Library('shared-library') _
pipeline {
agent any
options {
timestamps()
}
stages {
stage('基礎(chǔ)組件初始化') {
steps {
script {
build job: 'init_system', parameters: [text(name: 'HOST_IP', value: "${HOST}"), string(name: 'PLAYBOOK', value: 'software_install.yml'), string(name: 'TAG', value: 'java,filebeat')]
}
}
}
stage('應(yīng)用初始化') {
steps {
script {
java_deploy.InitApp("${APP_NAME}")
}
}
}
stage('拉取Yunweiconfig配置') {
steps {
script {
java_deploy.PullFromYunweiconfig("${APP_NAME}")
}
}
}
stage('從制品庫拉取包文件') {
steps {
script {
java_deploy.PullFromArtifactory("${APP_NAME}", "${VERSION}")
}
}
}
stage('apollo更新') {
steps {
script {
apollo.ApolloDeploy("${APP_NAME}")
}
}
}
stage('版本發(fā)布') {
steps {
script {
app_port = apollo.ApolloGetPort("${APP_NAME}")
java_deploy.DeployApp("${APP_NAME}", "${VERSION}", "${HOST}")
ip_port = "${HOST}" + ':' + "${app_port}"
//健康檢查
java_deploy.HealthCheck("${ip_port}")
}
}
}
stage('添加zabbix健康檢查 ') {
steps {
script {
app_prot = apollo.ApolloGetPort("${APP_NAME}")
//println("test pass")
println("${app_prot},${HOST}")
ip_port = "${HOST}" + ':' + "${app_prot}"
build job: 'zabbix_newalert', parameters: [string(name: 'APP_NAME', value: "${APP_NAME}"), string(name: 'IP_PORT', value: ""), string(name: 'HTTP_URL', value: "${ip_port}")]
}
}
}
}
}
PK容器?
彈性伸縮相對于傳統(tǒng)架構(gòu),操作系統(tǒng)CPU、內(nèi)存資源閾值的粒度太粗,無法精確地進行適時擴容;另外對于批量擴容,需要提前準備好資源,相對于容器的解決方案還是不夠靈活。
啟動時間無論是容器還是傳統(tǒng)架構(gòu),限制快速擴容的主要原因在于應(yīng)用的啟動時間,這方面要提前進行優(yōu)化。
IP地址分配傳統(tǒng)架構(gòu)無法做到IP地址的自動分配,在生產(chǎn)環(huán)境使用DHCP不僅會導(dǎo)致keepalived切換產(chǎn)生腦裂,還會因租期問題產(chǎn)生其他問題。而云原生架構(gòu)的可以做到自定義IP池,因此后續(xù)擴容會使用IP池中的地址。
以上幾點是通過本次對應(yīng)用自動橫向擴容,與容器使用過程中的幾點對比,印象比較深刻。
總結(jié)?
本次PK,傳統(tǒng)架構(gòu)雖然輸了,但也并不是一敗涂地。至少讓我發(fā)現(xiàn)只要細心,堅持標準化、原子化、場景化的原則,我們還是有很大空間可以提升的。容器給了我們目標和方向,剩下就要看我們自己了
新聞標題:輸了:傳統(tǒng)架構(gòu)應(yīng)用快速橫向擴容PK容器!
標題鏈接:http://www.dlmjj.cn/article/ccspdgc.html


咨詢
建站咨詢
