【问题标题】:Understanding WriteConcern in MongoDB C#了解 MongoDB C# 中的 WriteConcern
【发布时间】:2018-11-18 20:31:30
【问题描述】:

我一直在阅读 MongoDB 中的 Write Concern。我知道有几个级别决定了写入操作成功的保证级别,您设置的这个级别越高,性能权衡。但是,我在 C# 环境中工作,我试图弄清楚如何在那里使用 Write Concern 以及哪些级别最适合某些情况。我已经弄清楚如何使用 WriteConcernResult 对象收集检查结果,我主要对关卡本身感兴趣。

这些是我的问题:

如何在 C# 中为特定写入设置 Write Concern 级别?

This answer 建议使用连接字符串,但这看起来像一个全局设置,我不想要,因为我将使用的一些写操作比其他操作更“重要”,我不想要杀死表演。我注意到有一个WriteConcern class,但文档对它的使用不是很详细(它在文档中的 MongoDB.Driver 命名空间下)。

特别是,我如何将其设置为“Journaled”或“Replica Acknowledged”,默认情况下它是“Acknowledged”?

哪些类型的问题可以通过每个级别的 Write Concern 检查?

例如:系统崩溃、电源故障、网络连接问题等。我对不易检测到的偷偷摸摸的东西特别感兴趣,因为电源故障等非常明显,我们可以估计操作可能失败的时间间隔并做出相应的反应。

【问题讨论】:

  • Insert/Update/Remove 方法具有接受 WriteConcern 的重载。

标签: c# .net mongodb mongodb-.net-driver


【解决方案1】:

对于 2.x c# 驱动程序,您可以通过以下方式使用写入关注:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(new WriteConcern(
        w: 1,
        wTimeout: default(TimeSpan?),
        fsync: true,
        journal: false));

那么使用此集合对数据库的任何更新都将使用传递的写入关注点。

collection.InsertOne(...);
collection.ReplaceOne(...);
collection.UpdateMany(...);
and so on

有几个预定义的写入问题,例如

对于非常快速但不可靠的更新:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.Unacknowledged);

或类似于默认的WriteConcern (w=1)

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.W1);

或用于确认副本集的大多数成员

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.WMajority);

有关详细信息和更多选项,请参阅此处的文档: https://mongodb.github.io/mongo-csharp-driver/2.7/apidocs/html/T_MongoDB_Driver_WriteConcern.htm

【讨论】:

  • C# 驱动程序的默认写入关注点是什么?我认为它会像 MongoDB 那样是 w=1,但我从未设置写入问题,而且它似乎默认为“多数”......这是一个错误还是对于 C# 驱动程序来说真的是“多数”?.. .
  • @AsheqReza:c#驱动程序只是mongodb服务器的一个API,所以你在c#代码中设置的wc - 只需在命令中发送到mongodb服务器。类似于将 { writeConcern: { w: "majority" } } 添加到插入/更新命令时的影响。见docs.mongodb.com/manual/core/replica-set-write-concern
  • 这是否增加了很多速度,我有一个 mongo 实例,过去 2.5 亿条记录像狗一样跑
  • 这解决了我的问题。不知道为什么我必须显式添加.WithWriteConcern(WriteConcern.WMajority),因为它在移动到流畅的配置而不是注释之前正在工作,但我做到了。它也已经是我的连接字符串的一部分。很奇怪。
【解决方案2】:

MongoDB C# 驱动程序中的操作具有接受 WriteConcern 的重载,您可以通过使用类构造函数或使用预定义的静态属性来获得:

var writeConcern = WriteConcern.W4;
writeConcern.Journal = true;
writeConcern.WTimeout = TimeSpan.FromMilliseconds(100);
new MongoClient().GetServer().GetDatabase("").GetCollection("").Insert(null, null, writeConcern);

例如,这需要在主节点之上有 3 个副本,因此 W4,Journal 标志打开并且 wtimeout 设置为 100 毫秒。

【讨论】:

  • 好的,谢谢您的信息!您是否还知道哪些类型的问题可以潜入每个级别而未被发现(在我上面的第二个问题中指定)。我想知道为不同的操作设置什么级别以平衡性能和数据完整性。编辑:另外,WriteConcern.W4 是否有效地将 Write Concern 级别设置为最高级别“Replica Acknowledged”?如果是这样,日志标志甚至是必要的吗?数据不会在副本确认阶段之前被记录吗?
  • 我不太明白你所说的偷偷摸摸的问题是什么意思。如果您使用 Unacknowledged,那么您将不会意识到错误,如果您复制到副本集中 10 个实例中的 2 个实例并且这两个实例失败,您的数据就会丢失。
  • @AugPopa Replica Acknowledged 并不是一个真正的级别。任何高于 1 的 w 级别都需要副本确认,wmajority 也需要。它设置所需的实例数(包括主实例)。日志标志添加了仅与主实例相关的无关需求。更多内容请关注documentation
  • 我尝试使用 writeConcern.Journal = true,但结果它是只读的。我猜想 W[number] 写关注级别将其设置为应该设置的方式。
  • @user1635881 这个答案与 1.x 驱动程序相关。你用的是 2.x 的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多