閱讀258 返回首頁    go 阿裏雲 go 技術社區[雲棲]


解讀數據傳輸DTS技術架構及最佳實踐

摘要:8月24日,阿裏雲數據庫技術峰會到來,本次技術峰會邀請到了阿裏集團和阿裏雲數據庫老司機們,為大家分享了一線數據庫實踐經驗和技術幹貨。在本次峰會上,阿裏巴巴高級技術專家付大超(千震)針對於雲計算時代最好的數據傳輸產品阿裏雲DTS的架構設計、基本原理以及相關的應用場景進行了精彩分享。幫助大家了解了阿裏是如何實現異地多活和異構多活的,以及通過DTS輕鬆實現遷移、雙同同步、容災、訂閱的真實案例。

以下內容根據演講嘉賓現場視頻以及PPT整理而成。

本次分享的內容主要圍繞以下四個部分:
一、DTS技術架構
二、DTS異地&異構多活架構
三、DTS應用案例
四、最佳實踐

一、DTS技術架構
DTS產生的背景
大家下午好,如下圖中左側所示的是幾年之前的支付寶發布的一條微博信息,這條微博主要表達的是因為當時杭州的溫度很高,導致當時的用電壓力比較大,而為了保證居民的正常用電,甚至連阿裏巴巴的機房也因此受到限電。而這樣的限電卻可能會對於阿裏的服務、支付寶的服務甚至是阿裏雲的服務造成影響。在幾年之前,阿裏巴巴就在思考將服務搬到另外一個地方去,這樣即使杭州出現了一些像機房全部斷電這樣由於不可控因素產生無法提供服務的情況,阿裏也依舊能夠為全球的用戶提供在線服務。所以為了實現上述目標,阿裏逐漸開始實現異地多活的場景。
82cfd4e12a738d3d52da1c26f342092c67354b9f
上圖中右側所展示的是中國人民銀行對於數據中心出現的問題的數據統計。可以看出數據中心所出現的問題種類還是比較多的,其中比較典型的就是主機故障、電源故障等。總而言之,就是數據中心會出現各種各樣的異常情況導致服務中斷。在本質上來說,這樣的異常情況是不可以避免的,阿裏巴巴在思考該如何解決這些問題的時候就想到了可以通過將數據中心做成異地甚至是全球的架構,這樣就可以盡可能地避免因為異常情況導致的服務不可用。比如在雙11場景之下,當某一個機房掛掉了,業務也並不會受到影響。為了實現這樣的目標,也就產生了DTS這款產品。

DTS簡介
後來發現阿裏雲也存在著與阿裏巴巴同樣的需求,因為很多用戶需要將自己的數據遷移到阿裏雲上來去構建自己的數據架構,這時候也會遇到同樣的問題。於是DTS這款產品逐漸地從內部開放到外部,開始對外提供服務。所以在今天,阿裏雲的外部客戶能夠享受到與阿裏內部一樣的基礎設施和服務。
08434ba6efdba371c57bfc857866e88456c9f3ae
目前,DTS產品有這樣的幾個功能,典型的就是用戶上雲時需要進行數據遷移,幫助用戶將本地機房的數據遷移到阿裏雲的其他數據庫或者用戶在ECS上自建的數據庫上去。總而言之,DTS產品的目標就是打通整個數據鏈路。之前的數據在每個產品中,這樣相當於是數據孤島,而通過DTS產品能夠消除數據孤島,將數據鏈路完全打通,驅動數據自由地流動。除此之外,DTS的功能還有實現長期的數據同步,這一點與數據遷移不同,在長期的數據同步過程中必定會對於可用性、性能以及安全性提出更高的要求,而DTS能夠提供長期的數據同步能力。DTS的第三個功能就是實現數據訂閱,一些用戶在阿裏雲上擁有很多的數據庫,而用戶想要將RDS的增量數據訂閱回去,更加靈活地構建自己的數據架構。DTS還提供了一點功能就是文件遷移,可以將像SQL以及CSV等以文件的形式導過來。

通過上述的功能,DTS就能夠在應用場景下提供更強大的服務能力。阿裏雲上的數據庫都能夠支持DTS,而用戶在ECS上自建的數據庫以及用戶在本地IDC上自建的數據庫,包括MySQL、Oracle、SQL Server、PG、MongoDB以及Redis都是能夠支持DTS的,而且相對比較特別的是DTS還能夠支持增量的能力。而就目前而言,能夠支持Oracle、SQL Server、Redis的增量能力的雲產品隻有DTS能夠做到。

DTS發展曆史
d26b4d3c4d90aa25c184d74230684991ae7f51af
DTS的發展經曆了很多個階段,其發展成熟的過程也經曆了一定的演變。在今天,DTS能夠支持雙11這樣的場景,其背後是一步一個腳印走下來的,所以每年也都會逐步地實現新的特性。在2012年的時候,DTS就實現了異地冷備;在2013年,實現了同城雙活;在2014年實現了異地多活;在2015年的時候,支付寶和天貓國際都開始了全球化的步伐,而這些交易數據是需要進行全球同步的,因為中美之間的鏈路足夠長,所以DTS也實現了中美同步,解決了在上萬公裏的天然網絡延遲的情況下的延時問題以及網絡傳輸的優化問題;最後,在2016年DTS實現了異構雙活,也就是實現了兩個異構的數據庫比如從Oracle到MySQL或從MySQL到OceanBase這樣異構場景的雙向多活。

DTS架構設計
3b4556e55919e6e0ada2c865dd667ecef2ac180f
上圖所展現的是用戶維度的DTS產品的架構設計。在最外層所提供了用戶可以直接進行操作的控製台,同時也提供了OpenAPI。阿裏雲在上周上線了OpenAPI的完整文檔來幫助用戶更好地使用這款產品。用戶通過控製台以及OpenAPI這兩種途徑都可以建立DTS的任務,這樣的任務會發到反向代理集群,再到前端集群,最後再下發到核心的工作集群上去。在DTS底層會存在一個任務調度係統,DTS本身是全球服務的,所以可以將命令下發到全球。DTS將能夠提供幾個功能,比如數據遷移係統就需要解決數據一致性的問題,無論是無主鍵表還是InnoDB引擎,DTS都能支持用戶將數據輕鬆地遷移到RDS或者自建的ECS甚至是大數據係統上去。除此之外,DTS還提供了數據同步以及數據訂閱的功能。而且還提供了上雲評估功能,這個功能能夠幫助用戶更加輕鬆地評估自己的係統,因為阿裏雲的用戶中有一些用戶對於自己的係統並不了解,而且可能並沒有專業的DBA,所以這些係統需要一款產品能夠為用戶提供一些對於係統所存在的問題的建議,比如將數據從Oracle遷移到MySQL可能出現哪些內容不兼容,可能有哪些無主鍵表,可能有哪些大字段,以及性能如何等。DTS能夠為用戶的係統提供一個基本的測試報告,讓用戶可以看到改造成本是什麼樣的。除了核心功能之外,DTS還會提供一些輔助係統,比如監控係統、運維係統、以及運輸係統等。

架構優勢:高性能
接下來分享DTS的架構優勢,來幫助大家更加清晰地了解應該在什麼樣的場景上去應用DTS,並且更好地利用DTS的特性來快速實現業務的快速發展。首先,DTS的第一個架構優勢就是高性能,如果用戶想要快速地實現異地災備或者上雲,DTS可以幫助用戶使得同步性能達到3萬多TPS,當然這個數據是在實驗場景之下的。阿裏雲經常會在用戶所提交的工單中發現用戶的源庫和目的庫之間的差別很大,這樣的情況下往往達不到上述的性能。
d71a7020bb4477a8c8ba6a1bc6d9448c332aaf53
但是DTS會盡可能地提供比測試數據更高的性能,當用戶在實際使用的時候就能夠感知到即使庫寫的很大,DTS也能夠支持。這是因為DTS內部有一整套通用的解決方案,比如事務衝突檢測能夠實現並發的事務寫入。舉個例子,事務1寫了表A和表B兩張表,另外一個事務2寫了表C,還有一個事務3寫了表A和表D這兩張表,這樣的話,事務1和事務3是衝突的,因為他們都寫了A這張表,而事務2與他們都不相關,所以事務2是可以和他們並行執行的,而事務1和事務3隻能是串行執行的。這個例子非常簡單,而在實際情況下卻並非如此,因為每個表都有主鍵、唯一索引以及外鍵,上述例子隻是為了幫助大家進行理解。補充一點:MySQL的事務處理比較簡單,但是Oracle數據庫的事務則不同,其事務是穿插的,所以在Oracle中實現事務衝突檢測就會非常複雜。大家如果做過Oracle的日誌解析就會發現其中存在非常大的困難,而目前無論是對於MySQL、Oracle、SQL Server、Redis還是MongoDB,DTS都能夠提供支持。

