◆歐志芳
(福富軟件 福建 350001)
基于RocketMQ實現異構數據庫同步
◆歐志芳
(福富軟件 福建 350001)
在進行數據庫升級改造,都需要考慮如何把原有數據庫的數據不丟失、高性能地寫入到新數據庫,特別在涉及異構數據庫同步時,我們更需要有成熟的經驗來借鑒。本文通過對項目的回顧,分享基于分布式消息中間件RocketMQ來實現異構數據庫的同步,總結數據不丟失的高可用實現機制,同時指導應用如何更好地設計與約束來滿足高性能的要求。
分布式消息中間件;RocketMQ;異構數據庫同步
異構數據庫同步的類型非常多,可以是關系數據庫到nosql數據庫,可以是關系數據庫到小文件存儲等,同步的方式因為項目的性質、項目的要求等不盡相同。本文主要說明Oracle到Mysql基于相同模型的數據同步。
主要的同步方案有如下三種:
項目改造核心是不影響原系統業務感知,且出現問題時具備快速解決,所以基本排查了方案一和方案三,采用“數據層AOP+消息中間件”的實現方案。

表1 三種同步方案
由于本次異構數據庫同步的數據是作為生產使用,對消息中間件的要求比較高,常用的分布式消息中間件主要包含如表2。
系統改造要求數據不能丟失,具備橫向擴展應對突發業務高峰的處理能力,同時還需要考慮改造盡量少地對現有系統的性能造成影響,基于此明確選擇RocketMQ作為異構數據同步的分布式消息中間件。
3.1 Name Server

表2 常用的分布式消息中間件
Name Server是一個幾乎無狀態節點,可集群部署,節點之間無同步信息。它主要提供broker注冊、Topic路由管理等功能。
3.2 Broker
分布式消息中間件核心組件,提供消息生產、消費,主從同步、數據刷盤等核心功能。可以橫向擴展、在線擴容以提高集群性能。每個Broker與Name Server集群的所有節點建立長連接,并定時注冊Topic等信息。
3.3 Producer
生產者,一般為應用調用API進行消息生產。Producer 與Name Server集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,并向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer 完全無狀態,可集群部署。
3.4 Consumer
消費者,一般為應用調用API進行消息消費。Consumer與Producer一樣,與一個Name Server建立長連接并取Topic路由信息。Consumer與提供Topic服務的Master與Slave建立長連接,既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker 配置決定。
4.1 異構數據同步方案
首先實現ORACLE應用的數據雙寫,其次數據寫入到分布式消息中間件,最后偵聽消息中間件的數據實現寫入到Mysql數據庫。
4.2 RocketMQ的高可用方案
為了保證寫入消息中間件的數據不丟失,通過集群接入高可用和消息服務高可用來實現。
(1)集群接入高可用(NameServer)
通過多個集群管理服務+故障自動切換,實現集群接入點的高可用。
(2)消息服務高可用(Broker)
通過生產與消費的自動負載均衡,實現Failover,保證某一組服務在全掛的情況下,不影響整體業務。
4.3 應用設計原則與約束
(1)消息模式選擇
消息模式選擇的優先順序為:無序消息>普通有序消息>嚴格有序消息。在業務場景允許的情況下,優先選擇無序消息,或者在業務能變通的情況下,將有序消息轉化為無序消息。
(2)隊列數選擇
Queue分布在Broker中,則能使用Broker的資源,包括存儲、IO等,一般情況下,分布在某個Broker上的Queue比例越大,則占用此broker的資源越多,Topic中的Queue分布到的broker數量越多,則性能越好、存儲越大。若broker的所在機器性能不同,可以通過調整Queue數量,達到資源調優的目的。
(3)消息包體大小限制
建議平均消息包體在50K以下(壓縮后);超過此包體建議通過拆包或者文件方式傳遞數據;過大的包體,會加大網絡超時、網絡擁堵等異常情況出現的概率。
技術的變化日新月異,需要我們時刻關注,并積極考慮如何與項目的需求相結合,或許一個簡單的創新,很多高難度要求就能迎刃而解。本文通過對基于RocketMQ進行Oralce到Mysql的數據同步的過程進行總結,說明通過簡單的新技術引入、規范及應用,不僅可以解決項目的功能要求,還能快速實現對數據不丟失、處理高性能的運營要求。