全球項目多區域數據同步問題解決方案


一、背景

我們公司的用戶分布在全球,因為考慮到產品性能和國內安全防護的特殊情況,所以服務端代碼分別部署在中、歐、美三個區域的服務器上,同時,也部署了一台用於對全球賬號、設備進行唯一驗證和管理的全球服務器。

因為各個區域有部分數據表或緩存數據是需要事先在管理后台配置,且大多數據在各個區域一致,因此考慮在全球服務器進行統一配置后直接同步到各個區域服務器。

二、數據同步目標

1. 全球服務器指定數據發生增、刪、改時,操作需要同步到中歐美三個區域對應的服務器;

2. 部分數據需要根據數據所屬區域分別同步到指定的區域服務器;

3. 新部署服務器后,可以在全球服務器操作一鍵同步所有配置數據,需要分區域的數據也要區分區域后全部同步;

4. 區域服務器包括web服務器、文件雲存儲管理服務器、p2p服務器、rpc服務器,web服務器需要同步的數據存儲在Mysql數據庫,其他服務器需要同步的數據主要存儲在redis緩存中;

5. 數據同步實時性要求較高,項目上線后,真實需要在1分鍾以內完成數據同步。

ps:項目整體服務架構不在本文討論范圍內,我們其實也在摸索中學習進步,如果有高人不小心看到本篇博客,對架構這部分有經驗熱心指導的話,還請留言告知,可以加好友學習請教,謝謝。

三、方案思考

遇到這個需求后,查閱了網上各路大神的博客,沒有遇到雷同的經驗和方案,於是又到技術群請教,本來沒多少有效可執行的方案頭緒,結果在幾個熱心大神的啟示下,打開了思路,最終得到一個比較有效可執行的方案。

1. 從Mysql層考慮

遇到數據同步問題,大多數人第一反應都是Mysql主從同步,不太了解的朋友可以參考:

https://www.cnblogs.com/zhoujie/p/mysql1.html

https://blog.csdn.net/weixin_41909810/article/details/82939966

如果是同步Mysql部分數據庫或部分數據表,可以參考:

https://www.2cto.com/database/201708/674665.html

https://www.csdn.net/gather_2d/MtTaEg5sODY1MS1ibG9n.html

還有朋友推薦考慮使用Mysql的觸發器進行部分數據同步,也有一篇文章參考:

https://blog.csdn.net/forever_chm/article/details/86239814

最后沒有采用直接配置Mysql數據庫同步的方案,原因如下:

(1)因為我沒有在實際項目中對mysql進行過這類操作,所以擔心后期對數據庫造成性能影響;

(2)項目中部分數據表數據不能完全同步到各個區域,需要對數據所屬區域進行區分后再同步;

(3)部分數據需要同步至文件雲存儲、rpc、p2p服務器的緩存數據中,直接操作Mysql不行。

ps:如果只是同步全球數據庫的部分表到各個區域數據庫,使用Mysql主從同步部分表的操作應該沒毛病。

2. 從Redis層考慮

Redis也有數據同步功能,操作參考:

https://blog.csdn.net/ligh_sqh/article/details/79383667

Redis同步指定key到其他庫參考:

https://www.cnblogs.com/egrep/p/10084247.html

最后也沒有采用Redis數據同步的方式,原因是全球服務器緩存應用和區域完全不同,區域服務器有專屬當前區域操作的業務Redis緩存數據,所以如果這樣做的話細節問題就太多了。

3. 從消息隊列服務考慮

還有朋友建議使用消息隊列服務。全球服務器作為生產者,區域服務器作為消費者,在全球服務器操作指定數據后,加入操作內容及數據到隊列,消息隊列服務配置好需要進行消費的區域服務器接口,實現數據生產 => 消費過程。

這個方案思路讓我眼前一新,花了一天思路整理細節邏輯,得到一個絕對可落地的方案,大體如下:

(1)全球服務器根據數據操作類型(增、刪、改)以及同步對象的區別(不同類型的區域服務器),對數據進行處理,然后加入Redis數據同步隊列;

(2)區域服務器根據自己的數據需求,增加一個數據同步的消費接口,消費成功響應1000,消費失敗響應失敗數據;

(3)全球服務器增加一個消費Redis數據同步隊列的服務,服務中區分同步服務器對象類型,分別調用不同服務器的同步數據消費接口,並且檢測同步響應結果,可能存網絡原因,如果同步失敗,重新進行同步,並增加redis計數器,同一條同步數據超過3次同步失敗,加入到數據同步失敗日志中,並記錄數據同步響應錯誤結果。

ps:本來有考慮單獨開一個消息隊列服務,但因為一條數據會同步給多個服務器的情況,就只好在全球服務器中通過代碼處理數據再同步至多個服務器。

四、實際落地方案

上文中的方案3是全球數據同步至各區域不同服務器的主要落地方案,但如果所有區域數據庫或緩存都通過全球服務器去主動同步,那項目逐漸增大后,性能問題和潛在的架構復雜度也成指數上漲,所以全球到區域的數據同步,要做分層處理,如下:

1. 全球配置數據通過上文方案3同步到區域主服務器(主數據庫 / 主Redis);

2. 區域再通過主數據庫或主Redis做主從同步,為二級數據庫和Redis同步數據。

這樣下來,全球服務器數據同步只需要調用對應區域主服務器消費接口就行,至於區域內部的數據同步,就在各自區域內進行操作,和全球服務器沒關系。

 

以上的方案已經在實際項目中操作完成,效果還不錯,如果有朋友感興趣,想了解具體細節,歡迎留言討論。
---------------------
 原文:https://blog.csdn.net/createNo_1/article/details/94594558
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM