2016-01-15 21 views
1

我有兩個不同的數據庫,一個是舊的舊數據庫,由於舊服務不再使用,我將退役。另一個是新服務,最終將取代舊系統。在此之前,我們需要兩個服務運行一段時間。同步數據B/W兩個數據存儲區

兩人都爲用戶存儲的電子郵件地址,密碼和其他表兩張表是簡單的用戶相關的數據(地址)。

我需要這兩個數據庫之間的數據同步。舊的是MS SQL Server數據庫,新的是NoSQL數據庫(DynamoDB)。

我的策略是,在上線前,將所有用戶從舊數據庫複製到新數據庫,然後一次新系統正在運行,然後在每個數據庫之間同步用戶。

我會通過定期運行一個工具來檢查上次運行後添加的任何用戶,通過查詢用戶表,如WHERE CreationDate >= LastRunTime,然後爲每個用戶查詢它是否存在於其他數據庫中。我將以這種方式做到這一點,即從舊的DB - >新的DB和新的DB - >舊的DB。

這是做這件事的好方法嗎?任何其他更好,快速的解決方案來實現這一目標

如何檢測對現有用戶數據的更改?有沒有比檢查兩個系統表中每個用戶記錄的&更好的解決方案,然後採用最後修改的記錄(通過檢查每條記錄的LastModifiedDate時間戳)並在另一個系統的表中更新它?

回答

2

解決方案1 ​​(我推薦):每當系統插入/更新或者添加/更新數據庫中的記錄數據,並添加這些信息在Queue數據庫的記錄。

一個sperate閱讀器將從隊列中讀取並定期將數據複製到相應的數據庫,這樣您的數據將在數據庫之間同步。

注意:使用隊列的另一個優點是您不必在DynamoDB表中設置非常高的吞吐量。

解決方案2:您在問題中提出的建議是,您可以添加CRON作業,通過檢查基於時間戳的記錄來複制數據庫。

1

我已經執行了幾次從Oracle/MySQL到DynamoDB的表遷移,沒有停機,我使用的方法與您所描述的方法有點不同。這種方法最終需要更多的編碼,但我認爲這是一種低風險的方法,而不是你所描述的硬性割接。

這種方法需要多個階段,如下所述:

1期

  • 創建在舊系統中的數據,新DynamoDB表(S)。

二期

  • 更新您的應用程序編寫與原有的數據庫,並在DynamoDB /更新數據。您的應用程序仍然會讀取和寫入舊系統,因此這應該是一個低風險的更改。
  • 在部署此代碼之前立即將DynamoDB加載到所有舊數據。
  • 在部署審計數據庫後立即確保它們同步。

三期

  • 更新您的應用程序開始從DynamoDB閱讀。這應該是低風險的,因爲您的應用程序將在DynamoDB中維護數據一段時間。
  • 保持您的應用程序寫入遺留數據庫,以便在新實現中發現任何問題時可以縮減。這確保了割接風險低,您可以輕鬆回滾。

階段4

  • 從您的應用程序讀取和寫入遺留數據庫和部署此生產的代碼。
  • 您現在可以停用舊數據庫!

這肯定是更多的步驟,將需要更多的時間比只服用申請下來,遷移所有數據,然後部署應用程序的新版本,以讀取DynamoDB /寫。然而,這種方法的主要優勢在於,它不僅不需要停機,而且風險也較低,因爲它可以分階段測試更改,並且在遇到任何問題時可以輕鬆回滾。

0

在高級別上,同步作業可能是1>基於cron作業或2>基於通知。

如果您有「創建時間」和「last_updated_by time」,cron作業可以同步以及審覈。在這種情況下,主數據庫(數據應該從哪裏同步)通常是SQL Db,因爲在SQL中執行表掃描比在NoSQL中更容易(與DynamoDB中相似,您需要使用其掃描功能,並且受限於表的散列鍵)。

第二個選項是建立通知machenism,這可能基於DynamoDB的流http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html。這是DynamoDB的一項成熟功能,它可以確保事件順序並可以實現接近實時的事件傳遞。你需要做的是建立一個傾聽這些事件。

最後,您可以查看AWS數據庫遷移服務https://aws.amazon.com/dms/以查看它是否滿足您的要求。