如果你去買一部手機(jī),你會(huì)考慮什么因素呢喜滨?一般我們都會(huì)首先考慮智能手機(jī)捉捅、照相功能、多大容量等虽风。而除了這些棒口,我們通常還會(huì)考慮品牌、顏色辜膝、外型好不好看无牵、時(shí)尚與否。作為一個(gè)軟件產(chǎn)品也不例外厂抖,用戶首先會(huì)期望系統(tǒng)要滿足正常的功能需求茎毁,同時(shí)系統(tǒng)還要滿足好用、性能好忱辅、穩(wěn)定可靠等其他特性七蜘。一般我們會(huì)把這些稱為非功能性需求或者跨功能性需求。系統(tǒng)的每一次故障和宕機(jī)對(duì)用戶都是不可忽視的損失墙懂,所以這些非功能性需求也是軟件質(zhì)量非常重要的屬性橡卤,是軟件架構(gòu)設(shè)計(jì)需要滿足的目標(biāo)。
在運(yùn)行時(shí)的非功能需求中损搬,我們常常會(huì)提到幾個(gè)詞有 Availability蒜魄、Stability和Reliability,即系統(tǒng)要高可用场躯、高可靠和穩(wěn)定谈为。那么可用、可靠還有穩(wěn)定是什么意思呢踢关?如何衡量伞鲫?它們之間又有什么區(qū)別?我經(jīng)常在不同場(chǎng)景下聽到這幾個(gè)詞的混用签舞。今天就先來(lái)談一談這幾個(gè)ability秕脓。
1. Availability 可用性
Availability defines the proportion of time that the system is functional and working. It can be measured as a percentage of the total system downtime over a predefined period. Availability will be affected by system errors, infrastructure problems, malicious attacks, and system load. - Microsoft Application Architecture Guide
可用性指系統(tǒng)在給定時(shí)間內(nèi)可以正常工作的概率柒瓣,通常用SLA指標(biāo)來(lái)表示,如下圖所示吠架。
墨菲定律說(shuō)“會(huì)出錯(cuò)的事總會(huì)出錯(cuò)”芙贫,可用性做到100是可望而不可及的。對(duì)于SLA指標(biāo)來(lái)說(shuō)傍药,9的數(shù)字越多可用性越高磺平,宕機(jī)時(shí)間越少,系統(tǒng)就可以在給定的時(shí)刻內(nèi)高比例地正常工作拐辽。然而對(duì)系統(tǒng)的挑戰(zhàn)就越大拣挪,投入的成本也會(huì)越高。 比如5個(gè)9要求系統(tǒng)每年只宕機(jī)5分鐘左右俱诸,而4個(gè)9要求每年宕機(jī)時(shí)間不超過(guò)一個(gè)小時(shí)菠劝。這就使得系統(tǒng)需要在設(shè)計(jì)、基礎(chǔ)設(shè)施睁搭、數(shù)據(jù)備份等不同層面采取多種方式赶诊,甚至增加基礎(chǔ)設(shè)施投資來(lái)保證可用性。
“當(dāng)你的設(shè)備處理人命關(guān)天的事情园骆,或業(yè)務(wù)中斷一分鐘就會(huì)損失百萬(wàn)美刀舔痪,那么你可以考慮99.99%的可靠性∮錾。” Robertson(Linux高可用項(xiàng)目開發(fā)者)
不同系統(tǒng)的可用性要求也是不同的辙喂,比如:淘寶捶牢、京東等這些電商系統(tǒng)用戶量很多鸠珠,不同區(qū)不同時(shí)刻都有大量的用戶在使用系統(tǒng),這必然對(duì)系統(tǒng)的可用性要求很高秋麸。據(jù)以往這些系統(tǒng)的故障統(tǒng)計(jì)和不準(zhǔn)確地測(cè)試數(shù)據(jù)推測(cè)渐排,它們目前的可用性是在3個(gè)9到4個(gè)9左右。相對(duì)而言灸蟆,企業(yè)類的工作軟件因?yàn)橥ǔV辉诠ぷ鲿r(shí)間被使用驯耻,或只在某些特定的地區(qū)使用,或只給某部分人某一特定時(shí)間使用炒考,可用性的需求就會(huì)低一些可缚。典型的系統(tǒng)就數(shù)salesforce了,經(jīng)常會(huì)看到“周末又要升級(jí)了”的提示斋枢。
影響可用性的因素有很多帘靡,包括系統(tǒng)故障、基礎(chǔ)設(shè)施故障瓤帚、數(shù)據(jù)故障描姚、安全攻擊涩赢、系統(tǒng)壓力等等。
2. Reliability 可靠性
Reliability is a measure of the probability that an item will perform its intended function for a specified interval under stated conditions.
可靠性是在給定的時(shí)間間隔和給定條件下轩勘,系統(tǒng)可以無(wú)故障持續(xù)運(yùn)行的概率筒扒。那么可靠性和可用性有什么區(qū)別呢?在《分布式系統(tǒng)原理與范型》中提到的下面例子中比較準(zhǔn)確的解釋了兩者的區(qū)別:
如果系統(tǒng)在每小時(shí)崩潰1ms绊寻,那么它的可用性就超過(guò)99.9999%花墩,但是它還是高度不可靠。與之類似榛斯,如果一個(gè)系統(tǒng)從來(lái)不崩潰观游,但是每年要停機(jī)兩星期,那么它是高度可靠的驮俗,但是可用性只有96%懂缕。
簡(jiǎn)而言之,可用性關(guān)注的是系統(tǒng)任何時(shí)刻可以持續(xù)正常工作的能力王凑,關(guān)注的是服務(wù)總體的持續(xù)時(shí)間搪柑。系統(tǒng)在給定時(shí)間內(nèi)總體的運(yùn)行時(shí)間越長(zhǎng),可用性越高索烹。而可靠性更關(guān)注系統(tǒng)可以無(wú)故障地持續(xù)運(yùn)行的概率工碾,關(guān)注的是故障率。故障的頻率越高百姓,可靠性越低渊额。可靠性差一定程度上是會(huì)影響可用性的垒拢,但反過(guò)來(lái)不一定成立旬迹。
這里面還有一些常用的指標(biāo)來(lái)衡量可用性和可靠性:
MTBF(Mean Time Between Failure)
即平均無(wú)故障時(shí)間,是指從新的產(chǎn)品在規(guī)定的工作環(huán)境條件下開始工作到出現(xiàn)第一個(gè)故障的時(shí)間的平均值求类。MTBF越長(zhǎng)表示可靠性越高奔垦,正確工作能力越強(qiáng) 。MTTR(Mean Time To Repair)
即平均修復(fù)時(shí)間尸疆。是指可修復(fù)產(chǎn)品的平均修復(fù)時(shí)間椿猎,就是從出現(xiàn)故障到修復(fù)中間的這段時(shí)間。MTTR越短表示易恢復(fù)性越好寿弱。MTTF(Mean Time To Failure)
即平均失效時(shí)間犯眠。系統(tǒng)平均能夠正常運(yùn)行多長(zhǎng)時(shí)間,才發(fā)生一次故障症革。系統(tǒng)的可靠性越高筐咧,平均無(wú)故障時(shí)間越長(zhǎng)。
基于以上指標(biāo)地沮,可用性可以如此計(jì)算:
Availability = UpTime/(UpTime+DownTime) = MTBF / (MTBF + MTTR)
作為系統(tǒng)的響應(yīng)嗜浮,首要目標(biāo)是先降低故障的次數(shù)羡亩,頻率要低,從而提高可靠性危融;同時(shí)在故障出現(xiàn)后畏铆,要提高故障的恢復(fù)時(shí)間,速度要快吉殃,從而提高業(yè)務(wù)的可用性辞居。
影響可靠性的因素就是能夠引起故障的所有因素,包括軟件設(shè)計(jì)錯(cuò)誤蛋勺,編碼錯(cuò)誤瓦灶,硬件故障等等。
3. Stability 穩(wěn)定性
Stability is about how many failures an application exhibits; whether that is manifested as unexpected or unintended behaviour, users receiving errors, or a catastrophic failure that brings a system down. The fewer failures that are observed the more stable an application is.
軟件的穩(wěn)定性抱完,指軟件在一個(gè)運(yùn)行周期內(nèi)贼陶、在一定的壓力條件下,在持續(xù)操作時(shí)間內(nèi)出錯(cuò)的概率巧娱,性能劣化趨勢(shì)等等碉怔。如果一個(gè)系統(tǒng)的故障率很高,它一定是高度不可靠的禁添,也一定是不穩(wěn)定的撮胧。那么如何區(qū)分穩(wěn)定性和可靠性呢?
對(duì)于電力系統(tǒng)而言老翘,穩(wěn)定性就是“人民用電不要忽明忽暗忽快忽慢”芹啥,可靠性就是”不要用著用著突然沒(méi)有啦“。-知乎盛夏白日夢(mèng)
如果一個(gè)系統(tǒng)的性能時(shí)好時(shí)壞铺峭,它一定是不穩(wěn)定的墓怀,而不一定是不可靠的。穩(wěn)定性更關(guān)注系統(tǒng)在給定條件下的響應(yīng)是否一致逛薇,行為是否穩(wěn)定捺疼∈璩妫可靠是可用的前提永罚,穩(wěn)定是可靠的進(jìn)一步提升。
今天在Stackoverflow看到這樣一段代碼來(lái)表示這兩個(gè)的區(qū)別卧秘,甚為有趣:
Reliable but unstable:
add(a,b):
if randomInt mod 5 == 0:
throw exception
else
print a+b
Stable but unreliable:
add(a,b):
if randomInt mod 5 == 0:
print a+a
else
print a+b
不知道寫到這里呢袱,你是否對(duì)可用性、可靠性和穩(wěn)定性有了更清晰的了解了呢翅敌?有了這些指標(biāo)可以幫助我們?nèi)シ治鱿到y(tǒng)存在的問(wèn)題羞福,比如說(shuō)故障頻率較高,故障恢復(fù)時(shí)間較長(zhǎng)蚯涮,那么系統(tǒng)的可靠性可用性一定很低治专,對(duì)用戶的影響一定很高卖陵,就可以促使我們?nèi)母鱾€(gè)角度去改進(jìn)和提高,去找架構(gòu)設(shè)計(jì)的問(wèn)題张峰,去找系統(tǒng)實(shí)現(xiàn)的缺陷泪蔫,去找依賴的基礎(chǔ)設(shè)施問(wèn)題等等,從而改善我們的系統(tǒng)喘批。尤其是在當(dāng)下復(fù)雜的分布式系統(tǒng)下撩荣,這些顯得尤為重要。
那么饶深,最后請(qǐng)問(wèn)我們常見的容錯(cuò)處理餐曹、藍(lán)綠部署、回滾敌厘、cluster台猴、災(zāi)備會(huì)有助于提高以上哪個(gè)ability呢?