GitHub如何通過遷移MySQL資料庫提高網站效能
GitHub,作為廣泛使用的開原始碼庫以及版本控制系統,其資料庫MySQL效能的優劣對整個網站平台有著舉足輕重的影響。接下來我們一起跟隨GitHub基礎架構團隊的步伐,來重溫去年8月做的一次重大MySQL更新,看是如何使得GitHub運行得更暢順的。
任務簡述
自去年開始,我們陸續地把GitHub主體架構遷移到新的資料中心,與之配套的是世界級的硬體和網路環境。我們十分希望這次升遷對後端系統基石MySQL的效能也有所提高。不過在一個新環境重建立立一個新的伺服器叢集和硬體平台,並不是件輕易的事情,我們必須做好計劃與測試,確保遷移工作順利完成。
準備工作
每當要進行類似的重大升級工作,對每個測量和指標量度步驟都會提出嚴格的要求。為新機器安裝好作業系統後,接下來需要根據不同的配置來進行測試。為了得到真實的負載測試資料,我們使用了tcpdump對從舊叢集系統到新系統執行的SELECT查詢進行抓包分析。
MySQL效能調整可謂是細節決定成敗,例如眾所周知的innodb_buffer_pool_size的設定,對整體有著舉足輕重的影響。為了盡更全面地管控升級過程,我們把 innodb_thread_concurrency、innodb_io_capacity、innodb_buffer_pool_instances等參數也一併進行分析和研究。
每次測試時我們都只改變某一個參數,然後讓系統連續運行至少12小時。在這過程中不斷觀察SHOW ENGINE INNODB STATUS帶來的統計資訊,其中SEMAPHORES欄目,能很好地反映工作負載競爭情況。當相關設定測試通過後,接下來我們將嘗試把其中一個最大的資料表遷移到一個單獨的叢集上。作為前期測試的一部分,這樣的遷移工作能為日後更大更核心的變更帶來指引。
除了對基礎硬體部分進行了升級,我們還對流程和拓撲進行了最佳化。例如:延後複製,更快速和高頻的備份,提高備帶讀取能力。一切就緒後,將進入最後的升級階段。
制定升級項目清單,進行二次檢查
作為每天服務上百萬使用者的平台,任何差錯都將是毀滅性的。我們在進行真實切換前,列出了一個任務清單,確保各項工作有序執行:
- 確保緩衝池在新叢集中成功預熱
- 在推特等社交平台公告維護開始
- 把網站轉為維護等待模式
- 等候所有與舊MySQL伺服器相關的通訊終止
- 把舊伺服器設為唯讀模式
- 從舊叢集中移除主要和複製的VIPs資料
- 確認所有寫入操作已經終止
- 終止cluster1的複製
- 擷取cluster1複製的位置,並告知當前線程
- 重設cluster1的複製
- 關閉cluster1的唯讀模式
- 把舊叢集串連到新的cluster1叢集
- 按照cluster1串連配置進行應用程式部署
- 確保新串連能通過新叢集
- 檢查後台工具resque的任務(workers)
- 進行階段檢查並確保一切正常
- 把網站轉為正常模式
- 在推特等社交平台公告維護結束
- 把https://github.com/github/xxxx/pull/xxx整合到首頁面
遷移當天
在周六的上午5點太平洋時間),團隊成員就位後,遷移工作正式開始。當使用者在這段時間訪問網站時,會收到如下的提示:
13分鐘後,新叢集即將開始正常運作。我們終止了網站的維護模式,並告知福士網站將回複正常。
效果評估
在接下來的幾個星期,我們密切關注了整體效能和回應時間方面的變化。結果是令人欣喜的,頁面載入時間減少了將近三分之二:
經驗總結:
1. 功能劃分
在本次操作中,我們把較大的曆史資料記錄表放入單獨的叢集,事後證明這是明智的做法—很好地釋放了儲存空間和緩衝池空間。同時,能夠把更多資源放在活躍資料處理上,串連邏輯的劃分也使得程式可以在多個叢集間進行查詢。以後我們還將採取該方法進行升級。
2. 不斷測試
羅馬非一天建成,整個過程需要不斷進行驗收和迴歸測試,避免意外的發生。
3. 團隊的力量
如此重大的架構升級需要很多小夥伴協力工作,我們主要使用GitHub上的拉請求功能來進行互動交流。部署團隊來自世界各地:
當開啟一個拉請求後,我們將進行即時交流,例如:錯誤處理,迴歸處理等資訊的交流。每個交流環節都產生一個URL,方便進行曆史查詢和反饋。
一年後……
路遙知馬力,一年後,實踐證明這是一次成功的操作。MySQL持續表現符合預期,系統可靠性進一步提高。還有個附加好處是:新系統的擴充性得到提升,將來可進行更大規模的升級和改造。
GitHub 教程系列文章:
GitHub 使用教程圖文詳解
如何在 GitHub 建立組織
GitHub Linux下使用方法
Windows下Eclipse搭建GitHub開發環境圖文教程
R語言 3.0.1 源碼已經提交到 GitHub
從GitHub將Maven項目匯入Eclipse4.2
Git 標籤管理詳解
Git 分支管理詳解
Git 遠程倉庫詳解
Git 本地倉庫(Repository)詳解
Git 伺服器搭建與用戶端安裝
Git 概述
GitHub 的詳細介紹:請點這裡
GitHub 的:請點這裡
本文永久更新連結地址: