本文來自微信公眾號“twt企業(yè)IT社區(qū)”,作者/汪照輝,中國銀河證券架構(gòu)師,專注于容器云、微服務(wù)、DevOps、數(shù)據(jù)治理、數(shù)字化轉(zhuǎn)型等領(lǐng)域,對相關(guān)技術(shù)有獨特的理解和見解。擅長于軟件規(guī)劃和設(shè)計,提出的“平臺融合”的觀點越來越得到認同和事實證明。發(fā)表了眾多技術(shù)文章探討容器平臺建設(shè)、微服務(wù)技術(shù)、DevOps、數(shù)字化轉(zhuǎn)型、數(shù)據(jù)治理、中臺建設(shè)等內(nèi)容,受到了廣泛關(guān)注和肯定。
橫看成嶺側(cè)成峰,遠近高低各不同。
不同的視角得出的結(jié)論可能是不同的,所以概念也總是層出不窮。在討論一個問題的時候,往往會涉及很多的方面的概念和知識,一些概念是相似的、相互關(guān)聯(lián)的、甚至是重疊的。理解這些概念之間的關(guān)系和聯(lián)系,有助于我們更好的探討和解決遇到的實際問題。
SRE與系統(tǒng)可靠性
SRE是Google為解決Web系統(tǒng)的可靠性而組建的工程師團隊。所以SRE首先是工程師,重點關(guān)注的是可靠性,運維的是分布式系統(tǒng)上的業(yè)務(wù)服務(wù)。SRE實踐給我們很多新的啟示,它提供了一種協(xié)調(diào)研發(fā)和運維關(guān)系的方法,通過軟件工程的方法讓運維人員熟悉開發(fā)流程和業(yè)務(wù)服務(wù)邏輯、平臺工具,了解軟件系統(tǒng)的優(yōu)勢和弱點,從而有的放矢地去通過工程化、自動化等方法增強分布式業(yè)務(wù)服務(wù)的可靠性,以及平臺工具的可靠性等等。它和DevOps方法論的目的是一致的。
系統(tǒng)可靠性代表著系統(tǒng)平穩(wěn)運行不中斷和良好用戶體驗的程度??煽啃愿邉t用戶體驗就好。提升系統(tǒng)可靠性的方法很多,比如說高可用部署、容錯機制、健康自檢查、自恢復等。而實際往往需要通過多種機制協(xié)調(diào)配合才能更好的滿足實際可靠性的要求。單體系統(tǒng)高可靠性容易實現(xiàn),但分布式系統(tǒng)的可靠性就取決于很多相互關(guān)聯(lián)的組件。一個分布式系統(tǒng)的可靠性往往又取決于其依賴的資源和系統(tǒng)。比如說,支撐運行的服務(wù)器、數(shù)據(jù)中心、電路系統(tǒng),甚至是數(shù)據(jù)中心制冷系統(tǒng)等等。每一個點的故障都可能會帶來依賴其的系統(tǒng)的異常,因此需要通過不同層次和節(jié)點的多種高可用、備份、容錯等機制來提升可靠性。SRE通過軟件工程的方式來提升分布式應(yīng)用的可靠性,不但以實現(xiàn)自動化工具來提升效率,更從整體上考慮,消除了很多不可靠的因素。
可靠性計算通常是一個時間比值,也就是正常運行時間和總運行時間的比值。而韌性更多是考慮對不穩(wěn)定性的容忍能力和容忍程度,是個區(qū)間值?;煦绻こ痰哪康木褪且鲃犹綔y出某一條件下某一組件、系統(tǒng)、服務(wù)等的韌性的區(qū)間范圍,從而形成知識庫,為系統(tǒng)故障預警、智能化運維和運營提供支持。所以,有些人也稱混沌工程為韌性工程。
可靠性工程和韌性工程
工程化思想通常是解決復雜的事情。隨著分布式系統(tǒng)越來越龐大,彼此間的依賴關(guān)系越來越復雜,某一點的可靠性措施無法滿足龐大系統(tǒng)的整體可靠性,所以需要以系統(tǒng)工程的思想來考慮分布式復雜系統(tǒng)的可靠性舉措,從而發(fā)展成為可靠性工程的概念??煽啃圆粌H僅包括運行時的可靠性,也包括設(shè)計、架構(gòu)、研發(fā)、制造、管理等方面的可靠性。作為一個系統(tǒng)來說,特別一個擁有眾多組件的復雜系統(tǒng),其中軟硬設(shè)備彼此之間可能都是相關(guān)的,因此要使整個系統(tǒng)可靠,就得使每一個組件可靠。
將可靠性提升到工程的角度,一方面說明其重要性,另一方面也說明其復雜性。SRE采用軟件工程的方法來提升系統(tǒng)的可靠性,通過對軟件生命周期整個過程的協(xié)調(diào),以自動化的平臺和工具支撐研發(fā)和運維的協(xié)作,減少相互之間的依賴和耦合性,同時提升工作效率和正確度。
可靠性和韌性的追求都是應(yīng)對系統(tǒng)運行中不確定性狀況的能力。不過兩個概念關(guān)注點不一樣,可靠性偏外在的舉措來提升,韌性則強調(diào)系統(tǒng)內(nèi)在的能力。韌性工程就是不斷的探索系統(tǒng)的脆弱點并通過消除這些脆弱點來提升系統(tǒng)的韌性。一個系統(tǒng)的可靠性不能純粹靠外部的舉措,很多時候引入的組件越多,系統(tǒng)越復雜,脆弱點可能越多,不穩(wěn)定性反而越高,因此需要盡可能通過改善并增強系統(tǒng)內(nèi)部的韌性來提升穩(wěn)定性和可靠性。這其實也就是混沌工程的重要價值所在。
但對大部分運維人員來說,最期待的是不變更,別天天那么多發(fā)布。這和研發(fā)敏捷變更的追求是矛盾的。立場不同,責任不同,所以也帶來的利益和關(guān)注點不一樣。不變更正常運行的系統(tǒng),理論上這對運維人員來說是成本最小利益最大的方式。因為任何的變動都會帶來意外情況,都可能導致系統(tǒng)異常或不可用,會給運維人員帶來麻煩、工作量和績效差評,所以運維人員對應(yīng)用系統(tǒng)的發(fā)布上線有來自內(nèi)心天然的排斥感。人天生就有趨利避害的意識,這是人性。工程化的思想也將利益相關(guān)的人員納入其中,滿足彼此的利益關(guān)切,才能更好的促進目標的實現(xiàn)。
可靠性工程關(guān)注的是整個生命周期的過程中可能對可靠性帶來影響的各種因素。比如說,軟件架構(gòu)(包括設(shè)計架構(gòu)和部署架構(gòu))、代碼質(zhì)量、異常處理邏輯、故障恢復能力等。所以說軟件本身的可靠性是基礎(chǔ),然后才能通過其他手段來提升其可靠性。故障自恢復的目的是減少人為操作,盡可能實現(xiàn)自動化,一是提升了效率,二是減少了手工命令輸出錯誤。這也是SRE所要求的。從而也可以說,運維的敏捷才能支撐研發(fā)的敏捷。自服務(wù)敏捷基礎(chǔ)設(shè)施是支撐研發(fā)敏捷的基礎(chǔ)能力。
不折騰是系統(tǒng)穩(wěn)定性的保障之一,但一旦出現(xiàn)問題,往往也會措手不及,所以它和混沌工程主動去探索系統(tǒng)不穩(wěn)定的因為是相反的,所以需要演練。很多人也提倡混沌工程來提升系統(tǒng)可靠性和韌性,它也是增強認知從而更好應(yīng)對不確定性的很好的舉措。
應(yīng)對變化和混沌工程
不過系統(tǒng)運行是動態(tài)變化的,特別數(shù)字化時代,敏捷應(yīng)對變化是必需的能力,所以通常需要能動態(tài)的應(yīng)對這些變化。對于任何一個系統(tǒng)來說,其可用的資源都是有限的。比如說,磁盤存儲資源,如果應(yīng)用系統(tǒng)的日志大小和數(shù)量沒有限制,早晚會導致磁盤資源耗盡而使應(yīng)用系統(tǒng)進程異常。但通常應(yīng)用系統(tǒng)運維人員并不參與系統(tǒng)的設(shè)計和研發(fā),可能不了解日志文件大小和數(shù)量是否進行了限制,所以需要對這些內(nèi)容進行監(jiān)控和分析,找到可能會導致系統(tǒng)異常的一些點,然后采取措施消除這些可能會導致系統(tǒng)異常的點,從而也就提升了系統(tǒng)的可靠性和穩(wěn)定性。要具備應(yīng)對變化的能力,就需要對環(huán)境和系統(tǒng)運行狀況能夠有所了解,或者有深入的了解,知其然更知其所以然,才能做到敏捷應(yīng)對。
混沌,指的是一種模糊不清的狀態(tài)。和一片清明、知其所以然正好相反?;煦绻こ桃龅木褪菍⒁黄煦绲臓顟B(tài)探索為一片清明,所以混沌工程重要的是知識的積累,知識庫的建立就非常有必要而且非常重要。用已知的知識探索未知的領(lǐng)域,逐步對系統(tǒng)的內(nèi)外有清晰的認識。探索過程中有時候是很難控制影響范圍的,因為對當前的環(huán)境和狀態(tài)是未知的,因為未知,所以才需要探索,但因為未知,也就難以知道哪里有陷進、哪里是懸崖,犯錯甚至犧牲都是有可能的。
不管概念怎么變化,核心的內(nèi)容其實還是那么多。結(jié)合不同的概念有時候可能更好地、全面地理解這些內(nèi)容。同樣,在進行系統(tǒng)建設(shè)時,也需要結(jié)合不同的概念和系統(tǒng),來從全局考慮和把握,避免重復的建設(shè)和低效的集成。數(shù)字化時代,重要的時要具備全局的思想、敏捷的思維和隨時隨地隨需的響應(yīng)能力。