复制场景中的RavenDB DeleteByIndex和BulkInsert

时间:2015-01-13 17:55:27

标签: replication ravendb

我需要做的是删除整个项目集合并导入一组新数据。

新数据集包含新项目和现有项目(已删除项目的ID相同)。

我需要在具有与其他服务器激活的Master-Master复制的服务器上执行此操作,因此这是方案:

Master-Master复制中的Server1和Server2。 我在Server1上删除并批量插入数据,数据在Server2上复制。

这就是我现在正在做的事情:

第1步。

在Server1中插入50000条记录。

List<Test> data = new List<Test>();

for (int i = 1; i <= 50000; i++)
{
    var t = new Test();
    t.Id = "Tests/" + i.ToString(); // NOTICE THIS
    t.Name = "Test" + i.ToString();
    t.Description = "Test nr. " + i.ToString();
    t.Time = DateTime.Now.TimeOfDay.ToString("hhmmssff");

    data.Add(t);
}

using (var bulkInsert = docStore.BulkInsert(options: new Raven.Abstractions.Data.BulkInsertOptions() { CheckForUpdates = true, BatchSize = 1024 }))
{
    foreach (var d in data)
    {
        bulkInsert.Store(d);
    }
 }

正确插入50000项并将其复制到Server2中,因此我现在在Server1和Server2中都有50000条记录。

第2步。

我启动一个程序来删除Server1中的50000项集合并插入一组新的500项。

// DELETE
var op = docStore.DatabaseCommands.DeleteByIndex("Raven/DocumentsByEntityName", new IndexQuery { Query = "Tag:" + "Tests" }, allowStale: false);
op.WaitForCompletion();

// INSERT
List<Test> data = new List<Test>();

for (int i = 1; i <= 500; i++)
{
    var t = new Test();
    t.Id = "Tests/" + i.ToString(); // NOTICE THIS, SAME IDs DELETED ABOVE
    t.Name = "Test" + i.ToString();
    t.Description = "Test nr. " + i.ToString();
    t.Time = DateTime.Now.TimeOfDay.ToString("hhmmssff");

    data.Add(t);
}

using (var bulkInsert = docStore.BulkInsert(options: new Raven.Abstractions.Data.BulkInsertOptions() { CheckForUpdates = true, BatchSize = 1024 }))
{
    foreach (var d in data)
    {
        bulkInsert.Store(d);
    }
}

当此过程开始时,我在两个服务器中都正确地看到测试项目被删除,我看到两个服务器中的文档都在减少。

当完全删除Server1中的集合时,将启动Insert过程,但是当发生这种情况时,Server2集合尚未为空。

让我们说当Server1删除操作完成时,Server2集合中仍有10000个项目。

Server1上的Insert操作立即启动,插入的数据开始被复制。

Server2中发生的情况是删除操作已停止并插入了新的500项,因此当该过程完成时,我在Server1上有500个项目(从ID 1到ID 500)和Server2上的10500项。

如果我现在删除Server1上的集合(来自Raven Management Studio),则会从Server2中删除500个项目,因此Server2中没有项目,Server2中没有项目。

我还试图结合DeleteByIndex&#34; WaitForCompletion&#34;设置和BulkInsert&#34; CheckForUpdates&#34;使用以下结果进行设置:

1

DeleteByIndex.WaitForCompletion = true
BulkInsert.CheckForUpdates = true

结果:

当Server1上的Insert启动时,在Server2中停止删除复制(这是上面解释的情况)

2

DeleteByIndex.WaitForCompletion = true
BulkInsert.CheckForUpdates = false

结果:

当Server1上的Insert启动时,在Server2中停止删除复制(与上面相同)

3

DeleteByIndex.WaitForCompletion = false
BulkInsert.CheckForUpdates = true

结果:

插入启动时收到并发修改错误。

删除在两台服务器上完成,因此在程序结束时我的两台服务器上都没有数据。

4

DeleteByIndex.WaitForCompletion = false
BulkInsert.CheckForUpdates = false

结果:

插入启动时收到非法重复键错误, 删除在两台服务器上完成,因此在程序结束时我的两台服务器上都没有数据。


有人可以建议管理这种情况的最佳方法吗?

我回顾了目标:

我需要在Mster-Master复制方案中完全删除一个集合并导入新数据。 新数据可以是全新项目或以前存在的数据。

提前致谢。

0 个答案:

没有答案