架構優勢:高可靠
DTS的第二個架構優勢就是高可靠。雲計算本身所具有的特性之一就是可以彈性伸縮,當需要資源的時候就去購買,當不需要的時候就釋放掉。而DTS的架構設計上也引入了彈性的思想,在為全球提供服務的時候,任何一個服務節點發生故障時,故障節點的任務自動切換到健康的節點繼續完成之前的工作,而應用卻是無感知的。
f35243e43bab56e4a5701d230581a478e8628100
這時候就會涉及到一些問題,比如斷點是如何解決的,另外如果表在全量遷移的過程中掛掉了,是否能連接起來之後從掛掉的地方繼續運行,這樣盡可能節約時間和計算成本,除此之外還會涉及到無主鍵表所造成的困難,而這些困難和問題都已經被DTS所解決了。總而言之,DTS能夠為用戶在使用過程中屏蔽掉這些問題。

基於結構化存儲隊列的查詢和分發技術
3bb49f9f2f7d4ed948e8365607d8c041ae5e7f01
那麼為什麼DTS在架構上具有一定的領先性呢?一部分原因是DTS所有的增量解析能力都是基於日誌實現的,而不是基於查詢源庫的Select表實現的。阿裏雲所有的數據庫產品的增量能力都是基於日誌實現的,這樣能夠帶來一些好處,首先對於源庫基本上是沒有影響的,而且使得性能足夠好,可以實現實時地解析,基本上可以做到秒級,而且大部分的數據同步都在幾百毫秒。在做日誌解析過程中就需要結構化數據隊列這個組件,它所能夠實現的功能就是無論使用的是哪一種數據庫,都可以將其日誌解析過來並且放入到結構化數據隊列裏麵,將其解析成DTS所需要的格式。接下來就可以通過這個結構化數據隊列為下遊提供服務,比如用戶訂閱數據、進行數據同步以及未來將會開放的SQL接口的實時查詢等。SQL接口的實時查詢指的是比如用戶想要知道數據庫在過往的曆史中究竟發生了什麼樣的變更,這時就可以根據表格的ID查詢該表所有的曆史變更記錄,目前而言這個功能還沒有開放出來,後續將會考慮開放。因為這樣的架構,所以所有的數據庫接入進來都會有天然的實時性。阿裏雲的DTS是在2015年4月份上線的,而亞馬遜AWS在2015年9月份上線了一個類似的產品,但是今天可以不謙虛地說阿裏雲DTS是目前同類產品中做的最好的。

二、DTS異地&異構多活架構
DTS異地多活
接下來根據下麵這張圖分享DTS的異地多活是如何實現的。其實在實現阿裏巴巴的異地多活的時候就已經將這套東西整合總結出來了,所以也希望將這套比較複雜的能力賦予公有雲的用戶,比如阿裏雲DTS輸出了一個雙向輸出的功能,也就是異地多活的能力,使得用戶可以親身地構建這套東西。在下圖所示的場景裏麵,用戶擁有一個A城主庫還有一個B城主庫,並且希望實現異地雙活。
0b3e2fa6de041ac5724c8c7233f0c671d5c391b3
用戶希望既寫A城主庫又寫B城主庫,通過DTS就是先建立一個從A到B的正向任務,也就是中間通過一個結構化隊列以及DWriter模塊實現與所有的數據庫之間的事務一致性的寫入。這裏特別強調在場景上必須實現事務一致性,這是因為像是在天貓或者淘寶下單的時候,訂單往往會涉及到幾百條SQL以及幾個庫,而且一個事務可能會涉及到幾個表的若幹個字段,而其本質上是一個事務,而如果將事務拆開並且同步到B城主庫上麵去的時候就會發現有些數據當讀取過來之後就是不一致的,比如對於一筆訂單而言,可能在A城主庫中讀取的數據發現已經支付,但是在B城中讀取出來的數據發現這筆訂單還沒有支付,這就會產生數據不一致的問題。所以希望在這樣的場景下也能夠保持事務的一致性,這一點也是非常重要的,否則的話在一些非常嚴格的場景下會產生非常多的問題,比如像銀行的流水業務場景。所以DTS所需要解決的問題中,一個是日誌的解析,另外一個就是通用的事務解決方案,這樣一來正向的方案就建立完成了,同樣的反向方案也能夠建立。但是在建立反向方案的時候需要解決防循環的問題,也就是不能出現讓從A城主庫寫的數據到了B城主庫然後又回到A城主庫這樣的循環。而防止循環的方案在DTS的異地多活場景中也已經實現了。

