海恩法則
德國人帕布斯·海恩提出一個在航空界關於飛行安全的法則: 每一起嚴重事故的背後,必然有29次輕微事故和300起未遂先兆以及1000起事故隱患,這個法則即是著名的海恩法則。猜想在飛行安全領域,海恩也是透過統計學的方法發現的這一法則,不然為什麼是1:29:300:1000 這樣的比例呢?
和海因裡希法則一樣,在其他領域的安全生產仍然有借鑒意義。我們來看2個案例,得以管窺一二。
東方網2016-11-25 09:15報道,截止11月24日早7時左右,江西省豐城市國電豐城電廠三期在建專案冷卻塔施工平橋弔倒塌,事故死亡人數已上升至67人。記者還發現,該公司近年曾發生多起工人死傷的安全事故。那麼,試問一家頻發安全事故的公司為何還在正常經營,每次事故發生後又做了哪些改進措施?
大眾日報於2012年曾報道過岱山縣一個蓄水18萬立方米的水庫突然潰壩,洪水瞬間沖毀村莊。當地已確認遇難10人,27人受傷。多名村民接受多家媒體採訪時反映,早在50天前,水庫已經出現裂縫漏水,村民向當地政府反映了不止一次,但一直沒人來修。有村民告訴記者,就在事發前一天,還有人去鎮政府反映情況。在8月7日,岱山縣三防指揮部在颱風“海葵”到來前還曾信誓旦旦地稱,岱山縣水利部門已對全縣水庫、山塘、海塘等水利設施進行了全面檢查,確保“危險水庫空庫執行”,“24小時值班,加密巡查頻率,對水庫安全執行情況進行密切監測,確保不因水利設施因素造成人員傷亡”。
別再用事故去驗證海恩法則了,沒有切實的措施或者防患於未然,或者對隱患的採取行動,發什麼誓都沒有用。“海恩法則”核心理論有二:一是事故的發生是量的積累的結果;二是再好的技術,再完美的規章,在實際操作層面,也無法取代人自身的素質和責任心。
回到軟體行業,海恩法則和海因裡希法則有非常好的指導意義。我們稍微回溯一下自己手頭髮生的,看到的,見到的系統故障,無不是因為所謂的簡單、低階問題到導致大故障。
程式碼複製之禍
小明看到張三的程式碼剛好是實現了他想要的功能,於是就複製過來使用了。不曾想,上線之後,訊息被張三負責的系統伺服器接收去了,因此複製程式碼未正確修改事件標識。同時,筆者也見過另外一個複製程式碼的案例,導致金額錯誤的膨脹到100倍,因為複製者把多個processor的順序搞反了,而讓程式碼實際執行超出預期。複製無小事,必須讓程式碼成為自己身體的一部分,足夠瞭解。這2個案例都有很多種方法去發現問題而不至於讓故障流入線上,質量防線一再失守,值得深思。除了可能的技能問題,態度和意識是首要問題。
未正確處理的傳回值或異常
一般公司的編碼規範都會涉及異常的正確處理問題。比如業務異常,系統重試;系統內部異常,傳回失敗;明確丟擲異常和空字串NULL的區別,明確丟擲異常和傳回數字0的區別等等。被呼叫方本應該丟擲異常,結果傳回了0,那麼呼叫則繼續按照正常的業務邏輯進行處理,就會發生超出預期的事情,比如本應扣款的賬戶卻未扣款而產生資損。
GITLAB誤刪除資料庫事件
前一段,Gitlab.com發生了一個大事,某同學誤刪了資料庫,這個事看似是個低階錯誤,不過,因為Gitlab披露了整個處理過程,還直播了恢復過程,因此可以學習到更多的內容。一個叫YP的同學在給Gitlab的線上資料庫做一些負載均衡的工作,在做這個工作時的時候突發了一個情況,Gitlab被DDoS攻擊,資料庫的使用飆高,在block完攻擊者的IP後,發現有個staging的資料庫(db2.staging)已經落後生產庫4GB的資料,於是YP同學在Fix這個staging庫的同步問題的時候,發現db2.staging有各種問題都和主庫無法同步,在這個時候,YP同學發現db2.staging都hang在那裡,無法同步,於是他想把db2.staging的資料庫刪除了,這樣全新啟動一個新的複製,結果呢,刪除資料庫的命令錯誤的敲在了生產環境上(db1.cluster),結果導致整個生產資料庫被誤刪除。更悲催的事情發生了,在恢復的過程中,他們發現只有db1.staging的資料庫可以用於恢復,而其它的5種備份機制都不可用。具體備份失敗的原因,按Gitlab在docs.google.com披露的原因,備份失敗原因如下,5種備份機製為:LVM快照、常規備份、自動同步、Azure備份、S3備份。
LVM快照在預設情況下每24小時做一次。在故障發生前大概6小時,YP正好手動運行了一次。
-
常規備份似乎也是每24小時做一次,不過YP還未能查清楚它們儲存在何處。據JN聲稱,這些似乎未奏效,只生成了幾個位元組大小的檔案。原因是pg_dump時效,PostgreSQL版本問題導致。
-
Azure備份失效:已為NFS伺服器啟用了Azure中的磁碟快照,但是沒有為資料庫伺服器啟用Azure中的磁碟快照。
-
一旦將資料同步到試執行環境,同步過程就消除Web勾子(webhook)。除非我們可以在過去的24小時內從常規備份中獲取這些資料,否則它們將丟失殆盡。
-
我們備份到S3的內容顯然也沒有奏效:儲存桶(bucket)空空如也。
-
複製程式很不可靠,容易出錯,依賴幾個隨機性的外殼指令碼,而且缺少完備的說明檔案。
具體的恢復過程先不追溯,但從5種備份機制都不可用就能發現巨大問題,不可用不是今天才發生的,而是長期以往就是如此。不可用的備份就是形同虛設。如何保障可用,如何衡量可用是生產備份過程中不得不做的事情。無獨有偶,銀行業必須做到的“兩地三中心”如何衡量單機房故障之後的可用性,或者部分業務的可用性,沒有全域性分析、制定應急措施、持續演練,兩地三中心在機房故障的時候無法發揮作用。
如圖所示,遊樂場的這根繩子是其保護作用的,相當於一道防線。但是如果不關註它的可用性,是要出問題的。
日本瑞穗證券公司經紀人操作失誤
2005年12月8日,日本瑞穗證券公司的一名經紀人在交易時出現重大操作失誤,引發投資者恐慌並導致證券類股票遭遇重挫,東京證券交易所陷入一片混亂。而瑞穗證券已經因為這一數字輸入錯誤在16分鐘之內蒙受了高達270億日元(約合18.5億人民幣)的損失,造成日本證券交易史上前所未有的重大事故。瑞穗證券公司一名經紀人接到一位客戶的委託,要求以61萬日元(約合4.19萬人民幣)的價格賣出1股J-Com公司的股票。
然而,這名交易員卻犯了個致命的錯誤,他把指令輸成了以每股1日元的價格賣出61萬股。這時操作屏上市場價格欄中出現了輸入有誤的警告,但由於這一警告經常出現,操盤手忽視警告繼續操作。隨後,東京證交所發現錯誤,電話通知瑞穗證券公司操盤手立即取消交易,但取消交易操作未能成功。
一個重大故障,僅僅是一個警告指令而不能中止交易釋出,是否正常?從海恩法則推導,一次重大故障會有N次小故障的暴露,那麼對於金融行業,比例關係會有新的定義,可能很少有小故障,行業的特殊性決定。
如果進一步分析,該案例涉及到瑞穗證券公司相關工作人員疏忽、東京證券交易所繫統存在缺陷且未能及時採取措施等問題。比如這樣一個數量和價格均異常的交易委託能夠順利進入交易所交易系統而未被拒絕,其原因是該系統對此沒有做前端檢查。從質量角度看,工作人員不出問題的質量防線相當脆弱,而第二道質量防線即系統前端檢查放棄,則無異於大門洞開,風險一直存在。
愛國者導彈誤差
在美伊戰爭期間,有一沙漠盾牌行動,美軍部署了愛國者導彈系統來攔截伊拉克的飛毛腿導彈。跟蹤愛國者導彈的軟體使用標的速度和當前時間,預測標的每一秒的位置。因為各種不同標的最大速度可能達到5馬赫,這些計算必須相當精確。不幸的是雷達定位軟體有一個致命缺陷,系統長時間執行之後,內部時間會不準,則影響對於標的物體的攔截,可能實際上標的物體進行了指定範圍的攻擊,但愛國者導彈系統發現不了,因為它鎖定的範圍是偏差的,此之謂差之毫釐謬以千里。
在2.26日這天,愛國者導彈系統運行了100個小時。當一枚伊拉克導彈鎖定美國在沙特達蘭的一處空軍機場發射導彈時,愛國者導彈系統監測到了這一切。但在這個時刻,其內部時間誤差達到0.34秒,所以當它嘗試計算導彈下一個位置時,竟然在搜尋偏離導彈實際位置半公里多的空域。系統立即斷定根本沒有敵方導彈,並取消了攔截。導彈行進到了其目的地,造成28名士兵死亡。
如下圖所示意,我們復盤一下事故的關鍵事件,看能有怎樣的發現。
首先明確愛國者雷達系統的工作原理,攔截敵方導彈包括搜尋、驗證、跟蹤三個環節。一旦要執行攔截動作,則有一個射程範圍,會在標的物體周圍炸裂為大約1000塊碎片,這些碎片會飛入標的物體的執行軌道,破壞標的物體。
我們用時間軸來描述一下關鍵資訊。其實早在事故前10幾天,就有反饋關於雷達系統缺陷的報告了,但是並未引起美國軍方的重視。
從上圖可以看到,美國軍方2.11有一次決策過程:認為愛國者導彈系統不會連續工作超過8小時,以色列軍方的發現的是偶然事件。我們對照一下“海恩法則”的核心理論:
-
事故的發生是量的積累的結果
-
再好的技術,再完美的規章,在實際操作層面,也無法取代人自身的素質和責任心
以色列軍方的發現是一次小事故的提示,可能以色列是在演習環境,未有重大後果。量的積累加上美國軍方責任心不夠,就導致了壞的結果。我們在軟體研發中容易忽略所謂的小機率事件,不能在事件出現苗頭的時候就扼殺,這和我們的責任心,意識有非常大的關係。衡量意識好不好的2個tips:1是以假設代替求證。比如我複製這段程式碼肯定是沒有問題的,在A系統已經執行很久了;備份複製執行良好,我完全有信心。2是能否見微知著。如果出現了異常,你假設為小機率事件,甚至說只有在某條件下才會出現而掉以輕心,則終可能釀成大禍。
意識和責任心為什麼這麼重要呢?
一是墨菲定律,你假設的小機率事件則外部條件發生變化的時候機率可能會大幅度增加。二是質量保障體系包括預防、監控、熔斷、修複等過程,不出錯是不可能的,也就是預防措施是最有效,成本最低的方式,但是又最難。更多的措施要透過監控,控制範圍,快速修複來解決。
同時,2.21日,愛國者專案組向美國軍方發出警告:愛國者導彈系統如果長時間工作,射程發生偏離,追蹤標的可能失敗。這裡有一個明顯的問題就是長時間是多長?同樣,軍方未引起重視,再次證明一個大事故的背後是因為持續多次的人的疏忽或者系統癥狀未得到重視而累積而成。
出處:技術瑣話(ID:TheoryPractice)
朋友會在“發現-看一看”看到你“在看”的內容