GitHub Post-Incident Analysis

栏目: 数据库 · 发布时间: 4年前

内容简介:2018/10/21 GitHub 發生重大的異常,服務中斷超過 24h。事後官方釋出完整的事件分析報告,包含非常詳盡的事件過程、架構、應變等。這篇是我當時整理在 SRE 社群的簡譯,如同電影主要是例行性維運,網路短暫中斷,造成資料庫同步問題,產生一連串事件。其中最久的還是怎麼還原資料,不同資料中心資料同步以及同步過程要處理的問題。中間有遇到服務降級 (degrade)、網站反應變慢 (資料抄寫未完成)、非同步作業等問題 … 。

2018/10/21 GitHub 發生重大的異常,服務中斷超過 24h。事後官方釋出完整的事件分析報告,包含非常詳盡的事件過程、架構、應變等。這篇是我當時整理在 SRE 社群的簡譯, 原始連結

如同電影 薩利機長 ,SRE 應該要多閱讀 異常事件報告 ,從中學習應變的方法與經驗,同時也了解別人的 系統架構 為何如此設計,有什麼問題?

摘要

主要是例行性維運,網路短暫中斷,造成資料庫同步問題,產生一連串事件。其中最久的還是怎麼還原資料,不同資料中心資料同步以及同步過程要處理的問題。中間有遇到服務降級 (degrade)、網站反應變慢 (資料抄寫未完成)、非同步作業等問題 … 。

這個事件,讓 Github 整個組織認真思考 Site Reliability Engineering 的重要性。

事件時間軸

時間軸的摘要如下 (文長,沒照翻 …):

10/21 22:52 UTC

更換 100G 光纖設備的常規維護工作,導致 US East 海岸網路接口與 US East 資料中心短暫中斷 43 秒。這中斷的過程,原本在 US East 負責 Master DB 無法將資料同步到 US West 的資料中心。此時負責 管理 MySQL Cluster 的機制 ( Orchestrator ) 自動處理 failover,重導網路流量到 US West,也就是 Master 原本在 US East 改為 US West 資料中心。

Orchestrator 是 MySQL HA and Replication 的管理服務,他使用 Raft 一致演算法實作分區容錯與共識機制。

10/21 22:54 UTC (事件後兩分鐘)

內部監控系統監控到數個異常訊息,發出內部 Alert ,好幾位工程師進入處理狀態。23:02 (事件後 10 分鐘) 確認是 資料庫叢集的拓墣問題。

10/21 23:07 UTC (事件後 15 分)

Responding Team 決定手動暫停 (Lock) 所有部署程序,避免額外的問題。23:09 (事件後 17 分) Responding Team 把網站狀態燈調整成 黃燈 ,三分後 (23:11) #事故協調小組 加入,兩分鐘後決定調整狀態為 紅燈

10/21 23:13 UTC (事件後 21 分)

確認問題原因,Database Engineering Team 進來,主要研究有哪一些配置需要手動調整,讓 US East Database 重新配置成 Master ,同時要把 Cluster 的 Slave 從 US West 抄完,這段時間 US West 已經寫入 40 分鐘的資料了。此外,已經有一些資料寫入 US East ,但還沒被寫回 US West,這同時還要避免又從 US West 重新寫回 US East … (好亂啊 orz …)

10/21 23:19 UTC (事件後 27 分)

確認有一些 DB 查詢動作,像是 Push 要先暫停,研究過後決定執行部分的降級 (degrade),包含了 webhook delivery、GitHub Page Build。選擇的策略就是以資料完整性高於功能的易用性。

10/22 00:05 UTC (事件後 01h13m)

在 Incident Response Team 裡的工程師們,開始規劃 #解決資料不一致 以及 MySQL failover 的實踐。計畫是從備份還原資料、同步在兩個資料中心的副本資料、回到正常服務的資料庫拓墣架構、還原暫停在 Queue 裡的排程任務。這時候對外公告上述的 計畫