DTS異構多活
其實在這個場景之下還有一個比較大的問題就是兩邊數據庫都可以寫入,如何去判斷數據是否一致,當數據出現不一致時如何判斷出來,以及在判斷出來之後又應該如何去進行修複。而且如果沒有這樣的修複能力,一旦數據出現了問題,損失將是無法挽回的。在今天,阿裏巴巴的淘寶、天貓以及支付寶的交易都是搭建在這樣的平台之上的,如果出現數據不一致的情況,將會造成極大的影響和損失。正是因為數據一致的問題非常重要,所以一定要有數據的一致性校驗的能力,而在DTS的異地多活解決方案中恰恰擁有這樣的能力,能夠輕鬆地校驗兩端的數據庫是否是一致的,並且可以非常輕鬆地訂正表,當出現問題時也可以及時地進行修複。

在下圖所示的場景中,展現的是從Oracle數據庫遷移到OceanBase或者MySQL數據庫。阿裏雲的很多政府部門或者銀行的客戶使用的數據庫還是Oracle或者DB2,而這些用戶往往也希望借鑒阿裏巴巴的架構來實現自己的全球化分布來避免單點問題。而在這樣的場景之下如何去支持異構數據呢?今天,阿裏雲在線上已經能夠為用戶提供這樣的能力,而且在銀行業也有實際落地的案例,DTS能夠將Oracle數據庫中的日誌解析出來寫給OceanBase,而且在這裏麵還可以支持DDL功能,比如從Oracle到MySQL可以支持DDL。而如果大家對於Oracle和MySQL比較了解的話就會明白他們兩者之間的DDL的差別是非常大的。當然這裏並不是說阿裏雲DTS的異構多活解決方案能夠支持所有的DDL,但是對於大多數的DDL而言都是能夠支持的。
11d6d13ea7245845b6ff62343a70442206c66ce1
在上圖所示的場景裏麵存在著一個非常大的問題,就是用戶其實從Oracle到OceanBase之間存在著一個緩慢的過程,所以從Oracle逐漸切入到OceanBase或者MySQL上需要一個灰度的能力。在這個場景中,首先假設有三個用戶向A城Oracle中寫數據,這時候想要切一個用戶到B城上去,這時候就需要DTS提供一個能力來告訴用戶這個鏈路的延時是什麼樣的,如果延時很小就可以將用戶從A城切換到B城,這樣就可以逐漸地將所有的用戶從A城切換到B城上麵去。但是當切換過去之後用戶可能還是不放心,因為對於像銀行業這樣的行業而言,如果沒有後備的措施,一旦雲端發生問題可能就會出現無法遷回到Oracle上去的風險。所以為了讓用戶放心,DTS同樣也提供了遷回到Oracle的能力。而這個功能的實現也存在著比較大的挑戰,因為從MySQL或者OceanBase上遷移回Oracle的過程中,數據庫也存在著很大的差異性,這樣的差異性就需要DTS異構多活產品來抹平,這款產品同樣也會提供全量和增量的校驗能力,能夠實時地發現數據的不一致情況。當將所有的用戶全部切換到B城之後就實現了將用戶主要業務遷移到阿裏雲自主可用的RDS、OceanBase以及PolarDB上去。

