穩(wěn)定性與高可用保障的工作思路
作者 | 字恒
來源 | 阿里技術(shù)公眾號
一 深入理解穩(wěn)定性與高可用性
穩(wěn)定性與高可用性是老生常談的兩個(gè)詞。憑借經(jīng)驗(yàn)和感受我們知道,提高系統(tǒng)的這兩項(xiàng)指標(biāo),系統(tǒng)會(huì)更加健康,產(chǎn)品也會(huì)有更好的用戶體驗(yàn)。但是如果要給穩(wěn)定性和高可用性下一個(gè)定義該如何表述?穩(wěn)定性和高可用性這二者又有何區(qū)別和聯(lián)系?我認(rèn)為首先要理解好這兩個(gè)問題,才能夠設(shè)定清晰的目標(biāo),系統(tǒng)地制定完整可行的方案。
在維基百科上搜索穩(wěn)定性,定義如下:
穩(wěn)定性是數(shù)學(xué)或工程上的用語,判別一系統(tǒng)在有界的輸入是否也產(chǎn)生有界的輸出。若是,稱系統(tǒng)為穩(wěn)定;若否,則稱系統(tǒng)為不穩(wěn)定。
再看看高可用性的:
高可用性(英語:high availability,縮寫為 HA),IT術(shù)語,指系統(tǒng)無中斷地執(zhí)行其功能的能力,代表系統(tǒng)的可用性程度。是進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)的準(zhǔn)則之一。高可用性系統(tǒng)與構(gòu)成該系統(tǒng)的各個(gè)組件相比可以更長時(shí)間運(yùn)行。
首先從穩(wěn)定性的定義中提煉出關(guān)鍵的詞語 -- 系統(tǒng)、輸入、輸出。在螞蟻當(dāng)下的技術(shù)架構(gòu)中,可以把一個(gè)應(yīng)用當(dāng)做系統(tǒng),應(yīng)用之間的服務(wù)請求為輸入,服務(wù)響應(yīng)為輸出,當(dāng)服務(wù)響應(yīng)符合預(yù)期時(shí)認(rèn)為應(yīng)用系統(tǒng)是穩(wěn)定的。當(dāng)他們相互組合形成一個(gè)更大的系統(tǒng),作為業(yè)務(wù)產(chǎn)品對用戶表達(dá)時(shí),用戶的請求作為輸入,產(chǎn)品的表達(dá)作為輸出,當(dāng)產(chǎn)品功能正常運(yùn)行時(shí)可以認(rèn)為產(chǎn)品系統(tǒng)是穩(wěn)定的。綜上,關(guān)于穩(wěn)定性的定義我們可以總結(jié)歸納為 -- 當(dāng)系統(tǒng)接收輸入后,能夠產(chǎn)生正確的、符合預(yù)期的輸出,稱系統(tǒng)為穩(wěn)定;否則,稱系統(tǒng)為不穩(wěn)定。
再回到命題上,為什么叫穩(wěn)定性保障?能不能換一個(gè)說法叫提高穩(wěn)定性?通過上文的定義我們可以總結(jié)出,穩(wěn)定性描述的是系統(tǒng)的行為。一個(gè)系統(tǒng)是否穩(wěn)定,就像我們評價(jià)一個(gè)人是否健康一樣,很難用陳述的方式進(jìn)行完整的描述,去量化。但是卻可以通過否定的方式進(jìn)行快速地判斷。人們通過良好的飲食和生活習(xí)慣來減少疾病的發(fā)生,保持身體的健康。保障系統(tǒng)的穩(wěn)定性或者說提高系統(tǒng)的穩(wěn)定性也是如此,我們需要通過各種方法來避免那些不穩(wěn)定的情況發(fā)生。所謂的更穩(wěn)定,客觀上并不存在,是主觀上希望避免或者減少不穩(wěn)定的情況發(fā)生。
與穩(wěn)定性不同,可用性是一個(gè)可以量化的指標(biāo),計(jì)算的公式在維基百科中是這樣描述的:
根據(jù)系統(tǒng)損害、無法使用的時(shí)間,以及由無法運(yùn)作恢復(fù)到可運(yùn)作狀況的時(shí)間,與系統(tǒng)總運(yùn)作時(shí)間的比較。
我們經(jīng)常聽到的3個(gè)9(99.9%),4個(gè)9(99.99%)度量的就是系統(tǒng)的可用性,高可用就是要保證系統(tǒng)的這個(gè)指標(biāo)維持在一個(gè)高水平。在公式的定義描述中,將系統(tǒng)的運(yùn)行時(shí)間分成了三個(gè)部分
- 系統(tǒng)正常運(yùn)作的時(shí)間,即系統(tǒng)處于穩(wěn)定狀態(tài)的時(shí)間。
- 系統(tǒng)損害、無法使用的時(shí)間,即系統(tǒng)處于非穩(wěn)定狀態(tài)的時(shí)間。
- 系統(tǒng)由無法運(yùn)作恢復(fù)到可運(yùn)作狀況的時(shí)間,即系統(tǒng)由非穩(wěn)定狀態(tài)恢復(fù)到穩(wěn)定狀態(tài)的時(shí)間。
系統(tǒng)的可用性和系統(tǒng)的穩(wěn)定性是成正相關(guān)的。不過在現(xiàn)實(shí)生活中,系統(tǒng)是不可能永遠(yuǎn)處于穩(wěn)定狀態(tài)。逆向思考,將上述的公式進(jìn)行轉(zhuǎn)換,更有利于我們進(jìn)行分析:
至此,本次命題的目標(biāo),KPI就清晰了。保障系統(tǒng)的穩(wěn)定性和高可用的目標(biāo)是使系統(tǒng)處于穩(wěn)定的工作狀態(tài),對用戶不產(chǎn)生負(fù)面的影響,避免線上問題和P級故障的發(fā)生。核心kpi是系統(tǒng)的可用性。為了提高系統(tǒng)的可用性,我們應(yīng)該首先保障系統(tǒng)的穩(wěn)定性,減少非穩(wěn)定狀況的發(fā)生,其次當(dāng)系統(tǒng)由于各個(gè)組成部分發(fā)生故障,出現(xiàn)非穩(wěn)定狀態(tài)時(shí),能夠快速發(fā)現(xiàn)并將其恢復(fù)到穩(wěn)定可用的狀態(tài)。
二 穩(wěn)定性與高可用保障的核心思路
通過上文的推演,針對提高系統(tǒng)可用性這一目標(biāo),我們能夠得到兩個(gè)基本的解題思路。按圖索驥,為了解決問題,首要的任務(wù)是發(fā)現(xiàn)和定義問題。因此為了提高系統(tǒng)的穩(wěn)定性,我們先列舉應(yīng)用系統(tǒng)中常見的非穩(wěn)定的情況,再一一對癥下藥:
- 功能:應(yīng)用程序執(zhí)行的功能出現(xiàn)錯(cuò)誤,不符合預(yù)期。
- 容量:當(dāng)系統(tǒng)接收的請求數(shù)量增加時(shí),應(yīng)用程序無法正常處理,出現(xiàn)異常或超時(shí),導(dǎo)致服務(wù)失效。
- 安全:當(dāng)系統(tǒng)接收到的沒有授權(quán)的或者惡意攻擊的請求時(shí),應(yīng)用程序出現(xiàn)異常甚至服務(wù)失效。
- 容錯(cuò):對于用戶錯(cuò)誤的使用方式, 應(yīng)用程序無法合適地處理。
當(dāng)上述情況發(fā)生時(shí),就意味著系統(tǒng)處于不穩(wěn)定的狀態(tài),需要我們能夠及時(shí)發(fā)現(xiàn)并進(jìn)行處理。而造成這些問題的原因,在軟件系統(tǒng)中通??梢詺w結(jié)為以下三類:
- 人為故障:在開發(fā)軟件的各個(gè)環(huán)節(jié)中思考不充分,或者執(zhí)行時(shí)粗心導(dǎo)致的各類問題。
- 硬件故障:網(wǎng)絡(luò)不通,硬盤空間不夠,內(nèi)存崩潰等。
- 軟件故障:線程池異常,JVM異常,中間件或其他依賴的應(yīng)用服務(wù)異常。
對于一個(gè)動(dòng)態(tài)演進(jìn)的系統(tǒng)而言,我們沒有辦法將故障發(fā)生的概率降為0,只能通過在軟件生產(chǎn)的過程中,建立流程規(guī)范和機(jī)制來盡量減少其發(fā)生。其次對于一個(gè)運(yùn)行的系統(tǒng),我們需要建立并完善監(jiān)控和預(yù)警機(jī)制來及時(shí)發(fā)現(xiàn)系統(tǒng)中的故障,并通過執(zhí)行預(yù)案使系統(tǒng)快速恢復(fù)?;谏鲜鼋Y(jié)論,為了提高系統(tǒng)的可用性,需要從以下三個(gè)方面入手開展工作:故障預(yù)防,故障發(fā)現(xiàn)和故障恢復(fù)。
人犯錯(cuò)的幾率是遠(yuǎn)遠(yuǎn)大于機(jī)器的,因此故障預(yù)防最重要的是建立一套機(jī)制,在團(tuán)隊(duì)內(nèi)達(dá)成共識并持續(xù)按照此流程開展研發(fā)工作,從而減少個(gè)人因素(思考、執(zhí)行、狀態(tài)等方面)對系統(tǒng)穩(wěn)定性的影響。而故障發(fā)現(xiàn)以及故障恢復(fù),則是需要通過系統(tǒng)監(jiān)控和應(yīng)急方案來快速發(fā)現(xiàn)系統(tǒng)異常并恢復(fù),從而盡量減輕故障的影響面。下面以螞蟻日常的產(chǎn)品研發(fā)流程為例,從功能、容量、安全、容錯(cuò)這4個(gè)核心要素出發(fā),給出一套方案僅供參考。
1 研發(fā)規(guī)范
-
設(shè)計(jì)階段
- 團(tuán)隊(duì)細(xì)分文檔模板
- 高可用設(shè)計(jì)規(guī)范
-
編碼階段
- 代碼規(guī)范
1.通用代碼規(guī)范
2.工程結(jié)構(gòu)規(guī)范 -
單測覆蓋率
- 單測通過率
- 代碼覆蓋率
- 日志規(guī)范
- 安全漏洞修復(fù)規(guī)范
-
發(fā)布階段
- 變更規(guī)范:三板斧
2 容量保障
-
容量評估
- 機(jī)器容量
- DB容量
- 緩存容量
- 壓測摸底
- 限流方案
- 降級方案
3 監(jiān)控告警
- 日志規(guī)范
-
監(jiān)控梳理
- 應(yīng)用基礎(chǔ)監(jiān)控
- 網(wǎng)關(guān)監(jiān)控
- 服務(wù)監(jiān)控
- 業(yè)務(wù)監(jiān)控
- 限流監(jiān)控
- 告警規(guī)范
- 數(shù)據(jù)核對
4 應(yīng)急快反
-
日常預(yù)案
- 硬件異常預(yù)案
- 中間件異常預(yù)案
- 業(yè)務(wù)異常預(yù)案
- 大促預(yù)案
- 預(yù)案執(zhí)行規(guī)范
三 總結(jié)
如何做好穩(wěn)定性和高可用保障是一個(gè)很龐大的命題,其中的任一小部分內(nèi)容在內(nèi)網(wǎng)都可以搜到大量的文章。寫這篇文章的目的是總結(jié)一下自己對穩(wěn)定性和高可用保障工作的理解,給大家分享一套系統(tǒng)的框架思路。希望大家在讀后能夠更全面的了解安全生產(chǎn),不陷于細(xì)節(jié)。
彈性計(jì)算基礎(chǔ)知識
彈性計(jì)算是把計(jì)算力變成普惠的公共資源,讓不同體量的用戶任何時(shí)候都能用親民的價(jià)格享受到高可用、高性能、高效率的基礎(chǔ)IT計(jì)算服務(wù),所以可以說彈性是云計(jì)算的核心能力。本課程對彈性的重要性、彈性的定義、阿里云如何做彈性等。