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