案例:阿裏異構多活
之前分享了阿裏異地多活的技術實現,實際上,除了技術實現以外,還需要從業務層麵進行分析。這裏使用淘寶中賣家商品維度的場景為例子進行說明,比如從中心到單元是按照用戶的ID,也就是買家的維度去取模分割,這樣每個單元都會得到一部分的流量,同時中心也會得到一部分的流量。所以如果單元的數量越多,理論上對於雙11的支持能力也就越強。在2015年的雙11當天單是賣家商品數據庫全天同步的數據量就在PB級別了,而且這套方案不是單實例的,而是整套集群的,高峰時候的增量流量在Gbps級別。當運行的數據架構足夠大的時候就會發現往往需要去接數據庫的下遊,包括實時的計算、分析、搜索以及備份等。而阿裏的這套機製也是比較完善的,大家在雙11的時候看到的能夠實時地捕獲訂單以及交易額的數據媒體大屏幕上的數據都是來源於DTS的,媒體大屏上的數據是絕對真實的,是直接從生產中獲取的,而且能夠做到秒級別的刷新,所以訂單、消費額以及物流情況基本上都能夠實時地轉移給媒體顯示。
6be462527f8e2b5684c342ddf2fb0d613ce3b856
在這個平台裏麵,DTS提供了異地多活能力,首先解決了阿裏巴巴的單點的問題,除此之外還解決了多下遊消費的問題。現在很多公司在進行實時計算的時候是以全量的方式去拉取的源庫,比如將全量數據每天定時拉取到Hadoop集群或者ODPS中去並進行實時計算,但是隨著業務的逐漸發展,會發現用戶所需要拉取的庫越來越大,同時給係統造成的壓力也越來越大,而且數據拉取的下遊也會變多,比如搜索、實時計算等,他們需要DTS這樣的產品。隻要為他提供一個將日誌解析成增量的能力,然後賦予數據庫的下遊共同消費這些增量的能力,就可以實現隻拉取一次,讓大家能夠多次消費,而且這個過程還不是通過SQL去查詢源庫,所以對於源庫基本沒有影響,而與此同時對於下遊而言,收益則是非常大的。

案例:阿裏雲全球化
除了DTS在阿裏的應用場景之外,還有阿裏雲上的應用場景。在今天很多雲計算的用戶選擇了阿裏雲的產品,而阿裏雲能夠提供比如像華東、杭州以及新加坡等很多的Region,阿裏雲目前有十幾個Region分布於全球,並且還在快速地擴展之中。阿裏雲天生就是全球化的架構,而阿裏雲的誌向就是做全球化的雲計算服務,可以說是誌向高遠,所以在進行架構設計的時候就需要去考慮使阿裏雲的雲產品能夠實現全球化的架構。
6bb4637d98574f2984188ef57a5d42d63ad7343d
因為DTS是提供給阿裏雲自己的產品來實現全球化服務的,而像RDS、ECS上麵的數據是需要和中心進行交互的,比如用戶購買一個RDS,那麼這個RDS實例是如何生產出來的,實例與中心之間如何實現信息的交互的,其中的控製節點又是如何控製流動的,這一套東西其實都是基於DTS所提供的全球化和單元化架構實現的。其實,阿裏雲和阿裏的實現方式還不完全相同,阿裏雲所實現的是雙中心的架構,而阿裏目前實現的是單中心的架構,但是單中心有backup,所以無論是這兩種方式中的哪一種都是可以支撐交易以及下單業務的,所以DTS架構上的複雜性會更高一些。

DTS可以支持關係型數據庫,也支持大數據,還支持NoSQL以及一些應用領域。所以在場景上來看,DTS支持的範圍是非常廣泛的。
70bdd7d07f5052584c40a802741ba4806df6c5e7

三、DTS應用案例

接下來分享一些場景下的DTS應用案例,幫助大家了解在什麼樣的場景下使用DTS,以及應該如何使用DTS。


