數據火器庫 - 八卦系列之借老槍談可靠性

[來源:云數據庫技術](https://mp.weixin.qq.com/s?__biz=MzkxODMzMjk1Ng==&mid=2247487303&idx=1&sn=a552a61fcc9d393ae0bb189e1cebfc32&chksm=c1b3bc34f6c43522ecd69739d1a86259a3644ccc44a187bf186f5800b3ef12c8e39620df1bd8&token=1649046408&lang=zh_CN#rd)

**數據庫打工仔喃喃自語的八卦**

1. 老槍:Db2/z和可靠性\

2. K.I.S.S (Keep it Simple, Stupid!)\

3. 系統驗證和測試:豬肉出廠的質檢章

## 數據庫的可靠性

\

## 1、數據庫里的老槍 - Db2 for zOS

上次聊了瑞士軍刀SQLite, 從年紀上SQLite出生于大數據和手機時代之前,對比后來的大數據引擎和云原生數據庫,SQLite可謂個頭不大,輩分不小了。不過數據庫的爺爺輩應該算是79年的Oracle和83年的Db2/z(z又叫mainframe,國內稱主機)。今天用這把老槍講講可靠性。

系統RAS(Reliability, availability and serviceability)概念最早是由IBM提出,來形容曾經是神一樣存在的主機(也叫大機,mainframe)。為什么說神一樣的存在呢?主機是第一批商用計算機,1950出現,活躍至今,最新(本文原稿為2022.1)版本為2019.9月的z15。最早的一批商用數據庫就包括主機上的DB2/z(1983年GA v2.3)。也許你從沒有聽說過,但是如果你每一天在消費,過程中,不論銀行卡,支付寶,微信都會最終走到銀聯,而且很可能是工農建交等大銀行,那么你的交易就是在主機上完成和記錄的。

2021年的AWS Re:Invest有一個session, 講AWS Mainframe Modernization; 2022年初某公告《8.38 億元、中國銀行單一來源采購:IBM z15主機》?也可見一斑。

**神在我們身邊默默的存在,不打擾一片云彩**

我們談論數據庫的可靠性時候,籠統的時候會泛指RAS,大部分時候單指Reliability。

**可靠性Reliability**

數據庫系統無故障可以持續運行的能力。MTBF(Mean Time Between Failure)/MTTF(Mean Time to Faillure),MTTR(Mean Time to Repair/Recover)。這些都是工業界通用的衡量標準。具體計算公式大家自己去Google/wiki。這里盜個圖湊數。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/088b116bedfc4420927a336c7430b1c1~tplv-k3u1fbpfcp-zoom-1.image)

## 2、如何保證可靠性

教科書里有很多,架構設計的書也可以輕而易舉的找到。本文既然是八卦篇,就只分享現實世界的事情。那些理論上支撐的功能,原則上不會宕機的架構設計不是這里的重點

怎么能不犯錯?do nothing;?

要保證軟件不出bug? 一行不寫。

如果不得不code呢?可靠方面先思考這兩項。

**2.1?核心代碼的復雜度**

架構設計有個說法K.I.S.S(Keep it Simple, Stupid!)。其實系統軟件的核心code, 揚名天下立萬的骨架,也就那么幾萬行,完成系統80%的工作,換句話說,系統連續運行過程中每小時(甚至每分鐘)都必然運行的code logic。這些code中簡潔易懂是系統存活的關鍵。

簡潔可減少系統的bug。MySQL依賴最簡單可靠的nest-loop join算法二十多年,而"先進"的Hash Join是在最近兩年才實現,在MySQL8.0.18正式GA。從算法復雜度看(兩個都有改進版本),Nest Loop J是O(MN), Hash J是O(M+N)。Hash join 在教科書里屬于advance的章節,直接翻譯是“進步”,褒義詞。可是另一方面,幾乎所有的advance技術都更復雜(電車是個反例,降維打擊了),需要更多或更特殊的資源才能發揮其能力。Hash Join就需要在大內存支持下才能發揮,否則要么OOM,要么落盤造成性能斷崖,尤其不適合高并發的TP場景。比如各位同學中午在食堂買飯,就是高并發場景,如果系統中突然出現一個大查詢把內存都吃掉,也把各位的飯就吃掉了。

