天天看點

MySQL多線程備份工具mydumper

此文已由作者溫正湖授權網易雲社群釋出。

歡迎通路網易雲社群,了解更多網易技術産品營運經驗。

一、RDS外部執行個體遷移需求

RDS(關系型資料庫服務)作為網易雲計算的基礎性元件,已經承載了公司多個産品的數百個的資料庫執行個體,且在可以預期的時間内,RDS線上的執行個體數量還會快速增加。在目前這些執行個體中有不少是從非雲環境(實體機)遷移過來的,基本上由DBA手動完成。需要執行在實體機執行個體上使用xtrabackup備份MySQL執行個體的資料,建立新的RDS執行個體,将備份的資料覆寫掉空的MySQL資料目錄等将近二十步的操作,且極易出錯,效率較低。後續還将有大量(數百個)的杭州、北京和廣州的業務執行個體會遷移到RDS上來,提供一個友善而又高效的備份和恢複工具,将DBA從繁瑣的執行個體遷移中解放出來刻不容緩。

在調研業界相關産品時發現,Amazon RDS未提供成套的外部執行個體遷移到RDS的工具,Aliyun RDS提供了自建執行個體遷移到RDS的平台,通過使用和分析發現,其采用的備份工具是mysqldump,由于Aliyun RDS針對的使用者資料量一般較小,使用mysqldump來進行資料遷移不會有太大的瓶頸問題,但網易的很多項目都是資料量很大的,舉網易163部落格為例,包含衆多的資料庫執行個體,執行個體很多都是幾百G的資料量,雲閱讀、lofter等也是類似的情況,使用單線程的mysqldump效率不高。

我們曾計劃使用xtrabackup作為遷移平台的工具,因為其實體資料拷貝性能更為優越,同時工具也非常成熟可靠。但xtrabackup目前還無法備份遠端的資料庫執行個體,僅支援将本地執行個體資料備份遠端,是以使用xtrabackup就需要有遠端資料庫執行個體所在主機的登陸權限,這大大增加了系統的侵入性,不符合RDS的設計思想。同時邏輯備份相對于實體備份的一大好處是,備份集的大小一般遠小于目前的資料庫執行個體的資料大小,這樣可以有效的減少網絡資源的開銷,對縮短備份時間也有不小幫助。舉已經遷移的一個網易北京資料庫執行個體為例,目前的資料大小為140G,mydumper導出的資料為37G,myloader恢複出來的執行個體大小為71G。減小了一半,這主要是因為邏輯備份和恢複潛在地具備系統庫中無用的資料清理和存儲碎片整理功能。

mydumper的多線程資料備份和恢複及非傾入性特點非常适用于網易RDS。目前,基于mydumper的RDS外部執行個體一鍵遷移平台已經開發完成并上線遷移了數十個執行個體,得到DBA兄弟們的認可。

二、RDS對mydumper改進優化

在将mydumper封裝為RDS的外部執行個體一鍵遷移平台過程中,也發現了幾個mydumper的不足,主要包括在schema導出功能上仍不夠成熟、多線程導出(備份)可能影響備份執行個體的正常業務通路等,下面對其一一進行介紹并在RDS一鍵遷移平台中提供的解決方案。