案例1:某國內大型商場使用DTS從Oracle不停機遷移到RDS
下圖中所展示的是一個真實的案例,某國內大型商場原本是Oracle的用戶,但是他希望將自己的數據遷移到雲上來。進行遷移可以選擇去購買Oracle的服務,但是這個服務是比較昂貴的,而且也會比較複雜,所以用戶希望通過DTS來完成。其實對於DTS而言,在頁麵上創建這樣的一個任務是比較簡單的,用戶隻需要點擊幾下鼠標就可以實現,也不需要專業顧問去提供實現方案的建議。因為不需要付昂貴的軟件采購費用和顧問谘詢費用,所以使用DTS進行數據遷移的成本是比較低的,可能僅需要幾元錢就能夠完成從Oracle不停機地遷移到RDS的工作。
d70aafbb948456db786d8f90eb25cdd37f6113e7
如上圖所示,首先會把Oracle的庫表列遷入到RDS上去,然後再將全量數據以及增量數據遷移過去。這個過程需要確保的就是如何保證將全量遷移過程中引入的增量寫入到目的庫中去,還有Oracle的無主鍵問題應該如何解決,而這些問題都是比較困難的,單純依靠用戶自己去解決則是比較麻煩的,但是使用DTS就能夠方便地解決上述問題。阿裏雲為用戶提供了這樣的簡單功能,而用戶卻給阿裏雲提出了更多的場景,比如還是這個大型商場用戶,他們還提出了從Oracle到Oracle的雙向遷移能力以及從Oracle到RDS的雙向能力,阿裏雲也為用戶提供了這樣的能力,不僅僅實現了架構的靈活轉換,還為用戶節約了大量的成本。

案例2:某遊戲公司通過DTS同步到海外實現就近訪問
8ba38c24ac60aaa713fbd789628bfdb2e4a8258f
當今中國的遊戲行業蓬勃發展,很多遊戲公司開始布局海外市場,並且發展情況良好。很多使用了阿裏雲的遊戲公司也提出了這樣的新需求:希望將把遊戲數據在中美之間進行同步,把下發的遊戲參數信息、購買信息等從中國傳給美國或者從美國傳回中國。阿裏雲可以通過DTS的中美同步功能幫助用戶實現萬公裏毫秒級延遲的數據同步能力。很多國內發展比較好的創業公司都使用了DTS的中美同步服務,不僅僅是遊戲公司,還包括一些無人機之類的公司也都使用了這樣的功能。

案例3:某大型央企通過DTS進行在離線實時同步分析目標用戶
fcf430d7787970a4a7f4ba34432cba97ca9ae6ec
目前一些央企、國企也開始走上了上雲之路,隻不過對於央企或國企而言,上雲的道路可能需要分步驟地完成,比如通過DTS逐步地實現大數據分析,對於央企或國企而言,可能原來在本地並沒有搭建自己的大數據平台,而現在希望借助阿裏雲上比較方便的像MaxCompute等來實現大數據能力,而DTS就能夠幫助他們實現這樣的目標。因為搭建這樣的一個大數據集群本身的成本是非常高的,而使用阿裏雲卻是非常方便的,並且成本也會比較低,隻需要按需付費就可以了。通過DTS增量能力可以直接寫給MaxCompute或者通過Spark的流式接入寫給其下遊的計算服務,這樣也可以解決知識計算以及流式計算的需求。

案例4:某大型互聯網公司通過DTS構建公有雲異地多活架構
4ea35fcef787bd32bb8878ee08b8fffbb071ad3d
大型互聯網公司可以通過DTS構建如上圖所示的公有雲異地多活架構,這個案例的基本內容在前麵已經分享了,這裏不再贅述。

案例5:某視頻類科技公司訂閱DTS做緩存更新
02c6bac755dc2fab63b620cd05fc2eb8a4a8e6a5
有一些用戶在實現自己的互聯網架構過程中不可避免地需要使用到緩存,無論是Memcache還是Redis,這些緩存所起到的作用就是幫忙擋一層訪問。如果沒有緩存層,就難以應對像雙11這樣的場景。而緩存層也都存在著失效的問題,通過使用DTS的數據訂閱功能,實時獲取數據庫更新數據,就能夠更新緩存內容,解決緩存失效的問題,而用戶使用和搭建這套架構所需要的成本也比較低。

案例6:某商業銀行通過DTS構建私有雲的兩地三中心容災架構
重點分享一下這個案例。應中國人民銀行的要求,所有的銀行都需要提供“兩地三中心”的容災能力,“兩地三中心”也成為了銀行的標配。而在這之前,很多的銀行曾出現過因為數據庫版本升級、數據庫運維以及其他原因造成服務不可用的問題,但是對於很多銀行而言,是不敢輕易切換目的庫的,因為這可能對於銀行的業務造成很大的影響。銀行不敢切換到目的庫的本質原因就是他們無法保證目的庫能夠正常使用。而通過DTS這款產品能夠確保目的庫通過異地的兩地三中心搭建出來一個備庫,使其能夠實時使用的並且有效。因為通過文件這種方式無法驗證副本集是否是有效的,而DTS卻是通過備庫與第三方庫進行有效性驗證。
1fa53998e7d2cb09c95dd6e6328e264ebfc19946
上圖中的兩地是深圳和杭州,杭州有兩個機房IDC A和B,深圳有IDC C,這樣的情況下需要搭建兩地——深圳和杭州,三中心——IDC A、B、C三個機房這樣的異地多活的架構。使用下圖的這種方案是比較輕鬆的,因為在同城內部是通過阿裏雲RDS實現運載的,對於異地的情況可以通過使用DTS實現深圳機房的數據運載,而且RTO或者RPO基本在1秒左右。除此之外,將服務切到杭州去之後還可以通過DTS切回到杭州。而成本也會降低一些,這是因為首先對於同城部分,阿裏雲RDS已經幫助用戶實現了;對於異地的數據庫而言,從節省成本的角度,可以自己搭建,當然也可以通過RDS來實現。最重要的一點就是目的端的數據庫是實時的、有效的,並且能夠提供可靠的在線服務。

在上述案例中,如果IDC A出現了故障,這時候RDS會去做主備切換,但是服務卻不會受影響。如果現在用戶100%的流量都寫入到杭州,應用端會自動切換到IDC B上來,保證整個服務是可用的。
eaafd4a3630a111b6ccf023356cb6df4f50cd7a5
如果上述案例中的IDC A和B都掛掉了,也就說整個杭州的機房全部掛掉了,在這樣的情況下該如何保證服務的可用性?實際上這時候需要通過查看DTS的界麵來看其延時是多少,如果延時很小就可以做一些標準的切換流程,把應用的流量切換到深圳去。這個時候即便是整個杭州的機房全部掛掉了,也能夠保證服務的正常運行。剛才提到的RPO是1秒,如果可以做到更好,就可以實現杭州節點中的數據在機房恢複之後還能找回來,隻是可能某一秒的數據沒有寫過來,但是當杭州的節點恢複了,數據還是可以同步到深圳節點去的。
f0013d630e4b1d87080d84cd9c99e538ca7b7ee0

四、最佳實踐
上麵分享了DTS的一些使用場景,最後為介紹DTS在使用過程中用戶反映比較多的典型問題以及最佳實踐。
f19b92e006803a9a1bfb909dddeff9c5036b7a64
1.DTS連接不上源庫報錯,這種報錯產生的場景和原因有很多,比如數據庫是否開放了可以遠程連接的權限,因為一些數據庫會限製隻允許某些IP進行訪問;用戶填寫的用戶名和密碼是否是正確的;以及數據庫有沒有連接到公網。所以在這樣的場景上,用戶發現DTS連接不上源庫就需要自己在另外一台ECS上登錄自己的源庫,查看是否能夠連接上,如果能夠連接上,說明目前的網路連接是正常的。而在阿裏雲所接收的工單中發現很多情況下用戶的源庫限製了IP訪問,因為如果用戶使用的是自建的數據庫而不是RDS版本的數據庫,就會自動地限製隻允許某些IP進行訪問,這也是出於安全性的考慮。所以建議用戶在出現這樣問題的時候在另外一台ECS上直接訪問源庫並查看訪問情況。

2.使用DTS遷移上雲的過程中,如何將應用切換到RDS上去?其實這樣的過程具有非常嚴格的規範,比如應該怎麼去切換數據庫。這個過程在這裏進行簡單說明,首先如果發現DTS的延時很小了,就應該將源庫置成Read Only的。除此之外,還需要在源庫上將應用的Session全部清除掉,因為如果不清除掉,應用還是可以進行寫操作。將Session全部清除掉之後就能夠確保應用不會再執行寫操作,這個時候再將應用切換到目的端。而有時候因為應用機器規模很大,所以導致切不幹淨,使得有的應用還在向源端的庫進行寫入,這樣就會導致數據不一致,也就是出現了“雙寫”的情況,這也是一個值得吸取的經驗教訓。