如何解決這個問題呢?workload management(WLM) 就要被引入,以自動調低“爛”query的優先級,限制其資源。而又引入進一步的系統復雜度。

nest loop保證了每個join的內存空間消耗是固定的,所以在上面場景中,不用WLM,不用系統DBA也可以保證各位吃上午飯。

給我自己頂個鍋蓋保護一下,絕沒有想引戰NLJ vs HJ的意思,PG有比較完整成熟的優化器,就好很多。靠,又跑題到MySQL vs PG 了。只是想說,如果一個系統可以簡單化,就可以減少其bug數,增加可靠性。

有興趣研究軟件工程的東西,可以看看Unix philosophy。哲學的事情咱不懂,用數據說話,第一版Unix據稱是不到5千行的匯編語言;linux 0.0.1版是10243 line of code(C) 和386LoC(匯編)。多年前,我參與系統軟件項目排期的時候,是按1.5KLoC/Person-Year 做的計劃。所以偶爾聽說系統開發同學談績效的時候提一年幾萬行代碼,還經常是早春二三月份提交的,兄弟我怕呀。前端同學代碼量會多些,不過這些代碼的生命力會差些。其實我認為衡量一個開發的代碼能力不應簡單的line of code, 更應該與服務年掛勾。

那么如果做到simple/簡單呢,上次八卦SQL的時候專注到**產品邊界**,就是要有節制,開發有明確的特點的產品,而不要試圖做大而全的產品。

#### 2.2 測試

測試經常在數據庫設計和實現過程中被忽略,尤其在相對不成熟的開發團隊中 只做簡單的功能測試,甚至是單邏輯flow,而不考慮邊界條件。更談不上系統壓力測試(system stress testing),比如說連接數/concurrency突然提升情況下,是否還能夠保證吞吐量和延時保持著正常水平,后面的任務可以排隊,而不會因為高壓力下造成系統完全不可用。

**寫code就會有bug, 越早發現fix的成本約少**。軟件工程中這張圖是1996的文章。每每在前線客戶反饋一個簡單的bug, 我腦海里就是這張圖和16000美刀

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d80dd8ff472847fe9d8400f8e446521c~tplv-k3u1fbpfcp-zoom-1.image)

鄙視鏈那都有,軟件開發也不例外,常常一方面說測試多么重要,一方面測試工程師的工資級別屬于末端集結號。自然沒有牛人過來投入。這是全球普世的,而某些團隊尤甚。尤其是近些年,開始學Agile,學開源,甚至不設測試崗位。殊不知,開源社區最注重測試,測試代碼量常常是產品代碼的3X。筆者有幸十年前在HBase社區打醬油,很是佩服一個健康社區對代碼質量的管理。而當時的主席Stack,自號HBase Janitor(清潔工),最重要的工作就是QA。

上次提到的SQLite, 每一行code對應600行測試程序。“Due to its reliability, SQLite is often used in mission-critical applications such as flight software“

試問你所在的團隊,能否保證測試程序LOC與開發程序LOC是1:1的關系?產品發布時最后的否決權,是否在測試手里?

豬肉出廠還要蓋個質檢章呢。如果客戶現場發現了一個bug, 你的團隊的復盤時,是否能確認這個bug**應該**在軟件工程的那個環節被發現?

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9fb60a781b2a4e92ab8c3fc3cf3ec9c0~tplv-k3u1fbpfcp-zoom-1.image)

## 3、總結

一個系統的可靠性(其實是系統的各個方面了)是從三方面完成的:

**3.1 系統的架構設計**