首先是schema導出上,直到最新的mydumper 0.6.2版本,其代碼實作為對MySQL執行個體執行“show create table dbname.tablename”。是以,視圖、觸發器、函數和存儲過程無法通過mydumper導出。目前業界折中的辦法是在備份時使用mysqldump來導出schema,再用mydumper來導出資料,但這既麻煩同時對schema和資料的一緻性也多少說有些影響,RDS目前同樣采用該方法來規避mydumper的這個缺陷。幸運的是,mydumper的下一個版本mydumper 0.9.1的主要優化點就是解決該問題,launchpad的mydumper項目(https://launchpad.net/mydumper/+milestone/0.9.1)是這麼描述該版本的--“Add support all schema objects”,檢視代碼發現該功能已經實作,相信不久即可使用。

其次是多線程導出的自适應能力上,多線程導出固然好,但畢竟在備份時往往資料庫還在正常提供對外服務,就像上述的那樣,多線程全表select資料會占用很大部分的系統IO能力,導緻正常的業務IO性能下降,此外,邏輯備份的全表select也會污染buffer pool的熱點資料,導緻緩存的熱點資料被換出,降低了命中率的同時增大了業務的IO量。如何在高效導出資料的同時又能夠兼顧到線上業務的性能呢? 我們主要從以下兩個方面來減低對業務的影響:

第一點,也是很重要的一點是,多線程的自适應導出能力;我們優化了mydumper的多線程資料導出的行為。每個線程在每次資料導出前,都會首先觀察執行個體的目前負載情況,舉MySQL狀态Thread_connected為例,其反映的是目前已連接配接到該執行個體的請求數,如果該數值大于我們設定的門檻值,則本次導出操作會暫停,直到數值小于門檻值才會恢複,這樣就起到了根據線上的負載情況,靈活的調整用于資料導出的線程數來适應線上業務負載的作用。RDS一鍵遷移平台為使用者提供了差異化的監控項選擇,可以指定“show global status”中的任意一項或多項狀态參數(非數值型狀态除外)作為監控項。

第二點,盡量減小對InnoDB Buffer Pool的影響;通過調整Buffer Pool的熱點算法,使得熱點資料盡可能不被換出。修改的參數是innodb_old_blocks_time和innodb_old_blocks_pct,用于将全表select進入Buffer Pool放在其old sublist中,同時減小old sublist塊在Buffer Pool中的比例,起到最小化污染的作用。其原理詳見http://dev.mysql.com/doc/innodb-plugin/1.0/en/idm47548325357504.html

此外,在資料導出過程中,由于MyISAM表是非事務的,為了得到一緻性的資料,導出MyISAM需要加鎖。在通常的MySQL執行個體中,MyISAM表資料都是很少的,是以持鎖時間很短,但若有執行個體存在大量的MyISAM表資料,那麼就會因持鎖時間過長對線上業務資料更新和插入造成影響。是以,RDS為mydumper加了-H的參數用來進行持鎖時間逾時判斷,預設為60s,若超出這個值,mydumper傳回失敗。

目前,這些改進均已內建到RDS的遷移平台上,遷移平台為執行個體遷移提供了較大便利,相信不會令您失望。最後簡單介紹下RDS的外部執行個體遷移操作。選擇RDS的執行個體管理界面,你會發現“開始外部執行個體遷移”按鈕,點選它就會彈出圖1。

圖1

MySQL多線程備份工具mydumper

隻需分别輸入待遷移的外部執行個體的IP位址、端口、使用者遷移的使用者和密碼(需要賦予該使用者必要的遷移權限,最簡單的方法就是賦予“all”權限了)。點選“擷取資料庫清單”,如果你輸入的連接配接參數是對的,那麼将出現資料庫清單,你可以選中一個或多個需要遷移的資料庫。再配置圖2的這些參數,當然你也可以不配置,因為我們為你貼心準備了預設的值。

MySQL多線程備份工具mydumper

圖2    

如果确認這些參數無誤,這麼請點選“送出”開始遷移過程吧。在遷移中,你可以通過點選“檢視外部執行個體遷移”來看遷移的進度(外部執行個體資料導出、資料導入到RDS和增量資料同步),界面如圖3。

MySQL多線程備份工具mydumper

圖3    

如果到達增量資料同步階段,且RDS執行個體已經基本上跟上外部執行個體。那麼就可以考慮切應用的業務到RDS執行個體上了,完成後點選“結束遷移”即可。是不是很簡單!!! 感興趣的讀者不凡試用下

網易雲免費體驗館,0成本體驗20+款雲産品! 

更多網易技術、産品、營運經驗分享請點選。

相關文章:

【推薦】 雲計算節點故障自動化運維服務設計