1

爲了學習的目的,我想編寫自己的數據庫,它能夠自我複製。我取得了一些進展,但現在我面臨着一個我無法解決的問題。假設我有一個數據庫(我們稱之爲源代碼),我想將其複製到另一個數據庫(我們稱之爲該目標)。使用快照和事務日誌複製數據庫

基本原理很簡單:在源代碼中,您不存儲實際表,而是存儲事務日誌。將事務日誌發送到目標很容易,然後數據庫在那裏重建自己。如果您想更新目標,那麼您只需要請求事務日誌中發生過變化的部分。基本上這就是幾乎每個數據庫所做的事情。

雖然這個工作,它有一個主要缺點:如果一個表已經存在很長一段時間內,事務日誌很長,因此複製表需要大量的時間...

爲了避免這種情況,你可以存儲當前狀態。這意味着您可以快速複製最新的快照。另外,目標必須訂閱源的事務日誌。一旦它包含額外的條目,目標將它們應用到其複製的表格。這也很好,而且在性能和轉換量方面表現更好。

但是現在我面臨一個問題:假設快照很大,那麼可能會在傳送時對其進行更改。這意味着複製的快照包含一些舊的和一些新的數據。現在,我如何使目標數據庫處於一致狀態?即使我知道從哪裏開始事務日誌,我也必須應用已經應用於某些記錄的更改,或者必須將其忽略掉,但是,更改根本不適用於某些其他記錄。

當然,我可以使用隔離級別順序,但然後性能下降。當然,我可以做例如CouchDB會記錄每個記錄中的當前表修訂,併爲每個修訂保留每個記錄的副本。但隨後所需的空間大大增加。

那麼,我該怎麼辦?

我在網上找到的所有東西總是依賴於重播整個事務日誌的想法,或者使用一個在CouchDB中佔用大量空間的進程。

任何想法?

回答

2

您的快照需要保持一致,並且您需要知道什麼時候(關於TX日誌)它是一致的。然後,您應用自此之後已經提交的任何交易。

獲得一致的快照可以通過獨佔鎖定來完成,這可能會延遲其他事務的提交或使用行版本(MVCC)。

祝您的項目順利。

+0

感謝MVCC的提示,這很有幫助:-) –