MySQL 每四個小時備份一次,這樣的資料存在公有雲好幾年了(沒寫哪朵雲)。資料回復的量有好幾個 TB,也就要花好幾個小時。主要的時間都花費在資料傳輸,做資料完整的檢查 (checksum, prepare, load, test …)。在這意外之前,我們從不需要重蓋整個資料庫叢集,和回覆整個資料。

10/22 00:41 UTC (事件後 01h49m)

還原程序開始執行,工程師監控執行程序。其他團隊開始研究如何加速還原。

10/22 06:51 UTC (事件後 07h59m)

US East 資料中心,好幾座資料庫叢集已經還原,然後開始從 US West 抄寫新資料回來。這會導致頁面讀取資料非常的慢,因為如果讀取新的資料 (US East 還沒有),那麼就要先等資料從 US West 寫回來之後,但這段資料傳輸是跨美西到美東的網路。

這時候團隊發現可以直接從 US West 資料中心還原資料,不會被下載的速度限制。同時可以利用 Replication 抄寫機制,這時候 對外公告還要兩小時 完成。

10/22 07:46 UTC (事件後 08h54m)

在 GitHub Blog 發佈一篇 異常公告訊息 ,說明異常原因是因為網路區段異常,造成資料不一致現象。為了確保資料完整性,暫停了部分功能和內部發佈程序。

10/22 11:12 UTC (事件後 12h20m)

Master 資料庫已經切回 US East,讓網站的響應速度變快,但是因為有部分的副本 (Slave) 還是落後幾個小時的資料,這個延遲造成使用者發現資料不一致。實際上副本寫入是非線性的,所以將讀取的請求分散到各個副本,讓資料慢慢一致。

寫入的負載程度會開始在歐洲和美洲的上班時間,所以還原花費的時間會比原本預估的還要長

10/22 13:15 UTC (事件後 14h23m)

這是 Github.com 流量尖峰,網站的回應速度變慢。事件回應小組針對這個狀況持續討論。事件之前已經決定在 US East 公有雲上增加副本。只要這些機器就緒,就可以提供更多服務。

10/22 16:24 UTC (事件後 17h32m)

一但複本同步完成,將執行故障移轉回到原本的拓墣架構,解決延遲和可用性問題。當我們還在處理這些資料的時候,覺得資料完整性優先,所以保持服務為 紅燈

10/22 16:45 UTC (事件後 17h53m)

到這個時間,已經完成恢復,提升回應,服務幾乎 100% 恢復。但是還有五百萬的 hook 事件、八萬的 Page 建置在 Queue 裡。開始處理這些資料,約有 20 萬的 webhook 因為 TTL 過期了,所以我們找出了這些 event,條整 TTL 重新執行。

為了避免這個問題,未來會先進入 degrated 狀態,確認服務恢復了,在開始啟動這些 event 處理的程序,確保系統效能不被影響。

10/22 23:03 UTC (事件後 01d01h11m)

所有暫停的 webhook 和 Page Build 已經處理完了,所有系統狀態確認正常運作。 切換裝態為綠燈

想法

去年在DevOpsDays 演講 有分享很多這樣的想法,主要核心概念就是

預防甚於治療

以下是當時簡報的結論:

GitHub Post-Incident Analysis GitHub Post-Incident Analysis


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CSS高效开发实战—CSS 3、LESS、SASS、Bootstrap、Foundation

CSS高效开发实战—CSS 3、LESS、SASS、Bootstrap、Foundation

谢郁 / 电子工业出版社 / 2014-9 / 59.00

想象一下,一个网页只有HTML,没有CSS,那就是素颜和上妆的区别。而一个网页只有CSS,没用CSS 3,那就是马车和汽车的区别!汽车代表的是高效、美观,CSS 3的意图也是如此。移动设备的流行导致了响应式设计的流行,而CSS 3正是实现这种设计的精髓。《CSS高效开发实战—CSS 3、LESS、SASS、Bootstrap、Foundation》围绕的就是如何跨浏览器、跨设备进行高效率的CSS开......一起来看看 《CSS高效开发实战—CSS 3、LESS、SASS、Bootstrap、Foundation》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具