3.源庫和目的庫庫名、表名、列名不同,比如源庫本地是A庫改變成目的庫是B庫,源庫中表名是A表到了目的庫的表名稱變成了B表。在這種場景上,DTS提供了庫、表、列的映射,使得用戶可以很方便地去進行映射。

4.源庫和目的庫都有觸發器,很多用戶的源庫上有觸發器,而且想要將源庫的數據遷移到目的庫上去,所以往往會在目的庫上再建同樣的觸發器。然而,其實目的庫的觸發器是不用建的,因為源庫上的觸發器所產生的數據會產生Binlog,而通過DTS進行遷移,源庫表中有觸發器就不需要再向目的端庫新建觸發器了,因為DTS已經幫助用戶將觸發器上產生的數據同步到目的端了。不然如果用戶在目的端庫上也建立觸發器就會報錯,因為源庫上觸發器已經產生了同一條記錄,這樣就會出現主鍵衝突,進而導致報錯。

5.跨賬號遷移的問題,也就是在跨賬號進行遷移的時候,用戶不知道應該如何遷移。DTS在頁麵上提供了跨賬號遷移的功能,用戶可以填寫另外一個賬號的用戶名和密碼,實現跨賬號的遷移。而阿裏雲DTS還提供了專業的文檔幫助用戶實現這樣的功能。

6.遷移同步過程中進行了Rename表操作,很多用戶在源庫上需要做在線的DDL,而做在線DDL的時候,很多工具會產生Rename表,而Rename的表也在遷移的對象裏麵。比如需要遷移A、B、C三個表,用戶將A表Rename成D表,再將D表Rename成C表,這樣的過程中D表並不在同步對像裏麵,所以並不會將其同步到目的端去,因為已經選擇了A、B、C表,後來D表才出現,所以D表必然不在同步對象中。而在目的端執行從D Rename成C的時候發現沒有D這張表了,所以如果需要做Rename操作,建議用戶直接選擇將整個庫進行遷移。整個遷移就能夠將源庫上所有的表全部同步過去,這樣就不會出現Rename而導致的目的端某個表不存在的問題了。總結而言,這是因為使用開源的工具做了在線DDL導致Rename操作進而導致的比較常見的錯誤,而這個錯誤也是值得重視的。

7.主子賬號遷移、同步,當公司發展壯大了,就會涉及到很多主子賬號的問題。為了解決這個問題就需要用戶在使用主子賬號做遷移或者同步的時候通過主賬號給子賬號授權,通過授權確定什麼賬號可以使用哪一個RDS。

8.遷移和同步過程中有DDL,MySQL到MySQL這種場景是支持DDL的,很多用戶會出現在源庫上建立了DDL並且還跑到目的庫上建了一個DDL的情況,也就是兩個庫上都建了一個DDL,而這樣肯定會出現問題。所以對於MySQL這種場景不需要兩邊都做DDL,在源庫做一個表結構,DTS可以幫助用戶同步到目的端去。

9.公共雲和金融雲之間遷移、同步,在公共雲和金融雲之間是存在隔離的,因為金融雲的隔離級別相對而言比較高。數據可以從公共雲到金融雲,但是反過來從金融雲到公共雲卻是不可以的。

10.目標庫多了一個表increment_trx,這個表實際上是DTS在同步過程中或者增量遷移過程中建的元數據表,這張表為的是解決斷點續傳問題的,如果還處於數據遷移過程中就不要刪除這個表,如果沒有DTS任務在運行的時候,就可以刪除這個表。

11.用戶想要實現A->B->C遷移,以及實現級聯同步,之前對於這樣的級聯遷移或者同步的需求是會進行攔截的,但是現在DTS也開始支持這樣的操作了,可以實現級聯的遷移和同步。

12.用戶在使用數據訂閱啟動SDK報如下的錯誤:keep alive error,這表示的意思就是訂閱程序連接不上DTS的服務,比如在沒有連接公網的時候就會出現這樣的錯誤,所以需要讓用戶自己的服務能夠連接外麵的公網。阿裏雲所提供的服務是在公網上的,未來阿裏雲也會對訂閱功能提供私網服務。

最後更新:2017-09-02 01:33:22

  上一篇:go  雲數據庫產品及架構設計背後的考量
  下一篇:go  軟件開發線上服務交易平台_威客網站