我们有一个由三个成员组成的 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包),问题仍然存在。
中的许多指标
db.serverStatus().wiredTiger
可能会令人困惑,因为它们反映的是底层 WiredTiger 存储引擎指标和术语,而不是 MongoDB API。诸如事务、会话和回滚之类的术语具有与最终用户 MongoDB 功能不同的存储内部上下文。一些公开的指标对最终用户监控不是很有用,但它们可以为熟悉底层存储 API 的开发人员提供诊断洞察力。WiredTiger 存储引擎使用多版本并发控制 (MVCC)来提供对正在读取和写入数据的内部线程的并发访问。MongoDB 服务器有一个集成层,它使用底层存储引擎 API 实现通过 MongoDB API(由驱动程序使用)公开的命令。
在 WiredTiger API 中有内部会话和事务,因此内部线程可以处理一致的数据快照。内部事务可以通过提交(数据已写入)或回滚(有意中止或由于错误而中止事务)来结束。
是的,这很正常。通过 MongoDB 集成层的只读查询使用 WiredTiger 事务 API 进行一致读取,但由于它们从来没有提交数据,因此有意中止事务并将添加到“事务回滚”指标中。
对于其他用例,例如写入冲突(对同一文档的并发内部更新,将透明地重试),“事务回滚”指标也可以增加。
该指标不应成为关注或监控的特别重点。