對于大部分軟件工程師這一點上不需要太重視, 為什么呢?因為像數據庫有歷史以來,它的基本架構就那么幾種(single-node/monolithic, shared-storage/everything, shared-nothing), 架構帶來的優勢和劣勢已經被無數學術論文討論和工業系統驗證過。我們99.9%是在前人肩膀上討生活,在高手腳邊打醬油。

**3.2 系統的實現**

也就是code的工程能力。同樣打個桌子,朱由校(明熹宗)很可以超越我周邊所有的朋友。同樣實現一個hash join, 其實現算法至少從最早的relation model和關系幾何就有了。隨便找一篇三十年前的吧,An Adaptive Hash Join Algorithm for Multiuser Environments。

開發實現的好壞要看工程能力和工匠精神了。如果有理論就能沖出亞洲,中國男足也不會這樣。這樣就是軟件開發工程化的問題。如何使團隊更有效的開發,要對功能有節制,明確產品的邊界,求精而不求全。

**3.3 系統的驗證**

上邊專門提到,也是最容易被忽視的。大家常常會提到雙活(active-active),兩地三中心, 跨城分布, 高可用,多少個九。這些高大上的詞我也常常用, 有時候認真一點,我去請問這些系統能力是如何驗證通過的?高興的時候我會再多問點直擊靈魂的,**W H W**(who 誰測的,how 怎么測的,what 那些場景被測了?)。比如簡單的雙活, 用什么樣的workload(W:R 比例?),多大數據量, 連續跑了多長時間,P95延時是多少?

\

## 4、一點思考

當一個軟件架構師用呵護培養兒女的心寫code的時候,她/他就不會為三個月的短期目標commit code,讓孩子長歪了,比如"My"SQL和“Maria”DB。

做正確的事情是很難的,筆者在壓力下往repo里扔的爛code估計不比其他人少。"I always knew what the right path was. ....It was too damn hard." (聞香識女人)。做正確的事情太他媽難!

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1faeaa89df424685bdf528dcc864a1e8~tplv-k3u1fbpfcp-zoom-1.image)

## 5、注

**傳奇老頭莫辛納甘:** 對應火器庫,可以對應古董級數據庫,可能就是 Mosin–Nagant 傳奇老頭莫辛納甘。

**原始稿** :本文原稿為2022.1,故部分內容非最新信息

**信息來源?:** 由于平臺對應引用鏈接的限制,無法準確標注信息來源。羅列所有相關網絡材料如下:

[AWS Mainframe Modernization](https://aws.amazon.com/about-aws/whats-new/2021/11/introducing-aws-mainframe-modernization/)

8.38 億元、中國銀行單一來源采購:IBM z15主機,[參考](https://mp.weixin.qq.com/s/tESsQr1w_-hzkj9YZ5Wthg)

[Nest Loop J](https://en.wikipedia.org/wiki/Nested_loop_join)

[Hash J] (https://en.wikipedia.org/wiki/Hash_join)https://en.wikipedia.org/wiki/Hash_join

[An Adaptive Hash Join Algorithm for Multiuser Environments](http://www.vldb.org/conf/1990/P186.PDF)

聞香識女人https://baike.baidu.com/item/聞香識女人/6354

MTBF?https://en.wikipedia.org/wiki/Mean_time_between_failures

Data Processing Division, International Business Machines Corp., 1970 (1970). "Data processor, Issues 13-17". - "The dependability [...] experienced by other System/370 users is the result of a strategy based on RAS (Reliability-Availability-Serviceability) - citication copy from wiki

[https://en.wikipedia.org/wiki/Mosin%E2%80%93Nagant](https://en.wikipedia.org/wiki/Mosin%E2%80%93Nagant)

**立即點擊關注,獲取更多精彩內容~**

[玖章算術葉正盛揭秘《云計算的下半場》的技術看點|紅杉Talk](https://page.om.qq.com/page/OfoBI_gvOhQYSALqMVR2DREw0)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容