升級到 MySQL 8.0,F(xiàn)acebook 付出的代價。。
近日,F(xiàn)acebook 官博公布了他們的數(shù)據(jù)庫版本從 MySQL 5.6 升級到了 MySQL 8.0,并且在官博記錄了復(fù)盤詳細的升級過程。
Facebook 稱,他們最近的一次大版本升級到 MySQL 5.6 花了一年多時間才完成,還在 5.6 版上開發(fā) LSM 樹存儲引擎,MyRocks。在升級到 5.7 的同時構(gòu)建一個新的存儲引擎,會大大減慢 MyRocks 的進度,因此我們選擇繼續(xù)使用 5.6,直到 MyRocks 完成,MySQL 5.6 的壽命也即將結(jié)束,決定升級到 MySQL 8.0 。
官博介紹說,此次過程比之前的升級更具挑戰(zhàn)。
1、代碼補丁
首先我們建立了 8.0 分支,用于在開發(fā)環(huán)境中進行構(gòu)建和測試。然后,我們開始從 5.6 分支移植補丁的漫長過程。開始的時候有 1700 多個補丁,但我們能將其組織成幾個主要類別。
我們的大多數(shù)自定義代碼都有很好的注釋和描述,因此可以很容易地確定應(yīng)用程序是否仍然需要它,或者是否可以將它刪除。通過特殊關(guān)鍵字或唯一變量名所啟用的功能,也使得確定關(guān)聯(lián)變得很容易,因為我們可以搜索應(yīng)用程序代碼庫來找到它們的用例。有些補丁非常晦澀難懂,需要做調(diào)查工作 — 挖掘舊的設(shè)計文檔、郵件或代碼評審注釋,以了解它們的歷史。
我們將每個補丁分入四類之一:
Build/Client:支持我們構(gòu)建環(huán)境的非服務(wù)器特性,修改過的 MySQL 工具,比如 mysqlbinlog,或者增加的功能,如異步客戶端 API 等,需要移植。
非 MyRocks 服務(wù)器:mysqld 服務(wù)器中與 MyRocks 存儲引擎無關(guān)的特性,需要移植。
客戶端和服務(wù)器類別中的每個補丁都自然而然地成為一個軟件發(fā)布里程碑。隨著所有與客戶端相關(guān)的更改的移植,我們能夠?qū)⒖蛻舳斯ぞ吆瓦B接器代碼更新到8.0。一旦所有非 MyRocks 服務(wù)器特性都被移植,我們就可以為 InnoDB 服務(wù)器部署8.0 mysqld了。完成 MyRocks 服務(wù)器特性移植使我們能夠更新 MyRocks 安裝。
完成所有這些特性的移植花了幾年時間。到最終結(jié)束時,我們已經(jīng)評估了 2300 多個補丁,并將其中 1500 個移植到了 8.0 版本。另外,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復(fù):2T,可以獲取我整理的 MySQL 系列面試題和答案,非常齊全。
2、遷移途徑
我們將多個 mysqld 實例組合到一個 MySQL 副本集中。副本集中的每個實例都包含相同的數(shù)據(jù),但在地理上分布到不同的數(shù)據(jù)中心,以提供數(shù)據(jù)可用性和故障切換支持。每個副本集都有一個主實例。其余的實例都是從實例。主實例處理所有寫流量,并將數(shù)據(jù)異步復(fù)制到所有從實例。
由 5.6 主/5.6 從所組成的副本集開始,最終目標(biāo)是包含 8.0 主/ 8.0 從的副本集。我們遵循一個類似于 UDB MyRocks migration plan 的遷移規(guī)劃。
對于每個副本集,通過一個使用 mysqldump 生成的邏輯備份,創(chuàng)建并添加到 8.0 的從實例。這些從實例不提供任何應(yīng)用程序讀取流量; 在 8.0 從實例上開啟讀取流量; 允許將 8.0 從實例升級為主實例; 禁用 5.6 實例的讀取流量; 移除所有 5.6 實例。
為了自動化遷移大量副本集,我們需要構(gòu)建新的軟件架構(gòu)。可以通過簡單地更改配置文件中的一行,將副本集組合并在每個階段中移動它們。任何遇到問題的副本集都能單獨回滾。
3、基于行的復(fù)制
4、自動化驗證
大多數(shù) 8.0 遷移過程都涉及使用我們的自動化架構(gòu)和應(yīng)用查詢來測試和驗證 mysqld 服務(wù)器。另外,MySQL 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。
我們用來管理服務(wù)器的自動化基礎(chǔ)架構(gòu)在隨著 MySQL 服務(wù)器的增長而增長。為了確保所有 MySQL 自動化組件都與 8.0 版本兼容,我們投資構(gòu)建了一個測試環(huán)境,該環(huán)境利用虛擬機上的測試副本集來驗證行為。我們?yōu)?canary 編寫了在 5.6 版本和 8.0 版本上運行的每個自動化組件的集成測試,并驗證了它們的正確性。在進行此演練時,我們發(fā)現(xiàn)了幾個錯誤和行為差異。
當(dāng) MySQL 架構(gòu)的每一部分都在我們的 8.0 服務(wù)器上進行驗證時,我們發(fā)現(xiàn)并修復(fù)了(或解決了)一些有趣的問題:
解析錯誤日志、mysqldump 輸出或服務(wù)器 show 命令的文本輸出的軟件很容易損壞。服務(wù)器輸出的細微變化常常會暴露出工具解析邏輯中的錯誤。
5、應(yīng)用程序驗證
我們希望遷移對應(yīng)用程序盡可能透明,但是有些應(yīng)用程序的查詢會出現(xiàn)性能退化,或者在8.0 上會失敗。
我們對 8.0 服務(wù)器的查詢和性能測試發(fā)現(xiàn)了一些需要立即解決的問題。
我們發(fā)現(xiàn)在 ACL 緩存部分出現(xiàn)了新的互斥爭用熱點。當(dāng)大量連接同時打開時,它們都會阻塞 ACL 檢查;
當(dāng)存在大量 binlog 文件并且 binlog 的高速寫入導(dǎo)致頻繁輪換文件時,binlog 索引訪問也發(fā)現(xiàn)了類似的爭用;
6、接下來的工作
到目前為止,8.0 的移植已經(jīng)花了幾年時間。我們已將許多 InnoDB 副本集轉(zhuǎn)換為完全在 8.0 上運行。剩下的大部分都處于遷移途徑的不同階段。現(xiàn)在,我們的大多數(shù)定制功能都已移植到 8.0,更新到 Oracle 的次版本相對容易些,我們計劃跟上最新版本的步伐。
跳過 5.7 這樣的主版本會帶來一些問題,我們的遷移需要解決這些問題。
首先,我們無法就地升級服務(wù)器,需要使用邏輯轉(zhuǎn)儲和還原來構(gòu)建新服務(wù)器。但是,對于非常大的 mysqld 實例,這可能需要在活躍生產(chǎn)服務(wù)器上運行很多天,而且這個脆弱的過程可能會在完成之前被中斷。對于這些大型實例,我們必須修改備份和恢復(fù)系統(tǒng)來應(yīng)對重建。
盡管我們在遷移過程中遇到了種種障礙,但我們已經(jīng)看到了運行 8.0 帶來的好處。一些應(yīng)用程序選擇了提早遷移到 8.0,以利用諸如文檔存儲和改進的日期時間支持等功能。我們一直在考慮如何在 MyRocks 上支持像即時DDL這樣的存儲引擎特性。總的來說,新版本大大擴展了 MySQL@Facebook 的功能。
感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
正文結(jié)束
1.不認命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事
3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...
6.IntelliJ IDEA 2019.3 首個最新訪問版本發(fā)布,新特性搶先看

