2016-08-15 293 views
3

這個問題更多的是架構和庫,而不是實現。保持部分離線的sqlite數據庫與postgresql同步

我目前在項目中工作,這需要在客戶端保持與服務器上的遠程數據庫同步的本地長期緩存存儲(每天更新一次)。對於客戶端sqlite已被選爲輕量級方法,並且postgresql作爲功能豐富的db在服務器。 postgres的本地複製機制是沒有選擇的,因爲我需要保持客戶端真正輕量級,並且不依賴像db服務器這樣的外部組件。

實現語言是Python。現在我正在查看像SQLAlchemy這樣的ORM,但之前沒有任何工作。

  • SQLAlchemy有沒有任何工具可以讓sqlite和postgres dbs保持同步?
  • 如果沒有,是否還有其他Python庫有這樣的工具?
  • 如果任務必須「手工」解決,那麼關於架構應該如何應該是什麼樣的想法?

補充: 這就像遙測,目標客戶將只有一天

所以大約20分鐘的網絡連接,該主要問題是這樣一個系統的構建築

+2

這個問題太廣泛了。 – e4c5

+0

附註。如果在桌面上有一個折衷的地方,你可以看看CouchDB作爲離線優先數據庫(文檔雖然不是關係數據庫)做廣告。或者至少在他們的文檔中尋找關於[最終一致性]的想法(http://docs.couchdb.org/en/2.0.0/intro/consistency.html#eventual-consistency)(並可能通過關係數據庫實現它)。根據我的經驗,它太嚴格和不方便,但你的里程可能會有所不同。 – saaj

+0

這是單向複製還是雙向複製?即客戶端上的數據庫是隻讀的?如果它只是更新客戶端上的數據庫,那麼它就簡單得多。沒有碰撞。如果客戶端和服務器都對數據庫進行了修改,您是否可以對每個客戶端的數據進行分區?我問這個問題的原因是,看看是否有辦法避免碰撞,其中2個客戶端正在脫機更新同一行,然後同時上傳 - 你會如何協調: –

回答

4

它通常不屬於ORM在數據庫之間同步數據的任務,因此您可能必須自己實現它。根據您選擇的數據庫,我不知道會爲您處理同步的任何解決方案。

有兩個重要的設計選擇來考慮:

  • 你怎麼找出數據改變什麼(即插入,更新或刪除)
  • 什麼是打包變化日誌的最有效的方法
  • 你需要處理衝突嗎?你將如何做到這一點。

找出變化的最有效方法是讓數據庫直接告訴你。 Bottled water可以在這方面提供一些啓示。這個想法是挖掘postgres用於複製的事件日誌。你需要像Kafka這樣的東西來跟蹤你的每個客戶已經知道的東西。這將允許您優化您的服務器以進行寫入操作,因爲您將無法查詢客戶端是否試圖找出自上次在線以來更改的內容。 同樣可以通過使用event callbacks的sqlight結尾來實現,您只需交換客戶端上的一些存儲空間以保留要發送到服務器的更改。如果這聽起來像您的需求太多的基礎設施,那麼您可以使用SQL和池來輕鬆實現,但我仍然會將其視爲事件日誌,並考慮它是如何實現的細節 - 可能允許更多高效實施起來。

構建和打包更改日誌的最佳方法將取決於您的應用程序要求,可用帶寬等。如果需要,您可以使用標準格式,如json,compress和encrypt。

設計您的應用程序以避免衝突,並可能在單一方向上流動數據或分區您的數據,使其始終以單一方向流向特定分區將會簡單得多。

最後一個教訓是,使用這樣的體系結構,您將獲得增量更新,其中一些可能由於計劃外原因(系統故障,錯誤,丟棄的消息等)而錯過。你可以有一些內置的啓發式方法來檢查你的數據是否匹配,比如至少檢查每一邊的記錄數,用一些方法來恢復這樣的錯誤,以最小的方式手動重新獲取來自權威的數據源,即如果服務器是權威的,客戶端應該能夠丟棄它的數據並重新獲取它。無論如何,您可能需要這種機制來處理客戶端重新安裝的情況等。

相關問題