WiredTiger 存储引擎报告 MongoDB 中出现大量回滚

WiredTiger 存储引擎报告 MongoDB 中出现大量回滚

我们有一个由三个成员组成的 MongoDB 复制集:

        "members" : [
                {
                        "_id" : 6,
                        "host" : "10.0.0.17:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 7,
                        "host" : "10.0.0.18:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 8,
                        "host" : "10.0.0.19:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],

集群处于中等负载下,每秒请求数不超过几十个。 db.serverStatus()主服务器报告几乎所有事务都已回滚:

"transaction begins" : 2625009877,
"transaction checkpoint currently running" : 0,
"transaction checkpoint generation" : 22618,
"transaction checkpoint max time (msecs)" : 5849,
"transaction checkpoint min time (msecs)" : 153,
"transaction checkpoint most recent time (msecs)" : 1869,
"transaction checkpoint scrub dirty target" : 0,
"transaction checkpoint scrub time (msecs)" : 0,
"transaction checkpoint total time (msecs)" : 11017082,
"transaction checkpoints" : 22617,
"transaction checkpoints skipped because database was clean" : 0,
"transaction failures due to cache overflow" : 0,
"transaction fsync calls for checkpoint after allocating the transaction ID" : 22617,
"transaction fsync duration for checkpoint after allocating the transaction ID (usecs)" : 354402,
"transaction range of IDs currently pinned" : 0,
"transaction range of IDs currently pinned by a checkpoint" : 0,
"transaction range of IDs currently pinned by named snapshots" : 0,
"transaction range of timestamps currently pinned" : 8589934583,
"transaction range of timestamps pinned by the oldest timestamp" : 8589934583,
"transaction sync calls" : 0,
"transactions committed" : 30213144,
"transactions rolled back" : 2594972913,
"update conflicts" : 578

Grafana 的交易图

基本上,我的问题是:这是怎么回事?有这么多交易和这么多回滚是正常的吗?如果不是,根本原因是什么?如何解决?

更新。:我们升级到了3.6.8-2.0(这是 3.6 系列中的最新 Percona 软件包),但问题仍然存在。

答案1

其中的许多指标db.serverStatus().wiredTiger可能会令人困惑,因为它们反映的是底层 WiredTiger 存储引擎指标和术语,而不是 MongoDB API。术语如下交易会议, 和回滚与最终用户 MongoDB 功能相比,存储内部环境具有不同的上下文。一些公开的指标对于最终用户监控来说不是很有用,但它们可以为熟悉底层存储 API 的开发人员提供诊断见解。

这里发生了什么?

WiredTiger 存储引擎使用多版本并发控制 (MVCC)提供对读取和写入数据的内部线程的并发访问。MongoDB 服务器有一个集成层,它使用底层存储引擎 API 实现通过 MongoDB API(由驱动程序使用)公开的命令。

在 WiredTiger API 中有内部会话和交易这样内部线程就可以使用一致的数据快照。内部事务可以通过提交(数据已写入)或回滚(事务故意或由于错误而中止)来结束。

有这么多交易和这么多回滚是正常的吗?

是的,这是正常的。通过 MongoDB 集成层进行的只读查询使用 WiredTiger 事务 API 进行一致读取,但由于它们从未提交过数据,因此事务会被故意中止,并将添加到“事务回滚”指标中。

对于其他用例(例如写冲突(对同一文档的并发内部更新将被透明地重试)),“回滚事务”指标也可以增加。

如果不是,其根本原因是什么以及如何解决?

这个指标不应该成为特别关注或监控的重点。

相关内容