在《這多年來我一直在鑽研的技術》這篇文章中,我講述了一下,我這麼多年來一直在關注的技術領域,其中我屢次提到了工業級的軟件,我還覺得有不少人會問我怎麼定義工業級?以及一個高可用性的軟件系統應該要怎麼幹出來?這樣我也能夠瓜熟蒂落的寫下這篇文章,可是沒有人問,那麼,我只好厚顏無恥的本身寫下這篇文章了。哈哈。html
另外,我在一些討論高可用系統的地方看到你們只討論各個公司的技術方案,其實,高可用的系統並不簡單的是技術方案,一個高可用的系統其實還包括不少別的東西,因此,我以爲你們對高可用的系統瞭解的還不全面,爲了讓你們的認識更全面,因此,我寫下這篇文章。mysql
首先,咱們須要理解什麼是高可用,英文叫High Availability(Wikipedia詞條),基本上來講,就是要讓咱們的計算環境(包括軟硬件)作到full-time的可用性。在設計上通常來講,須要作好以下的設計:web
聽起彷佛很簡單吧,然而不是,細節之處全是魔鬼,冗餘結點最大的難題就是對於有狀態的結點的數據複製和數據一致性的保證(無狀態結點的冗餘相對比較簡單)。冗餘數據所帶來的一致性問題是魔鬼中的魔鬼:sql
因此,不少高可用系統都是在作各類取捨,這須要比對着業務的特色來的,好比銀行帳號的餘額是一個狀態型的數據,那麼,冗餘時就必需作到強一致性,再好比說,訂單記錄屬於追加性的數據,那麼在failover的時候,就能夠到備機上進行追加,這樣就比較簡單了(阿里目前所謂的異地雙活其實根本作不到狀態型數據的雙活)。shell
下面,總結一下高可用的設計原理:數據庫
我在《分佈式系統的事務處理》中引用過下面這個圖:這個圖來自來自:Google App Engine的co-founder Ryan Barrett在2009年的Google I/O上的演講《Transaction Across DataCenter》(視頻: http://www.youtube.com/watch?v=srOgpXECblk)緩存
這個圖基本上來講是目前高可用系統中能看獲得的全部的解決方案的基礎了。M/S、MM實現起來不難,可是會有不少問題,2PC的問題就是性能不行,而Paxos的問題就是太複雜,實現難度太大。安全
總結一下各個高可用方案的的問題:網絡
注:這是軟件方面的方案。固然,也可使用造價比較高的硬件解決方案,不過本文不涉及硬件解決方案。架構
另外,現今開源軟件中,不少緩存,消息中間件或數據庫都有持久化和Replication的設計,從而也都有高可用解決方案,可是開源軟件通常都沒有比較高的SLA,因此,若是咱們使用開源軟件的話,須要注意這一點。
下面,咱們來看一下MySQL的高可用的方案的SLA(下圖下面紅色的標識表示了這個方案有幾個9):
圖片來源:MySQL High Availability Solutions
簡單解釋一下MySQL的這幾個方案(主要是想表達一個越多的9就越複雜)
那麼,這些2個9,3個9,4個9,5個9是什麼意思呢?又是怎麼來的呢?請往下看。
上面那些都不是本文的重點,本文的重點如今開始,如何測量系統的高可用性。固然是SLA,全稱Service Level Agrement,也就是有幾個9的高可用性。
工業界有兩種方法來測量SLA,
但大多數都採用第一種方法,也就是故障發生到恢復的時間,也就是服務不可用的時間,以下表所示:
系統可用性% | 宕機時間/年 | 宕機時間/月 | 宕機時間/周 | 宕機時間/天 |
---|---|---|---|---|
90% (1個9) | 36.5 天 | 72 小時 | 16.8 小時 | 2.4 小時 |
99% (2個9) | 3.65 天 | 7.20 小時 | 1.68 小時 | 14.4 分 |
99.9% (3個9) | 8.76 小時 | 43.8 分 | 10.1 分鐘 | 1.44 分 |
99.99% (4個9) | 52.56 分 | 4.38 分 | 1.01 分鐘 | 8.66 秒 |
99.999% (5個9) | 5.26 分 | 25.9 秒 | 6.05 秒 | 0.87 秒 |
好比,99.999%的可用性,一年只能有5分半鐘的服務不可用。感受很難作到吧。
就算是3個9的可用性,一個月的宕機時間也只有40多分鐘,看看那些設計和編碼不認真的團隊,把全部的指望寄託在人肉處理故障的運維團隊, 一個故障就能處理1個多小時甚至2-3個小時,連個自動化的工具都沒有,還好意思在官網上聲明本身的SLA是3個9或是5個9,這不是欺騙大衆嗎?。
老實說,咱們很難計算咱們設計的系統有多少的可用性,由於影響一個系統的因素實在是太多了,除了軟件設計,還有硬件,還有每三方的服務(如電信聯通的寬帶SLA),固然包括「建築施工隊的挖掘機」。因此,正如SLA的定義,這不只僅只是一個技術指標,而是一種服務提供商和用戶之間的contract或契約。這種工業級的玩法,就像飛機同樣,並非把飛機造出來就行了,還有大量的無比專業的配套設施、工具、流程、管理和運營。
簡而言之,SLA的幾個9就是能持續提供可用服務的級別,不過,工業界中,會把服務不可用的因素分紅兩種:一種是有計劃的,一種是無計劃的。
下圖來自Oracle的 《High Availability Concepts and Best Practices》
下圖來自Oracle的 《High Availability Concepts and Best Practices》
咱們能夠看到,上面的宕機緣由包括以下:
無計劃的
有計劃的
從上面這些會影響高可用的SLA的因素,你看到了什麼?若是你仍是隻看到了技術方面或是軟件設計的東西,那麼你只看到了冰山一角。咱們再仔細想想,那個5個9的SLA在一年內只能是5分鐘的不可用時間,5分鐘啊,若是按一年只出1次故障,你也得在五分鐘內恢復故障,讓咱們想一想,這意味着什麼?
若是你沒有一套科學的牛逼的軟件工程的管理,沒有牛逼先進的自動化的運維工具,沒有技術能力很牛逼的工程師團隊,怎麼可能出現高可用的系統啊。
是的,要幹出高可用的系統,這TMD就是一套嚴謹科學的工程管理,其中包括但不限於了:
深層交的東西則是——對工程這門科學的尊重:
因此,之後有人在你面前提升可用,你要看的不是他的技術設計,而還要看看他們的工程能力,看看他們公司是否真正的尊重工程這門科學。
有好些非技術甚至技術人員和我說過,作個APP作個網站,不就是找幾個碼農過來寫寫代碼嘛。等系統不可用的時候,他們纔會明白,要找技術能力比較強的人,可是,就算你和他們講一萬遍道理,他們也很難會明白寫代碼怎麼就是一種工程了,而工程怎麼就成了一門科學了。其實,不少作技術的人都不明白這個道理。
包括不少技術人員也永遠不會理解,爲何要作好多像Code Review、自動化運維、自動化測試、持續集成之類這樣很無聊的東西。就像我在《從Code Review 談如何作技術》中提到的,阿里不少的工程師,架構師/專家,甚至資深架構師都沒有這個意識,固然,這不怪他們,由於經歷決定思惟方式,他們的經歷的是民用級的系統,作的都是堆功能的工做,的確不須要。
看完這些,最後讓咱們都捫心自問一下,你還敢說你的系統是高可用的了麼? ;-)
(全文完)