前言
關于軟件的高可用,是一個老生常談的話題?!案呖捎眯浴保℉igh Availability)通常來描述一個系統(tǒng)經(jīng)過專門的設計,從而減少停工時間,而保持其服務的高度可用性。其計算公式是:可用率=(總時間-不可用時間)/總時間。
本文重點從落地實踐的視角作為切入點,帶領大家從協(xié)作效率,技術(shù)落地和運營規(guī)范幾個方面來展現(xiàn)高可用的實施步驟和落地細節(jié)。為了方便理解,先來統(tǒng)一語言話術(shù),看一下軟件交付過程中的各個階段,如下圖:
為什么說軟件的高可用會面臨著諸多挑戰(zhàn)呢?
從需求交付鏈路來看,要完成目標交付,需要產(chǎn)品,研發(fā),測試,運維,運營等多方利益相關者的密切配合。有些項目需求,合作者有時能夠達到上百人,每個人職責分工各不相同,但卻相互配合依賴,任何一個環(huán)節(jié)出現(xiàn)紕漏,可用率就有可能受到影響;
從時間角度來看,如果要達到全年99.99%的可用率,就意味著一年當中,允許有故障的時間為:365*24*60*(100%-99.99%)=52分鐘,如果要達到5個9的可用率,允許故障的時間僅為5分鐘,這差不多是我們發(fā)現(xiàn)問題后,重啟應用的耗時;
從迭代效率來看,不迭代,不上線,問題出現(xiàn)的概率一定會小很多。軟件的迭代效率和可用率之間存在著負相關的關系,平衡好兩者之間的關系,也會面臨著不小的挑戰(zhàn)。
總結(jié)一下,我們具體面臨的問題如下:
如何解決需求交付相關協(xié)作者多,鏈路長的問題?
如何應對故障時間容忍度低的問題?
如何在頻繁需求迭代的現(xiàn)狀下,保持可用率不受到大的沖擊問題?
協(xié)作效率保障
01認知誤區(qū)
從整個需求交付鏈路我們可以發(fā)現(xiàn),隨著鏈路的逐級遞增,信息的傳遞鏈路分支就會越多,傳遞層級就會越深。這會導致兩個問題:
1.信息傳遞效率降低;
2.信息準確性變差。
這兩個問題最終導致的結(jié)果,就是協(xié)作效率的降低。
一個沒有實戰(zhàn)經(jīng)驗的同學往往會認為增加人數(shù),就會提高需求交付效率。其實這種想法不完全正確,具體關系參考下圖:
這就像蓋樓房,如果一個人按部就班的建設,需要100天完成。如果請了100個人來幫忙,能否用1天的時間完成房子建設呢?答案是否定的。
這里面有協(xié)作的成本,比如:團隊默契(設計師,瓦工,泥工,水電工),崗位匹配,風險控制;
這里面有流程的依賴,比如:施工依賴于設計,軟裝總在硬裝之后;
這里面有成本預算,比如:整個組織的人才梯度,規(guī)模大?。ǔ薪ǚ剑砩?,承包商);
以上這些,都不是簡單的通過人力鋪設來解決的。
02流程規(guī)范
提高協(xié)作效率的底層邏輯是通過減少交付鏈路層級,縮短信息傳遞鏈路,進而保證信息的準確性和傳遞效率。(組織建設層面的內(nèi)容這里不做展開)
這就要求具有今日事,今日畢的行動力。組織層面這叫流程規(guī)范,個人層面這叫做事方法,責任心。
盡量避免將當下的事情拖延到下一個環(huán)節(jié),否則就會影響后續(xù)鏈路的排期計劃和交付效率,極端情況甚至會出現(xiàn)返工的情形。簡言之,考慮清楚,不埋坑。產(chǎn)品需求對研發(fā),研發(fā)設計對測試,測試用例對產(chǎn)品等各個交付節(jié)點都是如此,交付物一定是靠譜的。
技術(shù)落地保障
在需求響應周期中,高質(zhì)量的落實架構(gòu)設計,編碼實現(xiàn),安全上線,部署運營等生產(chǎn)階段,是軟件高可用落地保障的前提和基礎。
01架構(gòu)設計
架構(gòu)設計往往影響著系統(tǒng)的前期實現(xiàn)成本(即ROI)和后續(xù)運維難度,屬于軟件的頂層設計,這里面既包含宏觀的設計方案,也包含落地細節(jié)里的范式約束。
流程保障
邀請架構(gòu)師參與:核心交易節(jié)點、重大需求改動邀請架構(gòu)師參與,這是閉坑最直接有效的方式;
重視設計文檔:方案描述清楚了,并取得相關利益者的認可,是走在正確道路上的前提。
設計保障
容災設計:要預留后路,提前想清楚,做好容災設計??苫貪L,可熔斷,可重試,可降級。
魯棒性設計:無狀態(tài)設計,防重設計,冪等設計,數(shù)據(jù)一致性設計
02編碼實現(xiàn)
如果說架構(gòu)設計是骨架,那么編碼實現(xiàn)就是神經(jīng),血管和肌肉。前者決定了能走多穩(wěn),走多久,后者決定著走多快,走多遠。落實到編碼層面,就是代碼的衰老腐敗程度。
流程規(guī)范
代碼評審機制:代碼評審不僅僅是發(fā)現(xiàn)系統(tǒng)中存在的問題這么簡單。它是一種長期行為,是進行組織文化貫徹和傳承的一種形式和載體。評審的過程中,明確了業(yè)務職責邊界,設計與編碼共識,優(yōu)秀的標準導向等研發(fā)共識。相當于通過具象化的案例,給出針對性的指導,這些都是保證團隊戰(zhàn)斗力的基石。
研發(fā)過程中的很多問題,通過代碼評審機制可以被發(fā)現(xiàn)和解決,比如:
如何對待臨時需求的設計與實現(xiàn)?
如何看待“Hello World!”的N中寫法?
如何理解設計模式和過度設計的邊界?
如何評價當前階段的交付物?
是否有必要引入單元測試?
代碼規(guī)范
有沒有對錯誤進行處理?對于調(diào)用的外部服務,是否檢查了返回值或處理了異常?
設計是否遵從已知的設計模式或項目中常用的模式?
開發(fā)者新寫的代碼能否用已有的SDK/Framework中的功能實現(xiàn)?在本項目中是否存在類似的功能可以調(diào)用而不用全部重新實現(xiàn)?
工程中是否引入了無用的,功能重復的,不同版本的jar包依賴?(json類庫,各種utils)
有沒有無用的代碼可以清除?
代碼可讀性如何?有沒有足夠的注釋?
參數(shù)傳遞有無錯誤,有沒有使用斷言(Assert)或判斷來保證我們認為不變的條件真的得到滿足?
邊界條件是如何處理的?switch語句的default分支是如何處理的?循環(huán)有沒有可能出現(xiàn)死循環(huán)?
對資源的利用,是在哪里申請,在哪里釋放的?有無可能存在資源泄漏(包括超時時間,內(nèi)存、文件、對象引用,大對象,線程數(shù)等)?有沒有優(yōu)化的空間?
代碼的效能如何?最壞的情況是怎樣的?
代碼中,特別是循環(huán)中是否有明顯可優(yōu)化的部分(string的操作是否能用StringBuilder來優(yōu)化)?
對于系統(tǒng)和網(wǎng)絡的調(diào)用是否會超時?如何處理?
代碼是否易于測試(方法行數(shù),圈復雜度,出入?yún)⒍x是否合理)?
改動是否影響到舊版本、歷史數(shù)據(jù)、上游能否兼容??接口設計是否有考慮冪等、并發(fā)、越權(quán),降級等問題?
是否存在緩存、數(shù)據(jù)庫性能問題以及多數(shù)據(jù)源數(shù)據(jù)一致性的問題?
上線方案是否考慮了灰度方案,數(shù)據(jù)狀態(tài)不一致問題?
03安全上線
線上70%的故障都是由某種變更而觸發(fā)的,其中相當一部分占比是不規(guī)范的上線引起的。所以安全上線這一環(huán)節(jié)至關重要。
流程規(guī)范
嚴禁頻繁上線:比如,每周不大于2次;
嚴禁高峰期上線:降低問題影響范圍;
嚴禁私自上線:有改動,必須通過測試驗證,產(chǎn)品回歸確認;
過程規(guī)范
摘流量:選擇第一批機器jsf下線/np摘流量(選為冷備);
看日志:觀察日志確認摘除機器無流量;
服務預熱:確認機器啟動成功,核心業(yè)務接口需要接口預熱;
掛流量:掛載上線機器流量;
看指標:觀察上線機器mdc指標是否異常(cpu、內(nèi)存、負載)、日志是否有異常。
04部署運營
實現(xiàn)高可用的一個很重要的手段就是能力冗余。下面給出方向和思路,具體落地細節(jié)和策略,可以根據(jù)具體情況各自延展。
網(wǎng)絡
運營商層面,聯(lián)通,電信,移動等;
鏈路節(jié)點方面,VIP,CDN,路由器/交換機,反向代理,客戶端,瀏覽器等;
存儲
無論是數(shù)據(jù)庫主從架構(gòu),還是ES的副本架構(gòu),都是實現(xiàn)存儲高可用的手段,重要數(shù)據(jù)要利用好相關特性;
在進行數(shù)據(jù)結(jié)構(gòu)設計時,同樣也需要做好分流策略,容量規(guī)劃,數(shù)據(jù)拆分或異構(gòu)。比如:避免緩存熱key,數(shù)據(jù)庫表吞吐量瓶頸,數(shù)據(jù)庫連接數(shù)限制等各種影響高可用的問題出現(xiàn)。
服務
橫向擴容:服務要保證可以通過添加資源的方式進行能力擴容,這一點非常重要;
服務分組:按照業(yè)務方或使用場景,對服務進行不同粒度的隔離,防止極端情況導致服務相互影響;
極限策略:主要是一些極端異常情況下的防御策略,目的是意外發(fā)生后,盡量保持服務的可靠性。比如:限流,熔斷,重試,快速失敗等;
灰度策略:新功能上線,往往是最容易出現(xiàn)問題的時候,擁有成熟的流量灰度能力,是控制問題影響范圍的關鍵;
運營規(guī)范保障
01運營規(guī)范
1.可監(jiān)控:系統(tǒng)運行狀況
2.可報警:異常情況能夠通知到系統(tǒng)相關人員
3.可定位:出現(xiàn)問題后,能夠快速定位問題原因
4.可修復:出現(xiàn)異常情況,能夠在第一時間進行問題修復;
02應急預案
高可用意味著對故障時間的容忍性差,意味著沒有時間進行故障排查和修復,更沒有時間打開代碼進行漏洞排查。這就要求我們有一套完備的應急預案,這套預案能夠解決大部分可預見的故障問題。
反詐在身邊
恢復生產(chǎn)第一;
排查問題第二;
詳細事故應急處理手冊,可以參照下圖:
過程規(guī)范
網(wǎng)絡,服務,存儲分三個維度制定對應方案,并將應急預案清單(文件名:checklist)填寫到自己的代碼庫中,保持內(nèi)容傳承和更新;
可預見性,即問題觸發(fā)場景要寫清楚。舉例:按照當前進度(1萬/天),隨著數(shù)據(jù)庫數(shù)據(jù)的增加,預計10個月后,數(shù)據(jù)庫表(xxx表名)會出現(xiàn)慢查詢;
可執(zhí)行性,能夠消除問題的解決方案。舉例:啟動歷史數(shù)據(jù)歸檔任務(xxxWorker),將歷史數(shù)據(jù)進行轉(zhuǎn)移到歸檔數(shù)據(jù)庫中;
03規(guī)范達標
再好的流程和規(guī)范都需要有對應的機制來貫徹執(zhí)行,否則就是鏡中花,水中月,看著美好,實則沒用??蓤?zhí)行,能度量,是按照目標變好的前提。所以這里給出一個《高可用達標定期自查表》的工具,輔助規(guī)范落地。
總結(jié)
本文從“高可用為什么存在著很大挑戰(zhàn)?”的問題展開探討,強調(diào)了需求交付過程中,協(xié)作效率的重要性,并指出了為什么要遵從“今日事,今日畢”的工作原則。又從架構(gòu)設計,編碼實現(xiàn),安全上線,部署運營等幾個方面,詳細介紹了技術(shù)落地保障相關的指導規(guī)范和落地細節(jié)。最后又從上線后運營的角度,給出了應急預案三板斧,規(guī)范達標定期自查表等比較實用的運營保障工具。希望能夠給讀者帶來幫助。
-
信息
+關注
關注
0文章
405瀏覽量
35503 -
軟件
+關注
關注
69文章
4707瀏覽量
87091
原文標題:軟件高可用實踐那些事兒
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論