【问题标题】:Easiest way to have a 100% copy of a Cosmos DB container拥有 Cosmos DB 容器 100% 副本的最简单方法
【发布时间】:2020-10-14 22:27:59
【问题描述】:

我希望 Cosmos DB 数据库中的两个不同容器始终包含完全相同的数据。唯一的区别是容器的分区键。

实现此目的最简单的方法是什么?我正在寻找一种几乎没有代码的方法,所以我不喜欢互联网似乎推荐的数据工厂解决方案。也许 Azure 中有其他服务或第三方服务 - 或者它可以通过简单的触发器稳健地完成?

编辑:澄清 - 我需要他们不断更新。一个容器是在正常使用期间更改所有数据的地方,另一个容器应在发生时保持同步。

【问题讨论】:

  • @MarkusMeyer 乍一看似乎有两个问题。 1:它不支持 Cosmos DB,但也许我遗漏了一些东西。 2:更多的是单个操作,而不是随着其中一个容器的变化而不断保持两个容器同步。
  • 它支持 DocumentDB。这是 CosmosDB 的旧名
  • @MarkusMeyer 我可以找到的使用 AzCopy 的示例是关于迁移的,而不是关于保持两个容器同步的。您确定它适合该目的吗?如果适合,您能否提供一些关于从哪里开始的指导?
  • 好的。我使用 Azure 函数为自己解决了这个问题。集合 A 上有一个触发器,函数将文档存储在集合 B 中

标签: azure-cosmosdb


【解决方案1】:

这是它的功能代码:

using System;
using System.Collections.Generic;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace CosmosDBSyncFunction
{
    public static class SyncCosmosDb
    {
        [FunctionName(nameof(Sync))]
        public static void Sync(
            [CosmosDBTrigger(
                databaseName: "evaluation",
                collectionName: "lorem",
                ConnectionStringSetting = "cosmos-mm-eval",
                LeaseCollectionName = "leases",
                CreateLeaseCollectionIfNotExists=true
            )]IReadOnlyList<Document> input,
            [CosmosDB(
                databaseName: "evaluation",
                collectionName: "ipsum",
                ConnectionStringSetting = "cosmos-mm-eval")] IAsyncCollector< Document> output,
            ILogger log)

        {

            foreach(var item in input)
            {
                output.AddAsync(item);
            }
        }
    }
}

以及必须配置的设置 local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "cosmos-mm-eval": "secret",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  }
}

【讨论】:

  • 看起来没有很多代码会失败。我有点担心间歇性错误,例如短暂失去连接,然后是否会丢失某些更改。你知道这种可能性有多大吗?
  • 一般来说,连接没有问题。 Azure Functions 和 CosmosDB 具有非常高的可用性。但这也取决于使用 VNET 等的连接复杂性。当然,您必须使用 App Insights 进行日志记录,这也会记录任何问题。
  • 是的,然后我必须在旁边编写一些自定义同步代码来修复发生的问题。但听起来这种方法确实是“最简单的”,尽管我希望更容易。我会把这个问题留得久一点,坚持下去。
【解决方案2】:

如果您不想编写自己的代码来执行此操作,您可以使用这个具有 Cosmos DB Live Data Migrator 的 repo。

这可以通过 Azure 部署按钮进行部署。部署后,您可以打开网站并输入所有必需的信息。然后单击另一个按钮,它将使两个容器与不同的分区键保持同步。

【讨论】:

  • 非常感谢您。我确实需要这个,因为我将根据您在哥本哈根微软展示的原则来实施。
  • 不幸的是,它似乎对我的目的不太好,因为它只支持保持两个容器同步并且需要两个应用服务。因此,每次我想连接两个容器时,我都必须部署另外两个应用服务。在第一种情况下,我将取两个容器并将它们同步到一个容器(使用新的分区键),这样就已经是 4 个应用服务了,这有点多。
  • 那么对于您的方案,最简单的方法是使用更改提要处理器从源容器中读取数据,并为要保持同步的每个容器创建单独的 CosmosContainer 实例。然后将其托管在 Azure Function 或您想要的任何计算中。这很容易做到。
  • 是的,我想我最终会这样做。谢谢陪练。我曾希望有一些隐藏和故障安全的东西,比如“全球复制数据”功能。具有讽刺意味的是,它不能在非全局范围内复制数据:)
  • 啊,我明白了。是的,我们实际上正在努力让人们现在变得超级容易,但要到年底,明年年初才会推出。谢谢。
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多