MongoDB 托管在 Azure Cosmos DB 中:分片与分区

MongoDB hosted in Azure Cosmos DB: Sharding vs partitioning

我们想为我们的数据库使用 MongoDB,我们想使用 MongoDB API 来避免 "locked in" 到 Azure Cosmos DB 托管。

我们使用 .Net Core 和 MongoDB.Driver 包(以便能够在本地、Atlas、Azure Cosmos hsoting 等之间轻松切换)与 MongoDB 实例通信,所以还不错。

为了能够处理未来数据量的增长(大小和性能),我希望对我的集合进行分片。据我了解,Cosmos DB 使用的策略是使用分区键进行分区,但由于我们使用 MongoDB.Driver,我无论如何都找不到在我的查询中指定分区键。

"Plain" MongoDB 改为使用分片,您可以设置一个文档 属性 用作数据分片方式的分隔符。

因此,我的猜测是分片是可行的方法(因为 partionkeys 是 Cosmos 的一项功能),但我无法让它工作。

Azure 门户中的 "MongoDB shell" 不理解 sh.shardCollection 命令,如果我从客户端连接 MongoDB shell,我会收到以下错误:

globaldb:PRIMARY> use sampledatabase
switched to db sampledatabase
globaldb:PRIMARY> sh.shardCollection("sampledatabase.Event", { TenantId: 1 } )
2018-06-21T12:03:06.522+0200 E QUERY    [thread1] Error: not connected to a mongos :

如何在 Azure Cosmos 中托管的 MongoDB 实例中进行分片和 运行?

CosmosDB Mongo api 端点公开了启用了副本集的 MongoD 接口,而不是 MongoS 接口。因此,您需要使用 db.runCommand 而不是 "sh" 分片命令来创建分片集合。

您可以在 https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data#mongodb-api

找到更多详细信息

我后来发现您可以使用 Microsoft.Azure.Documents.Client 创建分片集合。

您必须使用时髦的语法 @"/'$v'/ShardingKey/'$v'" 才能正常工作。 然后,您可以在名为 ShardingKey 的文档上使用 属性,它将与 MongoDB.Driver图书馆。

                        _client.CreateDocumentCollectionAsync(databaseUri,
                        new DocumentCollection
                        {
                            Id = documentCollection.Id,
                            PartitionKey =
                                new PartitionKeyDefinition
                                {
                                    Paths = new Collection<string> {@"/'$v'/ShardingKey/'$v'"}
                                }
                        }, new RequestOptions {OfferThroughput = 1100}).Wait();

参考https://blog.olandese.nl/2017/12/13/create-a-sharded-mongodb-in-azure-cosmos-db/