
目前國(guó)內(nèi)很多企業(yè)已經(jīng)在深入的使用公有云了。隨著業(yè)務(wù)的發(fā)展,這些企業(yè)大部分會(huì)考慮做多云的雙活或?yàn)?zāi)備以及根據(jù)云上產(chǎn)品功能和成本考慮從一家云遷到另一家云。
我司前幾個(gè)月接了一個(gè)公有云業(yè)務(wù)遷移的項(xiàng)目,在項(xiàng)目中總結(jié)了一些經(jīng)驗(yàn),下面是我的總結(jié),希望能幫助每個(gè)運(yùn)維在遇到類(lèi)似的問(wèn)題時(shí)能快速解決。
數(shù)據(jù)庫(kù)同步問(wèn)題
數(shù)據(jù)庫(kù)同步使用DTS工具來(lái)做的,目前主流的公有云都有各家的DTS工具,DTS的工具原理基本都是從源庫(kù)binlog讀取數(shù)據(jù)然后插入到目標(biāo)數(shù)據(jù)庫(kù)。但各家的DTS工具容錯(cuò)性還是相差比較大的。下面我就說(shuō)說(shuō)數(shù)據(jù)庫(kù)同步碰到的那些坑。
1、數(shù)據(jù)庫(kù)中的表字段要允許NULL
在MySQL同步過(guò)程中出現(xiàn)Error3140:InvalidJSONtext:"Thedocumentisempty."atposition0invalueforcolumn,
原因是源庫(kù)校驗(yàn)不嚴(yán)格。數(shù)據(jù)庫(kù)中的字段要求為NOTNULL,但是數(shù)據(jù)中存在值為NULL的數(shù)據(jù)。
有兩個(gè)解決方法,根據(jù)需要處理:
(1)對(duì)源庫(kù)中的數(shù)據(jù)進(jìn)行修復(fù),將所有值NULL的數(shù)據(jù)修正為正確的值(這也符合業(yè)務(wù)邏輯需要)。
(2)對(duì)目標(biāo)庫(kù)中的表進(jìn)行修改,將字段修改為允許為NULL。例如表為xxxx,字段為total
ALTERTABLE`xxxx`CHANGE`total``total`JSONNULL;
2、數(shù)據(jù)庫(kù)源庫(kù)binlog要保留時(shí)間久一點(diǎn)
在執(zhí)行數(shù)據(jù)庫(kù)同步的時(shí)候可能會(huì)碰到問(wèn)題而導(dǎo)致需要重新啟動(dòng)做增量同步,但是有時(shí)這個(gè)同步是在晚上進(jìn)行的,早上人為發(fā)現(xiàn)問(wèn)題可能距離出現(xiàn)問(wèn)題已經(jīng)過(guò)去了好幾個(gè)小時(shí)。
如果源庫(kù)這個(gè)時(shí)候binlog只保留1~2個(gè)小時(shí)的話會(huì)導(dǎo)致用戶在早上重啟同步任務(wù)時(shí)找不到對(duì)應(yīng)的binlog文件,從而只能再次做全量同步。建議源庫(kù)binlog在同步時(shí)保留2~3天以上。
3、目標(biāo)數(shù)據(jù)庫(kù)磁盤(pán)空間建議是源庫(kù)的2倍
在執(zhí)行數(shù)據(jù)庫(kù)同步的時(shí)候目標(biāo)庫(kù)除了會(huì)有大量的寫(xiě)入外還會(huì)有一些臨時(shí)表及日志產(chǎn)生。如果兩個(gè)庫(kù)的磁盤(pán)空間一樣大很容易產(chǎn)生目標(biāo)庫(kù)磁盤(pán)空間不足導(dǎo)致寫(xiě)入失敗的問(wèn)題。這樣無(wú)疑會(huì)浪費(fèi)很多的時(shí)間去處理。
所以建議是目標(biāo)數(shù)據(jù)庫(kù)磁盤(pán)空間先申請(qǐng)?jiān)磶?kù)的2倍空間。如果費(fèi)用相差不大遷完后就不要降了。
4、數(shù)據(jù)庫(kù)同步時(shí)不能有計(jì)劃任務(wù)
在同步數(shù)據(jù)庫(kù)時(shí)DTS突然報(bào)出了一個(gè)主鍵ID錯(cuò)誤的日志,同時(shí)同步也中斷了。后來(lái)經(jīng)過(guò)調(diào)研發(fā)現(xiàn)用戶數(shù)據(jù)庫(kù)有計(jì)劃任務(wù)在跑導(dǎo)致的。所以在同步數(shù)據(jù)庫(kù)時(shí)必須關(guān)閉針對(duì)數(shù)據(jù)庫(kù)的計(jì)劃任務(wù)。
ES遷移問(wèn)題
ES遷移本身并沒(méi)有什么問(wèn)題,但是ES不同版本之間是有較大差異的,不仔細(xì)測(cè)試是發(fā)現(xiàn)不了一些隱藏的問(wèn)題的。
客戶碰到的ES問(wèn)題是之前在XX云用的是ES低版本,默認(rèn)分片為5。切換至XX云用的是ES7版本,默認(rèn)分片是1。
正常客戶業(yè)務(wù)使用時(shí)需要根據(jù)業(yè)務(wù)去修改分片數(shù),來(lái)適配業(yè)務(wù)。但客戶并沒(méi)有這么做導(dǎo)致了生產(chǎn)事故。幫客戶去重建索引調(diào)整分片數(shù)后問(wèn)題得到了解決。
DNS問(wèn)題
遷移最后必定會(huì)經(jīng)歷域名的切換,域名切換覆蓋全國(guó)和全世界時(shí)間都是不一定的,且不同的區(qū)域都會(huì)有一定的差異。
客戶就碰到了某個(gè)項(xiàng)目訪問(wèn)有問(wèn)題的情況。我們的做法是,在原公有云入口部署nginx,只要還是訪問(wèn)到原nginx的都proxy_pass到新的公有云入口。這樣就保證了不會(huì)有人訪問(wèn)到老環(huán)境的情況。
結(jié)論:應(yīng)用跨云遷移,看似一件非常簡(jiǎn)單的事情,實(shí)則充滿了很多未知的問(wèn)題。這些問(wèn)題可能是公有云產(chǎn)品造成的可能是業(yè)務(wù)代碼造成的。
但無(wú)論是什么原因,新鈦云服作為一家專(zhuān)業(yè)的云管理服務(wù)商都能很好的處理好這些問(wèn)題,并在遷移過(guò)程中為客戶梳理信息,優(yōu)化架構(gòu)和運(yùn)維流程,為客戶業(yè)務(wù)保駕護(hù)航。