數(shù)據(jù)遷移類測試策略
前言
前段時間做了一次數(shù)據(jù)遷移,針對數(shù)據(jù)遷移類型的測試方法進行了一些了解和總結(jié),以下工具愚公移山和精衛(wèi)為淘寶開發(fā)的工具,已使用于多個產(chǎn)品、項目中,質(zhì)量有保障。
一、工具介紹
1、愚公移山
概述:
數(shù)據(jù)的動態(tài)遷移,可完成數(shù)據(jù)全量、增量遷移,進行數(shù)據(jù)比對,保證數(shù)據(jù)的正確;目前較多運用在數(shù)據(jù)遷移中,已經(jīng)被很多團隊使用,是很成熟可靠的數(shù)據(jù)遷移工具
適用范圍:
可支持:支持oracle和mysql,分庫分表,實時同步,數(shù)據(jù)比對
不支持:涉及到外部依賴,遷移規(guī)則非常復(fù)雜的數(shù)據(jù)
性能情況:
沒有對愚公進行壓測,性能情況參考以下的例子
例子:遷移一個1000萬的表。 16個線程,開啟批量寫入,半個小時以內(nèi)完成。
影響點:機器的負載,并行的任務(wù)數(shù),配置的線程數(shù)
愚公百科:(不知道可以可以貼!有需要可聯(lián)系作者)
2、精衛(wèi)工具
概述:
精衛(wèi)是一個基于MySQL數(shù)據(jù)庫的數(shù)據(jù)復(fù)制組件,較多運用在數(shù)據(jù)雙寫的場景中,是比較成熟的一個數(shù)據(jù)復(fù)制組件
解析數(shù)據(jù)庫的binlog文件,A庫的所有的數(shù)據(jù)變更傳到B庫。binlog:描述數(shù)據(jù)變更的文件
適用范圍:
同庫不同表數(shù)據(jù)復(fù)制、多庫多表數(shù)據(jù)冗余、標準化去O支持、數(shù)據(jù)變化通知
性能情況:
性能壓測,性能結(jié)果滿足交易主庫同步備庫需求
例子:主庫1000tps,延遲在50sms以內(nèi)
【精衛(wèi)+metaq性能測試結(jié)論.msg】
精衛(wèi)百科:(不知道可以可以貼!)
二、遷移類測試策略
1、概述
隨著業(yè)務(wù)需求或數(shù)據(jù)量增長到一定程度,往往需要進行數(shù)據(jù)庫切換,這里就伴隨這數(shù)據(jù)遷移。
關(guān)鍵字: 全量數(shù)據(jù)遷移,增量數(shù)據(jù)遷移,分庫分表,數(shù)據(jù)雙寫,oracle、mysql、hbase…,新老數(shù)據(jù)兼容,數(shù)據(jù)訂正
2、發(fā)布方案(遷移方案)
兩大類:正常發(fā)布、停機發(fā)布
正常發(fā)布:可以實現(xiàn)線上業(yè)務(wù)無縫切換,不影響用戶使用,需要保證新老數(shù)據(jù)兼容,發(fā)布過程中的數(shù)據(jù)寫入等。
停機發(fā)布 : 優(yōu)點在于可以避免發(fā)布過程中的新數(shù)據(jù)寫入,缺點是發(fā)布過程中,不能正常提供服務(wù)。
發(fā)布方案的制定是根據(jù)具體業(yè)務(wù)情況制定發(fā)布方案,對業(yè)務(wù)無影響的情況下較常采用停機發(fā)布,方便簡單。
介紹一種無縫對接的正常發(fā)布方案
A庫歷史庫 mysql分庫分表 到 B庫新庫hbase
步驟1、全量dump1:A庫數(shù)據(jù)全量遷移至B庫
步驟2、打開雙寫:同時寫入到A庫歷史庫和B庫新庫
步驟3、全量dump2:開啟雙寫前的所有差集,將差集灌回B數(shù)據(jù)庫,這里是補充全量dump1期間和開啟雙寫前只寫入到A的數(shù)據(jù)。保證了A、B數(shù)據(jù)庫數(shù)據(jù)的完全一致,同時已經(jīng)開啟了雙寫。
步驟3’、測試介入,可對A、B庫取某一時間段前所有數(shù)據(jù)進行數(shù)據(jù)驗證。
步驟4、停止對A庫的寫入,發(fā)布前端應(yīng)用,切換至B庫新庫
注意點:
1、雙寫時,B庫不存在被寫源數(shù)據(jù)或B庫數(shù)據(jù)狀態(tài)異常等情況,需要從業(yè)務(wù)上考慮,是否直接從A庫中獲取數(shù)據(jù)并覆蓋至B庫
2、以上步驟中的多次dump和雙寫有多個寫入B庫的場景,需要以保證B庫和A庫一致為原則,如B庫的重復(fù)寫入等情況的處理。
3、測試策略
在進行數(shù)據(jù)遷移測試前,需確認的CheckList
CheckList
1、 哪些表需要遷、哪些表不需要遷;需要遷移的表老庫和新庫的對應(yīng)關(guān)系是怎樣的
2、 明確表的關(guān)聯(lián)關(guān)系,關(guān)聯(lián)表是否需要遷移,不遷移怎么處理
3、 遷移的表中,哪些字段要遷移,哪些不遷移,對應(yīng)關(guān)系是怎樣的
4、 新表中的字段,老表是不是一定有,如果不一定,怎么處理可能為空的情況,尤其是必填字段的處理
5、 遷移前,新表是否為空,不為空是否可能存在數(shù)據(jù)重復(fù)的情況,怎么處理
6、 新老表中的字段類型、長度的定義是否一致,可否正確轉(zhuǎn)換
7、 需遷移的表數(shù)據(jù)量為多少
8、 開發(fā)做了哪些數(shù)據(jù)遷移正確性的保障
針對不同的業(yè)務(wù)場景需要測試人員設(shè)計不同的測試方案,主要都是兩個層面的驗證,數(shù)據(jù)層面的數(shù)據(jù)驗證和功能層面的功能驗證
1、數(shù)據(jù)驗證:使用工具或設(shè)計對賬程序全量驗證
a、全量數(shù)據(jù)驗證
b、增量數(shù)據(jù)驗證
c、抽樣數(shù)據(jù)驗證
根據(jù)業(yè)務(wù)情況判斷需要進行哪一項或幾項數(shù)據(jù)驗證
工具使用:可以選用目前較成熟的遷移工具:愚公移山, 兼全量數(shù)據(jù)驗證和增量數(shù)據(jù)驗證功能
驗證方式:若遷移場景不在愚公的適用范圍內(nèi),全量驗證和增量數(shù)據(jù)驗證需要另外設(shè)計適用于該場景下的數(shù)據(jù)驗證方案
可采用的一些驗證方式:考慮根據(jù)不同數(shù)據(jù)的存儲方式,數(shù)據(jù)量的大小
a、關(guān)系數(shù)據(jù)庫,直接新老數(shù)據(jù)庫中jdbc方式獲取數(shù)據(jù),一條條進行對比,新老數(shù)據(jù)存在規(guī)則轉(zhuǎn)換的情況需要在對賬程序中同時進行規(guī)則判斷。
b、全量或抽樣dump歷史庫和新庫兩份文件進行對比,數(shù)據(jù)庫非常大的時候推薦使用hadoop
2、功能驗證:主要是抽樣數(shù)據(jù)的功能測試
a、功能測試:對歷史數(shù)據(jù)常見的操作方式為,在歷史庫準備一批歷史數(shù)據(jù),準備什么樣的歷史數(shù)據(jù)依賴于具體業(yè)務(wù)的數(shù)據(jù)情況,通過遷移程序?qū)v史數(shù)據(jù)遷移至新庫后,驗證這批數(shù)據(jù)的存儲和功能展現(xiàn)。新數(shù)據(jù)的驗證則以新增功能的方式進行測試。
b、自動化測試:API自動化+頁面自動化:只有數(shù)據(jù)遷移沒有上層業(yè)務(wù)變更的情況下,如果已經(jīng)存在自動化腳本,采用自動化腳本可以快速回歸,重點在DAO層的方法。
以下情況需要特別設(shè)計用例進行功能驗證
1、 老表字段進行類型或長度等轉(zhuǎn)換遷移至新表
2、 老表中可能為空的字段,新表中直接為空或默認一個初始值
3、 老表數(shù)據(jù)通過特殊處理轉(zhuǎn)換為新表中的值
4、 需要進行數(shù)據(jù)訂正的字段
數(shù)據(jù)雙寫
數(shù)據(jù)雙寫往往伴隨著數(shù)據(jù)遷移進行,精衛(wèi)工具能很好的支持數(shù)據(jù)復(fù)制,并進行數(shù)據(jù)比對。
在精衛(wèi)工具的試用范圍外的數(shù)據(jù)雙寫,一般是應(yīng)用中加入雙寫代碼,這里也需要涉及數(shù)據(jù)比對程序,類似于數(shù)據(jù)遷移的比對程序;
可采用的驗證方式:
1、根據(jù)數(shù)據(jù)雙寫的實時性的特性, 在不影響應(yīng)用功能、性能的情況下,可以考慮在雙寫代碼中加入驗證程序,即每完成一次雙寫,即對插入的新老數(shù)據(jù)進行數(shù)據(jù)比對。
2、枚舉所有涉及雙寫的場景,逐個場景進行功能驗證
3、以全量的方式進行數(shù)據(jù)比對,數(shù)據(jù)雙寫進行到一定程度,能確保所有需要雙寫的場景都已經(jīng)進行過,那么,對雙寫的兩張表的數(shù)據(jù)截取gmt_modify時間為某一時間段以前的所有數(shù)據(jù)進行比對,約等于遷移的全量數(shù)據(jù)驗證。
其他關(guān)注點:
1、 考慮id預(yù)留空間:+**,需要足夠大,保證沒有主鍵沖突
2、 關(guān)注sql性能:分庫分表,尤其是跨庫查詢時需要關(guān)注性能情況,數(shù)據(jù)量比較大的情況下,可以考慮走搜索