離線時如何同步 MySQL 數據庫?
我在客戶端上執行的應用程序使用在伺服器上執行的 MySQL 數據庫。因此,多個客戶端連接到同一台伺服器。當伺服器線上時效果很好。但現在我想增強我的應用程序,使其能夠在離線模式下執行。
+--------------+ | | +-----------+ SERVER +----------+ | | | | | +-------+------+ | | | | +------+-------+ +-------+------+ +-------+------+ | | | | | | | Client 1 | | Client 2 | | Client X | | | | | | | +--------------+ +--------------+ +--------------+
現在問題來了:當客戶端離線時會發生什麼?我也需要每個客戶端上的 MySQL 數據庫副本。預設情況下,應用程序與伺服器上的 MySQL 互動。如果無法訪問此伺服器(出於什麼原因:伺服器離線或客戶端沒有網際網路連接),它應該使用在客戶端上執行的 MySQL。如果客戶端/伺服器連接再次可用,則需要自動同步數據庫。
我現在的問題是:如何實現這一目標?首先,我檢查了 MySQL 複製,但在我的場景中,我有多個“master”和未知數量的客戶端。所以我擔心複製不是我的解決方案。MaxScale可以解決我的問題嗎?我從來沒有使用過,所以我非常感謝任何幫助。
你評論說:
那麼沒有真正“簡單”的解決方案來實現所描述的場景嗎?這太奇怪了,因為我不想相信我的場景是如此不同尋常……
這不是一個不尋常的要求,但很常見並不能使它變得簡單或容易解決。
每個有此要求的項目可能對它應該如何工作有不同的想法。因此,開箱即用的解決方案不可能適合所有人。
假設您的幾個客戶端處於離線狀態,並且他們都將更改寫入各自的離線數據庫。然後網際網路恢復,您希望它們重新同步。但是他們每個人都更新了給定表中的一些相同的行。應該優先考慮哪一個?應該先到先得嗎?應該是最後一次更新獲勝嗎?是否應該是合併衝突,需要人工干預才能解決(如 git 合併衝突)?您可能可以為自己的項目回答這個問題,但不能為其他所有項目回答。
像 Galera 這樣的產品通過允許節點僅在連接到集群時才接受寫入來處理這個問題。離線節點自動變為只讀。
我對 MaxScale 了解不多,但它顯然是傳統 MariaDB 副本集的代理,具有一個寫入器和 N 個只讀副本。
我認為您以錯誤的方式看待您的場景。首先,您的客戶端應用程序是移動應用程序嗎?因為那樣的話,為什麼要實現離線模式就更有意義了。為網路連接通常相對可靠的桌面應用程序實現離線數據庫支持是不常見的。
如果它是一個移動應用程序,那麼您需要使用正確的工具來完成正確的工作。移動設備不支持 MySQL,但 SQLite 通常是可以處理離線模式的本地數據庫系統的一般選擇。還有一系列其他支持移動設備的數據庫系統也可以用來代替 SQLite。
一旦設備重新聯機,您仍然希望您的主要遠端數據庫系統作為整合所有數據的地方,這確實可以是 MySQL。但正如 dbdemon 在評論中提到的,您需要一種解決衝突的方法,特別是如果您允許多個客戶端應用程序修改數據庫的相同記錄。這可能需要在應用程序層或應用程序層和數據庫層的混合中處理,但您需要在一定程度上自己編寫程式碼。如果 MySQL 具有某種更改跟踪功能,那麼這可以極大地幫助確定自上次客戶端設備同步以來哪些數據是新的。也許這個關於更改跟踪的 StackOverflow 問題有一些對您有幫助的答案。
如果您正在談論您嘗試支持離線模式的桌面應用程序,那麼我們可能需要更多資訊來說明您這樣做的原因和嘗試解決的問題,因為它是一個不尋常的案例。