久久久久无码精品,亚洲国产精品国语在线,国产成人精品热玖玖玖,国产福利一区二区在线观看

跨云遷移過程中的數(shù)據(jù)同步及一致性校驗(yàn)實(shí)踐(二)

2021-11-04 13:38:19 shuai.chang
《跨云遷移過程中的數(shù)據(jù)同步及一致性校驗(yàn)實(shí)踐(一)》中主要介紹了跨云遷移中數(shù)據(jù)同步階段的存儲組件MySQL、文件存儲和對象存儲的數(shù)據(jù)遷移過程,本文將重點(diǎn)圍繞跨云遷移的數(shù)據(jù)規(guī)整階段(清理測試時產(chǎn)生的臟數(shù)據(jù))和數(shù)據(jù)割接階段的技術(shù)細(xì)節(jié)進(jìn)行解析。


數(shù)據(jù)規(guī)整階段

1、臟數(shù)據(jù)處理
正如前文提到,為了了解新平臺中應(yīng)用是否能正常運(yùn)行,一般來說遷移過程中涉及到的應(yīng)用測試都會盡量使用真實(shí)數(shù)據(jù),甚至采用流量重放的方法對新系統(tǒng)進(jìn)行測試,以便通過對比原平臺環(huán)境中真實(shí)行為的結(jié)果來校驗(yàn)新平臺應(yīng)用是否正常工作。
在測試之后,新平臺就會出現(xiàn)臟數(shù)據(jù),需要對其進(jìn)行處理。通常臟數(shù)據(jù)的處理有兩種思路可以使用,其一是回滾,就是在開展業(yè)務(wù)測試前先對數(shù)據(jù)進(jìn)行備份或者記錄還原點(diǎn)。對于MySQL數(shù)據(jù)庫可以基于binlog進(jìn)行回滾,也可以通過云平臺能力進(jìn)行數(shù)據(jù)庫備份和回滾,但是需要注意備份時暫停UDTS任務(wù)以及其它寫入,以及記錄binlog位置。對于文件存儲和對象存儲,文件變更日志的作用就很顯著了,所有變更過的文件從日志中解析出來之后從源頭重新同步,這樣可以避免所有文件的重新同步。

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商

當(dāng)然也可以丟掉全部臟數(shù)據(jù),采取與數(shù)據(jù)同步階段相同的數(shù)據(jù)遷移手段對數(shù)據(jù)進(jìn)行重新同步,這樣雖然慢一些,但是整個數(shù)據(jù)同步過程就是冪等的,可重復(fù)性更強(qiáng)。兩種臟數(shù)據(jù)的處理方式可以根據(jù)實(shí)際數(shù)據(jù)量靈活采用。
2、保障數(shù)據(jù)一致性
在割接準(zhǔn)備階段時候進(jìn)行的數(shù)據(jù)同步所得到的數(shù)據(jù)就是割接和割接后的生產(chǎn)數(shù)據(jù)了,所以需要通過一定的手段,保障數(shù)據(jù)的持續(xù)同步,同時避免數(shù)據(jù)被意外修改。下面說說幾種保障的辦法。

  • 基于用戶的數(shù)據(jù)庫只讀

對于MySQL而言,通過對數(shù)據(jù)同步和業(yè)務(wù)應(yīng)用設(shè)置不同的賬戶,并且對不同用戶分配不同的權(quán)限,這幾乎是最簡單易行的實(shí)踐方式。設(shè)立數(shù)據(jù)同步賬戶,賦予增刪查改權(quán)限和DDL語句的權(quán)限,這樣可以滿足存量和增量數(shù)據(jù)同步的需要,然后將數(shù)據(jù)同步賬戶嚴(yán)格控制只配置給UDTS數(shù)據(jù)同步工具和sync_diff_inspector數(shù)據(jù)校驗(yàn)工具。
而對于業(yè)務(wù)應(yīng)用的配置文件,或者記錄到配置中心中的配置,上面所使用的數(shù)據(jù)庫賬戶就只分配select語句權(quán)限,這樣就能保障業(yè)務(wù)應(yīng)用、腳本或者各種定時任務(wù)都無法對數(shù)據(jù)進(jìn)行更改。而且這樣做還有一個好處,對于一些沒有實(shí)現(xiàn)數(shù)據(jù)庫重連邏輯的業(yè)務(wù)應(yīng)用,這時候數(shù)據(jù)庫是可以正常連接的,這意味著在數(shù)據(jù)割接的時候不需要重啟應(yīng)用,而是只需要調(diào)整MySQL中業(yè)務(wù)賬戶的權(quán)限。
對于一些場景,不重啟對于割接過程來說是非常重要的。例如由于分布式框架的引入,對象和方法可以輕松的通過RPC獲取,這時候業(yè)務(wù)團(tuán)隊(duì)也專注于業(yè)務(wù)的實(shí)現(xiàn),忽略了底層重連機(jī)制的實(shí)現(xiàn)。結(jié)果就是應(yīng)用系統(tǒng)成為了一個分布式的緊耦合系統(tǒng),主機(jī)A上某個進(jìn)程的正常運(yùn)行需要依賴主機(jī)B上進(jìn)程的正常運(yùn)行,而且B還不能隨便重啟,因?yàn)橹貑⒑驛不會重連。這時候如果應(yīng)用不用重啟,那意味著清理臟數(shù)據(jù)后,應(yīng)用保持當(dāng)前的運(yùn)行狀態(tài)即可,而不是調(diào)查所有應(yīng)用的啟動順序,在割接時確認(rèn)數(shù)據(jù)同步后再按順序逐個啟動,這樣有利于提升割接后的業(yè)務(wù)穩(wěn)定性和降低割接操作的復(fù)雜度。
然而,通過數(shù)據(jù)庫只讀來保障數(shù)據(jù)一致性的方式受限也會比較多,例如MySQL有基于用戶的只讀方法,同時Redis、SQLServer、MongoDB、Elastic Search、文件存儲、對象存儲等等組件又有各自不同的只讀方法,在組件數(shù)量和種類增加以后,這種操作方式的優(yōu)勢會逐漸喪失。
因此,數(shù)據(jù)庫只讀的方式適用于MySQL數(shù)據(jù)庫且實(shí)例數(shù)量不多的情況,例如整體遷移以模塊化方式進(jìn)行的情況。另外對于需要盡量減少應(yīng)用重啟的系統(tǒng)也可以優(yōu)先考慮這種方式來保障數(shù)據(jù)一致性。

  • 結(jié)束應(yīng)用進(jìn)程

前面提到,在一些應(yīng)用系統(tǒng)里重啟應(yīng)用并不是易事,但有一些應(yīng)用系統(tǒng),重啟造成的困擾并沒有那么大,可以相對自由的重啟應(yīng)用。實(shí)際上對于一個系統(tǒng)而言,會有三類程序可能對數(shù)據(jù)存儲進(jìn)行修改,分別是應(yīng)用程序和操作系統(tǒng)定時任務(wù)腳本,對于數(shù)據(jù)庫而言還需要多加一個定時任務(wù)。只需要保證這三類程序都是停止的,那么就可以保證沒有同步服務(wù)以外的程序?qū)?shù)據(jù)進(jìn)行修改,從而保障數(shù)據(jù)一致性。
通過這種方法來保證數(shù)據(jù)不被意外修改的優(yōu)勢在于它是普遍適用的,不管提供存儲服務(wù)的是數(shù)據(jù)庫或者其他類型的存儲組件,只要進(jìn)程停了數(shù)據(jù)就不可能被修改。
但是這種處理方法的限制也是很明顯的,首先就是應(yīng)用可以隨意重啟。其次是在分布式環(huán)境下面,需要具備批量的啟動或者關(guān)閉應(yīng)用程序,以及修改操作系統(tǒng)定時任務(wù)的能力,不管是基于Ansible或者其他方式。除此以外也需要確保生產(chǎn)環(huán)境中應(yīng)用程序和腳本的統(tǒng)計是正確的,也就是說所有應(yīng)用程序和腳本都是運(yùn)維和開發(fā)共同知曉的。例如運(yùn)維為了短時間方便,編寫腳本作用在生產(chǎn)環(huán)境的數(shù)據(jù)而不被其他同事所了解,那在停止應(yīng)用的時候自然也不會被考慮到。
總結(jié)來說,結(jié)束應(yīng)用程序的方式適合應(yīng)用可以各自獨(dú)立啟停,且生產(chǎn)環(huán)境應(yīng)用、腳本和數(shù)據(jù)庫定時任務(wù)都完全統(tǒng)計清楚明確的情況下使用。

  • ACL網(wǎng)絡(luò)隔離

通過ACL網(wǎng)絡(luò)對數(shù)據(jù)存儲服務(wù)做隔離是一個操作上相對比較簡單的方法。簡單來說,就是在網(wǎng)絡(luò)環(huán)境上配置ACL,允許數(shù)據(jù)同步服務(wù)連接存儲并且禁止其它應(yīng)用主機(jī)連接。這種方法的優(yōu)勢在于規(guī)則的套用和解除都相對簡單,在數(shù)據(jù)同步時直接對整個VPC子網(wǎng)生效,在割接時候只需要在控制臺上解除,從而對整個VPC子網(wǎng)的存儲服務(wù)做到批量控制。而且相比于數(shù)據(jù)庫只讀和結(jié)束應(yīng)用進(jìn)程這兩種方法,通過網(wǎng)絡(luò)ACL進(jìn)行隔離則不用依賴于運(yùn)維團(tuán)隊(duì)對全系統(tǒng)所有細(xì)節(jié)的掌握,對所有基于網(wǎng)絡(luò)的存儲服務(wù)進(jìn)行覆蓋,可以說完全具備了前面兩種數(shù)據(jù)一致性保護(hù)方式的優(yōu)點(diǎn)。
當(dāng)然ACL網(wǎng)絡(luò)隔離的方法也有它的適用場景限制。其中最主要的是這種方式的實(shí)施要求運(yùn)維團(tuán)隊(duì)對各個子網(wǎng)的功能劃分是清晰明確的,網(wǎng)絡(luò)入口、業(yè)務(wù)應(yīng)用和數(shù)據(jù)存儲分別在不同的子網(wǎng),所以如果應(yīng)用習(xí)慣了大二層的部署方式,那么網(wǎng)絡(luò)ACL的批量管理優(yōu)勢就會大打折扣。其次,由于對應(yīng)用的網(wǎng)絡(luò)中斷,因此對于沒有重連機(jī)制的應(yīng)用,網(wǎng)絡(luò)重新開通后依然需要重啟應(yīng)用。最后,這一方法對于不連網(wǎng)絡(luò)的應(yīng)用是無法限制的,例如云硬盤本地存儲,這種情況需要以掛載云硬盤的主機(jī)為單位去考慮網(wǎng)絡(luò)隔離。
經(jīng)過對上面三種保障數(shù)據(jù)一致性方法的對比,可以發(fā)現(xiàn)這三種方法其實(shí)并沒有相互沖突的點(diǎn),在實(shí)際中我們可以靈活組合來匹配更多業(yè)務(wù)環(huán)境的要求,例如同時使用結(jié)束應(yīng)用進(jìn)程和ACL網(wǎng)絡(luò)隔離。
【案例】
在XX公司的跨云遷移任務(wù)中,我們在前期調(diào)研中發(fā)現(xiàn)了幾個問題。首先是數(shù)據(jù)庫實(shí)例數(shù)量眾多,源庫和目標(biāo)庫既有自建的也有云平臺產(chǎn)品,具體操作方式各有差異;其次是數(shù)據(jù)存儲服務(wù)種類眾多,除了MySQL以外,還有MongoDB、SQL Server、NFS存儲、Elastic Search等,逐個組件去設(shè)計讀寫-只讀切換的邏輯需要運(yùn)維人員很大的精力投入。另一方面,由于目標(biāo)系統(tǒng)對存儲和應(yīng)用有比較好的網(wǎng)段劃分,雖然組件眾多,但是至少都在相同子網(wǎng)內(nèi),適合使用ACL來隔離。最后,由于應(yīng)用層面沒有讀寫-只讀的切換開關(guān),也沒有實(shí)現(xiàn)重連機(jī)制。
所以,在實(shí)際操作過程中,我們推薦客戶使用了結(jié)束應(yīng)用進(jìn)程和ACL網(wǎng)絡(luò)隔離的雙重保險,因?yàn)閼?yīng)用不具備重連實(shí)現(xiàn)的情況下,割接測試前應(yīng)用至少需要重啟一次,ACL和結(jié)束應(yīng)用的限制都會被接受。與此同時,ACL隔離也補(bǔ)充了結(jié)束應(yīng)用的覆蓋面,從網(wǎng)絡(luò)層面保障不會有數(shù)據(jù)同步組件以外的系統(tǒng)連接到數(shù)據(jù)存儲層面來進(jìn)行操作。

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


數(shù)據(jù)割接階段

不管是整體割接,還是以業(yè)務(wù)模塊為單位的割接,時間窗口大小總是有限的,而且從業(yè)務(wù)角度也希望割接窗口越小越好。
1、數(shù)據(jù)校驗(yàn)時機(jī)
數(shù)據(jù)校驗(yàn)最早應(yīng)該在完成數(shù)據(jù)規(guī)整階段后才啟動,這一點(diǎn)應(yīng)該是可以簡單理解的,因?yàn)閿?shù)據(jù)規(guī)整前的數(shù)據(jù)不用作割接后投產(chǎn),沒有校驗(yàn)價值。而在前面數(shù)據(jù)校驗(yàn)章節(jié)中提到,數(shù)據(jù)校驗(yàn)分為兩種,一種是sync_diff_inspector這類實(shí)體數(shù)據(jù)校驗(yàn),另一種是select max(id)這類元數(shù)據(jù)校驗(yàn),兩種方法并不沖突,在實(shí)際任務(wù)中可以靈活安排來減少對割接時間窗口的壓力。
【案例】
以近期XX公司遷移到UCloud項(xiàng)目為例,割接時間只有凌晨12點(diǎn)到早上6點(diǎn)的6個小時,中間需要進(jìn)行應(yīng)用配置和業(yè)務(wù)測試,留給數(shù)據(jù)校驗(yàn)的時間不多,所以早在數(shù)據(jù)割接之前就啟動了sync_diff_inspector對實(shí)體數(shù)據(jù)進(jìn)行校驗(yàn)。結(jié)果數(shù)據(jù)校驗(yàn)時間和效果都如前預(yù)料,最大一個500G數(shù)據(jù)庫的實(shí)體數(shù)據(jù)校驗(yàn)花費(fèi)了1天多的時間,同時多個數(shù)據(jù)庫的校驗(yàn)也發(fā)現(xiàn)了少量的不一致,這一部分不一致經(jīng)過人工對比后發(fā)現(xiàn)實(shí)際一致。隨后在割接過程中進(jìn)行元數(shù)據(jù)校驗(yàn),結(jié)果隨著消息隊(duì)列完成消費(fèi)和定時任務(wù)結(jié)束,兩邊的select max(id)或者select count(id)結(jié)果最終一致了。
2、割接與回滾
在割接階段,不得不考慮的一個問題就是回滾,在割接過程中發(fā)現(xiàn)數(shù)據(jù)確實(shí)出現(xiàn)了不一致,這時就需要對不一致的范圍做合理的評估。如果在割接時間窗口中的元數(shù)據(jù)校驗(yàn)如果發(fā)現(xiàn)不一致,這時候最明智的處理手段就是回滾,而保障原平臺沒有臟數(shù)據(jù)則是回滾的基礎(chǔ)。
【案例】
以xx公司遷移到UCloud為例,在托管IDC遷移到UCloud混合云的過程中,由于業(yè)務(wù)依賴較少,所以采用了可以敏捷割接和回滾的業(yè)務(wù)模塊遷移方式。在這一案例的割接實(shí)踐中,運(yùn)維團(tuán)隊(duì)不僅為數(shù)據(jù)庫設(shè)置了只讀,而且也在業(yè)務(wù)應(yīng)用中嵌入了只讀開關(guān),只要通過配置中心發(fā)布開啟只讀開關(guān)即可生效。在數(shù)據(jù)庫只讀后就參考數(shù)據(jù)同步階段的數(shù)據(jù)校驗(yàn)方式,對數(shù)據(jù)或者元數(shù)據(jù)進(jìn)行校驗(yàn),最后在確認(rèn)應(yīng)用的讀取功能都正常以后再解除目標(biāo)庫的只讀,并開放業(yè)務(wù)。在這個案例中回滾也是相對簡單的,如果發(fā)現(xiàn)應(yīng)用的讀取功能異常,這時候只需將應(yīng)用重新部署回原平臺,啟動和解除數(shù)據(jù)庫只讀即可。
而對于需要進(jìn)行整體割接的任務(wù),割接過程相比于模塊化的割接會復(fù)雜一些,但是與模塊化割接的機(jī)理大同小異。在割接過程中先通過停用負(fù)載均衡、設(shè)置ACL的方式停止業(yè)務(wù)入口,等待消息隊(duì)列完成消費(fèi)數(shù)據(jù)落地以及定時任務(wù)運(yùn)行完成,然后參考割接準(zhǔn)備階段的方法對原平臺數(shù)據(jù)進(jìn)行保護(hù)。在完成原平臺的數(shù)據(jù)封存后,需要等待同步任務(wù)最終完成同步以及對數(shù)據(jù)進(jìn)行校驗(yàn),具體的數(shù)據(jù)校驗(yàn)方法是參考前文中數(shù)據(jù)校驗(yàn)方法完成的。在確認(rèn)兩邊平臺數(shù)據(jù)一致后,就可以停止同步,在新平臺啟動應(yīng)用和進(jìn)行內(nèi)部測試。
至于回滾操作,本身也是有時間邊界的,當(dāng)新平臺業(yè)務(wù)入口做了灰度開放后就不能進(jìn)行回滾操作了,因?yàn)檫@時候有很大機(jī)率真正的客戶數(shù)據(jù)已經(jīng)寫入到新平臺,但是這部分新數(shù)據(jù)又沒有同步回原平臺,這樣兩邊數(shù)據(jù)就是不一致的。但是一般而言,只要保證遷移兩邊平臺數(shù)據(jù)是一致的,應(yīng)用程序大多是應(yīng)用狀態(tài)或者代碼邏輯問題,相對可控。

總結(jié)

以上就是筆者關(guān)于跨云遷移在數(shù)據(jù)同步、規(guī)整和割接過程中保障數(shù)據(jù)一致性的一些實(shí)踐和思考,希望對遇到同類問題的大家有所幫助。當(dāng)然,本文所闡述的數(shù)據(jù)遷移同步的解決方案也適用于本地IDC遷移上云的場景。




我要咨詢
青阳县| 汕头市| 湘阴县| 云霄县| 蓝山县| 昌都县| 德保县| 大城县| 漳浦县| 衢州市| 清水河县| 从江县| 泸溪县| 汉川市| 兰考县| 增城市| 石首市| 庆安县| 南木林县| 永和县| 武乡县| 阳江市| 囊谦县| 平遥县| 论坛| 甘德县| 民乐县| 清苑县| 苏尼特右旗| 黄山市| 团风县| 六安市| 凤阳县| 徐汇区| 焉耆| 阿鲁科尔沁旗| 泸州市| 交口县| 通城县| 棋牌| 翁牛特旗|