国产在线观看精品免费,亚洲日本VA久久一区二区,香蕉久久99综合一区二区三区,久久精品99国产精品蜜桃小说

跨云遷移過(guò)程中的數據同步及一致性校驗實(shí)踐(二)

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


數據規整階段

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

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

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

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

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

  • 結束應用進(jìn)程

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

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

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

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


數據割接階段

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

總結

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




我要咨詢(xún)
武穴市| 永定县| 泰顺县| 青神县| 恭城| 双峰县| 平谷区| 得荣县| 梁河县| 永仁县| 乐业县| 敦化市| 财经| 襄樊市| 莎车县| 虎林市| 清丰县| 年辖:市辖区| 陆良县| 洮南市| 溧水县| 渑池县| 南昌市| 文登市| 祁阳县| 鹤峰县| 从化市| 治县。| 太康县| 台东市| 措勤县| 深圳市| 新巴尔虎左旗| 婺源县| 连城县| 高台县| 辰溪县| 彭州市| 闻喜县| 东乡县| 太康县|