GitHub 的兩次故障分析

2022-07-05 10:18:19 字數 2126 閱讀 8415

github 在本週遭受了兩次服務故障,其中一次是1小時46分鐘的無法訪問,另外一次是接近一小時的效能故障。這比我們標準要差很多,我們對此表示抱歉。我想要解釋究竟發生了什麼事情,以及我們採取了什麼措施以防止這些問題再次發生。

背景介紹

在八月中旬的一次維護中,我們的維護團隊用一組三個節點的集群替代了老舊的 drbd-backed mysql 伺服器。這些伺服器有兩個虛擬的 ip,其中乙個可以用來讀寫,另外乙個唯讀。這些虛擬 ip 是通過pacemaker 和 heartbeat 管理的,這兩個軟體在我們的架構中用的很多。mysql 的複製(active/standby)是通過 percona replication manager 完成的。我們的應用基本上只使用 active 的節點,不論讀寫操作。

這樣的配置提供了有效的冗餘。在之前的架構中,假如乙個 mysql down 了,我們需要冷啟動另外乙個 mysql 。而新的架構中,mysql 始終是在執行的,mysql 之間的切換是通過虛擬 ip 的切換來完成的。

9月10日,星期一

這個事情的起因是因為一次無傷大雅的資料庫遷移。我們使用 two-pass 遷移系統,以達到無停機 mysql schema 遷移。這個是最近才加上的操作,不過我們已經做過好幾次了。

周一的遷移導致了比往常遷移更高的資料庫壓力。由於壓力太高導致 master 節點沒有通過 percona replication manager 的健康檢查。所以 percona replication manager 將「active」和 master 資料庫移到另外一台伺服器上,並且停止了出問題的 mysql。

與此同時,新的 active 資料庫的 innodb 快取是空的,所以效能比較差。系統的壓力一下子又起來了,於是 percona replication manager 的健康檢查又報錯,所有 active 伺服器又被切換到了原來那台伺服器上。

這個時候,我決定禁用所有健康檢查,通過 pacemaker 的 maintenance-mode 來完成。隨著緩衝的漸漸形成,**的效能漸漸的起來了。

9月11日,星期二

第二天上午,開發人員通知運維組,standby 的 mysql 返回的結果不正確。我研究了一下,發現當昨天集群設定為 maintenance-mode 的時候,導致了 standby 伺服器的 replication master 錯誤。所以我決定禁用 maintenance-mode ,讓 pacemaker 和 persona replication manager 恢復正常。

譯者注:翻譯不下去了,十分細節,強烈建議看原文!

in ops i trust

兩次故障的根本原因都是資料庫的故障切換功能。每次發生故障切換的時候,假如由人來判斷的話,都是不應該做切換操作的。自動的故障切換在很多時候是好的。在經過仔細的考慮過後,我們認為我們的主要資料庫並不需要這個功能。所以我們修改了 pacemaker 的配置,只有人為操作才會對 active 資料庫進行故障切換。

我們也在研究如何解決故障切換時候的效能問題,不論是緊急情況還是例行維護。有不少工具可以用來初始化 innodb 的快取池,我們正在研究中。

最後,我們的運營團隊正在對周二發生的 pacemaker 和 heartbeat segfault 錯誤進行調查。

故障狀態**

我們**狀態資訊部署在 heroke 上面,以保證在**故障的時候,狀態資訊是可以被訪問的。但是,在周二的故障中,我們的**狀態也遇到了一些問題。

由於訪問狀態**的流量突然增加,我們把節點數從8增加到64最後增加到90。但增加節點起了反作用,因為我們的資料庫(共享的)是非常陳舊的。新增的節點把資料庫連線都站了,導致其他程序的崩潰。

通過和 heroku 支援的溝通,我們把 production database 啟動了,狀態**的表現有了明顯的提公升。自從這次事故以後,我們為狀態**也加了第二台資料庫,以保證在突發狀況下的可用性。

展望未來

我們最近對資料庫的改動是為了提高可用性而做的,但是我很抱歉它起了反作用。我們的運維團隊始終專注於提供快速,穩定的 github 體驗,我們將繼續優化我們架構,軟體和方法來提高使用者的體驗。

開源中國社群

關於兩次fork

兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 return 或exit 如下圖1所示 在一定時間內,當系統發現孤兒程序時,ini...

關於兩次fork

兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 return 或exit 如下圖1所示 在一定時間內,當系統發現孤兒程序時,ini...

兩次left join 查詢

t1 id是第乙個球隊的id號 t2 id是第二個球隊的id號 t1 score是第乙個球隊的的比分 t2 score是第二個球隊的的比分 第一行的含義是 3號球隊南韓和4號球隊澳大利亞的比分是1 2,比賽時間是1422694800 需求 將每隊的比賽列出 如 南韓 1 2 澳大利亞 1422694...