升級到 MySQL 8.0,F(xiàn)acebook 付出的代價。。
300本計(jì)算機(jī)編程的經(jīng)典書籍下載
AI全套:Python3+TensorFlow打造人臉識別智能小程序
最新人工智能資料-Google工程師親授 Tensorflow-入門到進(jìn)階
黑馬頭條項(xiàng)目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版
近日,F(xiàn)acebook 官博公布了他們的數(shù)據(jù)庫版本從 MySQL 5.6 升級到了 MySQL 8.0,并且在官博記錄了復(fù)盤詳細(xì)的升級過程。
Facebook 稱,他們最近的一次大版本升級到 MySQL 5.6 花了一年多時間才完成,還在 5.6 版上開發(fā) LSM 樹存儲引擎,MyRocks。在升級到 5.7 的同時構(gòu)建一個新的存儲引擎,會大大減慢 MyRocks 的進(jìn)度,因此我們選擇繼續(xù)使用 5.6,直到 MyRocks 完成,MySQL 5.6 的壽命也即將結(jié)束,決定升級到 MySQL 8.0 。
官博介紹說,此次過程比之前的升級更具挑戰(zhàn)。
1、代碼補(bǔ)丁
首先我們建立了 8.0 分支,用于在開發(fā)環(huán)境中進(jìn)行構(gòu)建和測試。然后,我們開始從 5.6 分支移植補(bǔ)丁的漫長過程。開始的時候有 1700 多個補(bǔ)丁,但我們能將其組織成幾個主要類別。
我們的大多數(shù)自定義代碼都有很好的注釋和描述,因此可以很容易地確定應(yīng)用程序是否仍然需要它,或者是否可以將它刪除。通過特殊關(guān)鍵字或唯一變量名所啟用的功能,也使得確定關(guān)聯(lián)變得很容易,因?yàn)槲覀兛梢运阉鲬?yīng)用程序代碼庫來找到它們的用例。有些補(bǔ)丁非?;逎y懂,需要做調(diào)查工作 — 挖掘舊的設(shè)計(jì)文檔、郵件或代碼評審注釋,以了解它們的歷史。
我們將每個補(bǔ)丁分入四類之一:
Build/Client:支持我們構(gòu)建環(huán)境的非服務(wù)器特性,修改過的 MySQL 工具,比如 mysqlbinlog,或者增加的功能,如異步客戶端 API 等,需要移植。
非 MyRocks 服務(wù)器:mysqld 服務(wù)器中與 MyRocks 存儲引擎無關(guān)的特性,需要移植。
客戶端和服務(wù)器類別中的每個補(bǔ)丁都自然而然地成為一個軟件發(fā)布里程碑。隨著所有與客戶端相關(guān)的更改的移植,我們能夠?qū)⒖蛻舳斯ぞ吆瓦B接器代碼更新到8.0。一旦所有非 MyRocks 服務(wù)器特性都被移植,我們就可以為 InnoDB 服務(wù)器部署8.0 mysqld了。完成 MyRocks 服務(wù)器特性移植使我們能夠更新 MyRocks 安裝。
完成所有這些特性的移植花了幾年時間。到最終結(jié)束時,我們已經(jīng)評估了 2300 多個補(bǔ)丁,并將其中 1500 個移植到了 8.0 版本。另外,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復(fù):2T,可以獲取我整理的 MySQL 系列面試題和答案,非常齊全。
2、遷移途徑
我們將多個 mysqld 實(shí)例組合到一個 MySQL 副本集中。副本集中的每個實(shí)例都包含相同的數(shù)據(jù),但在地理上分布到不同的數(shù)據(jù)中心,以提供數(shù)據(jù)可用性和故障切換支持。每個副本集都有一個主實(shí)例。其余的實(shí)例都是從實(shí)例。主實(shí)例處理所有寫流量,并將數(shù)據(jù)異步復(fù)制到所有從實(shí)例。
由 5.6 主/5.6 從所組成的副本集開始,最終目標(biāo)是包含 8.0 主/ 8.0 從的副本集。我們遵循一個類似于 UDB MyRocks migration plan 的遷移規(guī)劃。
對于每個副本集,通過一個使用 mysqldump 生成的邏輯備份,創(chuàng)建并添加到 8.0 的從實(shí)例。這些從實(shí)例不提供任何應(yīng)用程序讀取流量; 在 8.0 從實(shí)例上開啟讀取流量; 允許將 8.0 從實(shí)例升級為主實(shí)例; 禁用 5.6 實(shí)例的讀取流量; 移除所有 5.6 實(shí)例。
為了自動化遷移大量副本集,我們需要構(gòu)建新的軟件架構(gòu)??梢酝ㄟ^簡單地更改配置文件中的一行,將副本集組合并在每個階段中移動它們。任何遇到問題的副本集都能單獨(dú)回滾。
3、基于行的復(fù)制
4、自動化驗(yàn)證
大多數(shù) 8.0 遷移過程都涉及使用我們的自動化架構(gòu)和應(yīng)用查詢來測試和驗(yàn)證 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)境利用虛擬機(jī)上的測試副本集來驗(yàn)證行為。我們?yōu)?canary 編寫了在 5.6 版本和 8.0 版本上運(yùn)行的每個自動化組件的集成測試,并驗(yàn)證了它們的正確性。在進(jìn)行此演練時,我們發(fā)現(xiàn)了幾個錯誤和行為差異。
當(dāng) MySQL 架構(gòu)的每一部分都在我們的 8.0 服務(wù)器上進(jìn)行驗(yàn)證時,我們發(fā)現(xiàn)并修復(fù)了(或解決了)一些有趣的問題:
解析錯誤日志、mysqldump 輸出或服務(wù)器 show 命令的文本輸出的軟件很容易損壞。服務(wù)器輸出的細(xì)微變化常常會暴露出工具解析邏輯中的錯誤。
5、應(yīng)用程序驗(yàn)證
我們希望遷移對應(yīng)用程序盡可能透明,但是有些應(yīng)用程序的查詢會出現(xiàn)性能退化,或者在8.0 上會失敗。
我們對 8.0 服務(wù)器的查詢和性能測試發(fā)現(xiàn)了一些需要立即解決的問題。
我們發(fā)現(xiàn)在 ACL 緩存部分出現(xiàn)了新的互斥爭用熱點(diǎn)。當(dāng)大量連接同時打開時,它們都會阻塞 ACL 檢查;
當(dāng)存在大量 binlog 文件并且 binlog 的高速寫入導(dǎo)致頻繁輪換文件時,binlog 索引訪問也發(fā)現(xiàn)了類似的爭用;
6、接下來的工作
到目前為止,8.0 的移植已經(jīng)花了幾年時間。我們已將許多 InnoDB 副本集轉(zhuǎn)換為完全在 8.0 上運(yùn)行。剩下的大部分都處于遷移途徑的不同階段?,F(xiàn)在,我們的大多數(shù)定制功能都已移植到 8.0,更新到 Oracle 的次版本相對容易些,我們計(jì)劃跟上最新版本的步伐。
跳過 5.7 這樣的主版本會帶來一些問題,我們的遷移需要解決這些問題。
首先,我們無法就地升級服務(wù)器,需要使用邏輯轉(zhuǎn)儲和還原來構(gòu)建新服務(wù)器。但是,對于非常大的 mysqld 實(shí)例,這可能需要在活躍生產(chǎn)服務(wù)器上運(yùn)行很多天,而且這個脆弱的過程可能會在完成之前被中斷。對于這些大型實(shí)例,我們必須修改備份和恢復(fù)系統(tǒng)來應(yīng)對重建。
盡管我們在遷移過程中遇到了種種障礙,但我們已經(jīng)看到了運(yùn)行 8.0 帶來的好處。一些應(yīng)用程序選擇了提早遷移到 8.0,以利用諸如文檔存儲和改進(jìn)的日期時間支持等功能。我們一直在考慮如何在 MyRocks 上支持像即時DDL這樣的存儲引擎特性。總的來說,新版本大大擴(kuò)展了 MySQL@Facebook 的功能。
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂于分享的朋友們一起交流學(xué)習(xí)。
看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人
往期資源:
