【问题标题】:Replicate a database using snapshots and transaction logs使用快照和事务日志复制数据库
【发布时间】:2016-02-04 10:37:05
【问题描述】:

出于学习目的,我想编写自己的数据库,它能够自我复制。我已经取得了一些进展,但现在我面临一个我无法解决的问题。假设我有一个数据库(我们称之为源),我想复制到另一个数据库(我们称之为目标)。

基本原则很简单:在源中,您不存储实际的表,而是存储事务日志。将事务日志发送到目标很容易,然后数据库会在目标上自行重建。如果您想更新目标,您只需请求从那以后更改的事务日志部分。基本上这几乎是每个数据库都会做的事情。

虽然可行,但它有一个主要缺点:如果一个表已经存在很长时间,事务日志很长,因此复制该表需要大量时间......

为避免这种情况,您也可以存储当前状态。这意味着您拥有可以快速复制的最新快照。此外,目标必须订阅源的事务日志。一旦它包含其他条目,目标就会将它们应用到其复制的表中。这也很有效,而且在性能和传输量方面要好得多。

但是现在我面临一个问题:假设快照很大,那么可能会在交付时对其进行更改。这意味着复制的快照包含一些旧数据和一些新数据。现在,如何使目标数据库处于一致状态?即使我知道从哪里开始事务日志,我要么必须应用已经应用到某些记录的更改,要么必须将其忽略,但是更改根本不会应用到其他一些记录.

当然,我可以使用顺序隔离级别,但性能会下降。当然,我可以做一些事情,例如CouchDB 记录并记住每条记录中的当前表修订,并为每个修订保留每条记录的副本。但是随后所需的空间会大大增加。

那么,我该怎么办?

我在网上找到的所有东西要么依赖于重放整个事务日志的想法,要么依赖于使用占用大量空间的 CouchDB 中的进程。

有什么想法吗?

【问题讨论】:

    标签: database database-replication transactional-replication


    【解决方案1】:

    您的快照需要保持一致,并且您需要知道它在什么时间(关于 tx 日志)是一致的。然后应用从此时起已提交的所有事务。

    可以使用独占锁定来获得一致的快照,这可能会延迟其他事务的提交,或者使用行版本 (MVCC)。

    祝你的项目好运。

    【讨论】:

    • 感谢 MVCC 的提示,这很有帮助 :-)
    猜你喜欢
    • 2019-07-13
    • 2013-03-04
    • 2023-04-01
    • 2013-07-14
    • 1970-01-01
    • 2012-09-22
    • 2015-12-28
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多