關於GitHub 服務中斷 24 小時 11 分鐘事故
阿新 • • 發佈:2021-11-29
目錄
這起事故雖然發生在2018年,已經過去了很長時間,但其中的問題和帶來的啟示永不過時,拿來分析,具有很重要的意義。
1.背景
GitHub主要有東、西海岸兩個資料中心,以及其他三個公有云資料中心。本次事故主要涉及東、西海岸兩個資料中心。
並且,在GitHub,使用的Orchestrator作為MySQL叢集拓撲管理和主庫高可用工具。
GitHub 的MySQL叢集和Orchestrator高可用服務部署情況如下。
MySQL叢集部署情況
MySQL叢集是一主 4從:
- 主庫和2個從庫在東海岸
- 2個從庫在西海岸
為了大規模提高擴充套件性,已經使用讀寫分離。寫操作在主庫上,大部分讀操作在從庫上。
Orchestrator部署情況
Orchestrator高可用服務以分散式叢集方式部署,跨東西海岸。
2.事情的經過
東海岸更換光纖裝置,導致東海岸資料中心與外界網路斷開,43s後,網路恢復。
這個短暫的網路斷開,引起了一連串的事故。
這些事故主要包括以下。
1).ORC leader漂移
ORC leader 原來是在東海岸,網路斷開,觸發leader 漂移到西海岸。
2).MySQL叢集主庫切換後,資料不一致
ORC leader 漂移到西海岸後,發現主庫探測異常,2個東海岸從庫探測異常,2個西海岸從庫複製斷開,判定為DeadMasterAndSomeSlaves,觸發MySQL叢集主庫由東海岸切到西海岸。寫入流量開始匯入到西海岸主庫。 在切換過程,東海岸的2個從庫無法change到新主庫,成為丟失副本。切換後,實際叢集拓撲,只包括一主一從,且都在西海岸。 切換後,發現東海岸有部分寫入沒有同步到西海岸。東、西海岸資料出現不一致。
出現問題後,為了保證資料一致性,GitHub 首先進行了服務降級,暫停了部分服務。
接著,在東海岸重新建立新主庫。這其中包括,從備份恢復資料、從東西海岸同步資料等。
再接著,將主庫切回東海岸。處理佇列中的資料。
最後,網站對外提供服務。
最最後,解決資料不一致。通過與使用者溝通,恢復丟失的資料。
3.存在的隱患
通過這個事故,可以看到幾個隱患。
1).ORC 跨Region部署
跨Region 的網路抖動,會導致ORC leader漂移。如果leader正在進行切換,leader漂移,會導致切換進行到一半。
解決方案:ORC 服務不跨Region部署。
2).MySQL叢集跨Region部署
跨Region部署,一方面,可以提供資料遠端備份。另一方面,複製可能存在延遲,如果發生類似這個故障場景的切換,會造成資料不一致。
3). 為什麼恢復資料的方式是通過備份進行恢復?
通過備份恢復資料的問題是,時間太長。首先是備份存在公有云,需要遠端下載,其次是解壓、校驗和應用資料,耗費時間。
為什麼不將東海岸的其中一個從庫,回退部分資料,接著同步西海岸新寫入的資料,之後,就可以使用了吧?