【发布时间】:2016-02-04 10:37:05
【问题描述】:
出于学习目的,我想编写自己的数据库,它能够自我复制。我已经取得了一些进展,但现在我面临一个我无法解决的问题。假设我有一个数据库(我们称之为源),我想复制到另一个数据库(我们称之为目标)。
基本原则很简单:在源中,您不存储实际的表,而是存储事务日志。将事务日志发送到目标很容易,然后数据库会在目标上自行重建。如果您想更新目标,您只需请求从那以后更改的事务日志部分。基本上这几乎是每个数据库都会做的事情。
虽然可行,但它有一个主要缺点:如果一个表已经存在很长时间,事务日志很长,因此复制该表需要大量时间......
为避免这种情况,您也可以存储当前状态。这意味着您拥有可以快速复制的最新快照。此外,目标必须订阅源的事务日志。一旦它包含其他条目,目标就会将它们应用到其复制的表中。这也很有效,而且在性能和传输量方面要好得多。
但是现在我面临一个问题:假设快照很大,那么可能会在交付时对其进行更改。这意味着复制的快照包含一些旧数据和一些新数据。现在,如何使目标数据库处于一致状态?即使我知道从哪里开始事务日志,我要么必须应用已经应用到某些记录的更改,要么必须将其忽略,但是更改根本不会应用到其他一些记录.
当然,我可以使用顺序隔离级别,但性能会下降。当然,我可以做一些事情,例如CouchDB 记录并记住每条记录中的当前表修订,并为每个修订保留每条记录的副本。但是随后所需的空间会大大增加。
那么,我该怎么办?
我在网上找到的所有东西要么依赖于重放整个事务日志的想法,要么依赖于使用占用大量空间的 CouchDB 中的进程。
有什么想法吗?
【问题讨论】:
标签: database database-replication transactional-replication