【问题标题】:MongoDB 3.0 write lock on oplog collection in replica modeMongoDB 3.0 在副本模式下对 oplog 集合的写锁定
【发布时间】:2016-02-18 01:59:06
【问题描述】:

在副本模式下,对任何 DB 中任何集合的每个写入操作,也会写入 oplog 集合。

现在,当并行写入多个 DB 时,所有这些写入操作也会写入 oplog。 我的问题:这些写操作需要锁定 oplog 吗? (我正在使用 w:1 写关注)。如果他们这样做了,这有点类似于在所有不同 DB 的所有写操作之间有一个全局锁,不是吗?

我很乐意得到这方面的任何提示。

【问题讨论】:

    标签: mongodb replication replicaset wiredtiger


    【解决方案1】:

    根据documentation,在复制中,当MongoDB写入primary上的一个collection时,MongoDB也会写入primary的oplog,这是本地数据库中的一个特殊collection。因此,MongoDB 必须同时锁定集合的数据库和本地数据库。 mongod 必须同时锁定两个数据库以保持数据库一致并确保写入操作,即使是复制,也是“全有或全无”操作。

    这意味着在主数据库上并行写入多个数据库会导致所有写入操作之间的全局锁定。这不适用于辅助节点,因为 MongoDB 不会将写入串行应用到辅助节点,而是分批收集 oplog 条目,然后并行应用这些批处理。

    【讨论】:

    • 嗯,我阅读了文档,但我仍然无法相信。由于oplog条目是幂等的并且数据库被锁定在应用程序上,实际上不需要它......我真的不明白。
    • 这篇博文也值得一读。作者在开发实时度量系统时确实遇到过这个global lock
    • 忘记添加链接:link:daprlabs.com/blog/blog/2014/04/19/mongodb。请注意,博主为微软工作,他的一些结论似乎有些偏颇。
    【解决方案2】:

    免责声明这是我的全部想法,所以如果我有错误,请不要把我钉在十字架上。但是,请纠正我。

    他们为什么要这样做?

    1. 前提:根据定义,数据库不是相互连接的
    2. oplog entries are always idempotent
    3. Oplog 是capped collection, with a guarantee of preserving the insert order

    让我们假设正在应用的查询是真正的并行性。因此,我们有两个查询同时到达,我们需要决定先将哪个查询插入到 oplog 中。第一个拿到锁的会先写,对吧?除了,有问题。假设第一个查询是一个简单的db.collection.update({_id:"foo"},{$set:{"bar":"baz"}}),而另一个查询更复杂,因此需要更长的时间来评估正确性。因此,为了防止这种情况发生,必须在到达时获取锁,并在写入幂等 oplog 条目后释放。

    这是我必须依靠我的记忆的地方

    但是,查询不会并行应用。查询被排队并按到达顺序进行评估。数据库在通过查询优化器运行后锁定在查询的应用程序上。在该锁定期间,幂等 oplog 查询被写入 oplog。由于数据库没有相互连接,并且在任何给定时间只能将一个查询应用于数据库,因此数据库上的锁定就足够了。 无论如何都不能同时对同一个数据库应用两个数据更改查询,那么为什么要在 oplog 上设置一个锁呢? 显然,对本地数据库进行了锁定。但是,由于已经对数据进行了锁定,因此我看不出原因。 *scratchingMyHead*

    【讨论】:

    • 这篇博文也值得一读,它更详细地描述了副本集中可能出现的effectively global lockdaprlabs.com/blog/blog/2014/04/19/mongodb
    • @Jaco 有趣的阅读,虽然我不能支持他的结论。但是,双锁问题可能值得研究。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多