2013-07-31 58 views
4

我有一個NoSQL數據庫用於數據處理,因爲它可以比SQL更快地用於我的應用程序。我把我們的NoSQL數據庫看成是一個緩存的信息,SQL是數據的權威,而NoSQL存儲正在隨着變化而更新。現在這是通過我們的應用程序完成的,所以當請求進入更改時,它將在SQL數據庫和NoSQL數據庫中完成。有時NoSQL更新失敗或其他情況會導致NoSQL數據庫不同步,這有時會失敗。保持單獨數據庫同步的策略

我可以每X分鐘進行一次批量更新,但是這是數據存儲中的大量信息,需要幾個小時才能確保它們同步。我們有一些時間戳來改變已經改變的內容,但這並不總是準確的。

我在想什麼一些推薦的策略來保持數據存儲(輔助數據庫緩存)與我的主要商店同步?

回答

5

我知道我在過去使用消息傳遞做過 - 特別是帶有ActiveMQ的JMS。我會通過使用隊列將更新發送到NoSQL存儲(Mongo)。通過這種方式,消息可以積聚在隊列中,並且如果與NoSQL存儲的連接被切斷,它可以從停止的地方繼續。

它工作得很好,因爲ActiveMQ非常穩定和簡單的工作。

我一直都看到這樣做與你提到的差異。您將全部引入日期字段,然後跟蹤最新的同步。這種方法的好處在於它可以輕鬆地通過修改上次同步日期來重放事務。

最後一條建議......寫出從A點到B點(在這種情況下SQL到NoSQL)數據的良好工具。我寫了幾個工具在我上一份工作中從SQL批量加載NoSQL存儲,如果有任何事情真的不同步,它會讓生活更輕鬆。在腳本和批量加載過程之間,我總是可以恢復。

+0

您提到的日期字段,您是否在消息和NoSQL實體級別執行此操作?你做了有狀態更新(追加)還是無狀態更新(JMS消息中的整個狀態)?對於你的日期字段,如果你的NoSQL實體更新了,是否忽略了任何「較老的」JMS消息?我正在爲我的CRUD使用Web服務,您是否在排隊的CRUD中使用了類似的概念? – Nicholas

+0

我們把日期字段放在SQL中的記錄級別。 CreateDate,UpdateDate。然後,您可以針對這些差異運行差異併發布已更改/新增內容。在應用程序級別,我們將一個對象寫入SQL,然後將其序列化爲JSON並通過JMS發送它。對於所有對NoSQL的寫入,我們做了插入操作。這避免了必須知道更新的問題。例如:有人在CMS中撰寫新文章。我們將它寫入SQL併發送JMS消息,並將對象序列化爲JSON。 NoSQL寫入會插入(如果不存在則寫入新的,如果存在則更新)。這有幫助嗎? – ryan1234

+0

如果有人刪除了一篇文章,是刪除一個單獨的隊列,還是您使用了一個隊列,並且它有一個用於操作(ADD,DELETE)的字段,或者您有一個隊列用於添加,一個用於刪除? – Nicholas