我们有一个由三个成员组成的 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
基本上,我的问题是:这是怎么回事?有这么多交易和这么多回滚是正常的吗?如果不是,根本原因是什么?如何解决?
更新。:我们升级到了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 进行一致读取,但由于它们从未提交过数据,因此事务会被故意中止,并将添加到“事务回滚”指标中。
对于其他用例(例如写冲突(对同一文档的并发内部更新将被透明地重试)),“回滚事务”指标也可以增加。
如果不是,其根本原因是什么以及如何解决?
这个指标不应该成为特别关注或监控的重点。