The problem:

Every one or two minutes, the mongo clients halt for about 3 seconds. Normal operation time for updates is about 1 or 2 milliseconds. When this slowness appear, we have a bunch of updates lasting 1 to 3 seconds.

慢速查询日志(log)没有显示与此相关的任何内容.调试mongo客户端(mongo php客户端)也是如此.

当前的体系 struct 在副本集中有一个主、一个从和一个仲裁器.

执行的查询总是相同的排序(按_id向上插入,用new MongoId插入).没有"每隔几分钟我们就会运行这个超级昂贵的更新"

堵塞似乎是由局部原因造成的.oplog.rs.至少,这是mongotop的输出在下面显示的.我还没有发现任何迹象表明次级系统导致了这个问题,因为下面所有命令的输出似乎都是稳定的.我也没有发现任何信息表明这种慢度是由特定的查询引起的.

我们存储数据的方式背后的 idea 是预聚合报告.我们有很多更新(每秒几百次),但查询率非常低.

"indexSizes" : {
    "_id_" : 1967,
    "owner_date" : 230,
    "flow_date" : 231,
    "date" : 170
},

大多数其他集合的索引大小不超过100Mb.在所有的Collection 中,_id索引是最大的一个.值得注意的是,此ID是手动生成的(基于元数据,因此插入是作为upsert进行的,而不是增量的)

FollowUp:

Edit1:在进一步挖掘之后,当刷新到磁盘时,锁定似乎与日志(log)的rsync过程有关.日志(log)与数据文件位于同一个文件系统中,但由于磁盘是快速ssd设备,因此在中的速度不是预期的.

Edit2:经过一些测试后,磁盘的写入能力不是问题.我们通常以每秒数兆字节的速度写入.在磁盘上运行一些测试,它可以毫无问题地接受150mb/s的速度

The expected answer:

为什么会发生这种停机?

  • 指向可能的原因,以便进一步调查
  • 基于类似 case 的经验/解决方案

Issue Explanation:

The following commands are run in the primary node

每次缓慢出现时,我们都会在mongostat中看到以下内容(两个示例)

insert query update delete getmore command % dirty % used flushes vsize  res qr|qw ar|aw netIn netOut conn set repl     time
    10    *0    141     *0      93   120|0     0.4   80.0       0 11.5G 9.4G   0|1   1|0  110k    71k  274 rs0  PRI 13:15:44
    12    *0    178     *0      72   105|0     0.2   80.0       1 11.5G 9.4G   0|0   1|0  111k    79k  274 rs0  PRI 13:15:45
    47    *0      7     *0       0   159|0     0.1   80.0       0 11.5G 9.4G   0|0   2|1   15k    44k  274 rs0  PRI 13:15:49 !!!!HERE
    14    *0    929     *0      99   170|0     0.2   80.0       0 11.5G 9.4G   0|0   1|0  419k   417k  274 rs0  PRI 13:15:50
    21    *0    287     *0     124   181|0     0.2   80.0       0 11.5G 9.4G   0|0   1|0  187k   122k  274 rs0  PRI 13:15:51

insert query update delete getmore command % dirty % used flushes vsize  res qr|qw ar|aw netIn netOut conn set repl     time
    10    *0    145     *0      70   108|0     0.3   79.9       0 11.5G 9.4G   0|0   1|0   98k    71k  274 rs0  PRI 13:16:48
    11    *0    155     *0      72   111|0     0.2   79.9       1 11.5G 9.4G   0|0   1|0  103k    75k  274 rs0  PRI 13:16:49
    44    *0      3     *0       0   144|0     0.0   79.9       0 11.5G 9.4G   0|2   1|0   11k    75k  274 rs0  PRI 13:16:53 !!!!HERE
    11    *0    837     *0      94   134|0     0.2   79.9       0 11.5G 9.4G   0|0   1|0  377k   348k  274 rs0  PRI 13:16:54
    12    *0    180     *0      86   139|0     0.2   79.9       0 11.5G 9.4G   0|0   1|0  122k    85k  274 rs0  PRI 13:16:55
    14    *0    195     *0      83   124|0     0.2   79.9       0 11.5G 9.4G   0|0   2|0  125k    89k  274 rs0  PRI 13:16:56

更新列中有一个下拉列表,下面的一个下拉列表中有更多更新.还要注意的是,我们使用的mongostat有1秒的延迟.当慢度出现时,mongostat会在几秒钟内停止回复.

这是发生此问题时mongotop的输出(2015-07-07T13:29:38):

(在here中可以找到一个有更多上下文的例子)

                                                                                        ns    total     read    write    2015-07-07T13:29:33+02:00
                                                           database_name.d_date_flow_owner    555ms    550ms      4ms                             
                                                                            local.oplog.rs     61ms     53ms      7ms                             
                                                      database_name.client_context_bbbbbbb     15ms      0ms     15ms                             
                                                        database_name.d_date_landing_owner     15ms      0ms     15ms                             
                                                        database_name.d_date_billing_owner     10ms      0ms     10ms                             
database_name.w_bl_carrier_country_date_device_flow_landing_manager_op1_os_owner_prod_site      7ms      0ms      7ms                             
                database_name.d_carrier_country_date_device_flow_landing_op1_os_owner_site      5ms      0ms      5ms                             
                                                        database_name.d_country_date_owner      5ms      0ms      5ms                             
                                                         database_name.d_date_device_owner      5ms      0ms      5ms                             
                                                             database_name.d_date_os_owner      5ms      0ms      5ms                             

                                          ns    total    read    write    2015-07-07T13:29:37+02:00
        database_name.client_context_bbbbbbb      2ms     0ms      2ms                             
      database_name.client_context_aaaaaaaaa      1ms     0ms      1ms                             
                   admin.system.backup_users      0ms     0ms      0ms                             
                     admin.system.namespaces      0ms     0ms      0ms                             
                      admin.system.new_users      0ms     0ms      0ms                             
                        admin.system.profile      0ms     0ms      0ms                             
                          admin.system.roles      0ms     0ms      0ms                             
                          admin.system.users      0ms     0ms      0ms                             
                        admin.system.version      0ms     0ms      0ms                             
                               database_name      0ms     0ms      0ms                             

                                                                        ns     total      read     write    2015-07-07T13:29:38+02:00
                                                            local.oplog.rs    8171ms    4470ms    3701ms                             
                                            database_name.d_date_op1_owner      45ms       0ms      45ms                             
                                         database_name.d_date_device_owner      39ms       0ms      39ms                             
                                                database_name.m_date_owner      34ms       0ms      34ms                             
                                                database_name.d_date_owner      32ms       0ms      32ms                             
                                           database_name.d_date_owner_site      31ms       0ms      31ms                             
                                        database_name.d_carrier_date_owner      30ms       0ms      30ms                             
                                           database_name.d_date_flow_owner      30ms       0ms      30ms                             
                                        database_name.d_date_owner_product      28ms       0ms      28ms                             
database_name.d_carrier_country_date_device_flow_landing_op1_os_owner_site      27ms       0ms      27ms                             

                                                                                        ns    total     read    write    2015-07-07T13:29:39+02:00
                                                           database_name.d_date_flow_owner    558ms    552ms      6ms                             
                                                                            local.oplog.rs     62ms     61ms      1ms                             
                                                        database_name.d_carrier_date_owner     17ms      0ms     17ms                             
                                                                database_name.d_date_owner     16ms      0ms     16ms                             
database_name.w_bl_carrier_country_date_device_flow_landing_manager_op1_os_owner_prod_site      7ms      0ms      7ms                             
                                                        database_name.d_date_billing_owner      6ms      0ms      6ms                             
                database_name.d_carrier_country_date_device_flow_landing_op1_os_owner_site      5ms      0ms      5ms                             
                                                        database_name.d_country_date_owner      5ms      0ms      5ms                             
                                                         database_name.d_date_device_owner      5ms      0ms      5ms                             
                                                            database_name.d_date_op1_owner      5ms      0ms      5ms                             

显示问题的php mongo客户端的调试(最后两行"PhpMongoClient调试"):

(在here中可以找到一个有更多上下文的例子)

Update duration: 2ms
Update duration: 1ms
Update duration: 1ms
Update duration: 4006ms
    PhpMongoClient debug: 2015-07-07 10:40:26 -  PARSE (INFO): Parsing mongodb://primary_host.lan,secondary_host.lan
    PhpMongoClient debug: 2015-07-07 10:40:26 -  PARSE (INFO): - Found node: primary_host.lan:27017
    [....]
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): limiting by credentials: done
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): sorting servers by priority and ping time
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): - connection: type: PRIMARY, socket: 42, ping: 0, hash: primary_host.lan:27017;rs0;database_name/user/5ca571e7db198eeee3abee35857bfd53;30751
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): sorting servers: done
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): selecting near servers
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): selecting near servers: nearest is 0ms
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): - connection: type: PRIMARY, socket: 42, ping: 0, hash: primary_host.lan:27017;rs0;database_name/user/5ca571e7db198eeee3abee35857bfd53;30751
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (FINE): selecting near server: done
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (INFO): pick server: random element 0
    PhpMongoClient debug: 2015-07-07 10:40:26 -  REPLSET (INFO): - connection: type: PRIMARY, socket: 42, ping: 0, hash: primary_host.lan:27017;rs0;database_name/user/5ca571e7db198eeee3abee35857bfd53;30751
    PhpMongoClient debug: 2015-07-07 10:40:26 -  CON (FINE): No timeout changes for primary_host.lan:27017;rs0;database_name/user/5ca571e7db198eeee3abee35857bfd53;30751
    PhpMongoClient debug: 2015-07-07 10:40:30 -  CON (FINE): No timeout changes for primary_host.lan:27017;rs0;database_name/user/5ca571e7db198eeee3abee35857bfd53;30751
Update duration: 3943ms
Update duration: 3476ms
Update duration: 2008ms
Update duration: 961ms
Update duration: 956ms
Update duration: 20ms
Update duration: 20ms
Update duration: 3ms
Update duration: 42ms
Update duration: 24ms
Update duration: 25ms
Update duration: 56ms
Update duration: 24ms
Update duration: 11ms
Update duration: 11ms
Update duration: 3ms
Update duration: 2ms
Update duration: 3ms
Update duration: 1ms
Update duration: 1ms
Update duration: 1ms
Update duration: 2ms

Mongo Information:

  • Mongo版本:3.0.3
  • 带有1个从机和1个仲裁器的副本集
  • 复制延迟在0到4秒之间变化
  • 引擎:WiredTiger
  • 文件系统:XFS
  • 操作系统:Red Hat Enterprise Linux Server 7.1版
  • 内存:24Gb.htop报告使用率为40%,缓存率为60%

推荐答案

这个问题现在已经消失了.采取了两项行动:

  1. 修改了预汇总报告系统.mongo的工作量减少了10倍.
  2. mongo的更新版本为3.0.6

不幸的是,这两个变化是在没有太多时间的情况下上线的.我怀疑,至少在目前(我们将在再次达到之前的工作量水平时看到),减少工作量起到了作用(这可能与@steve brisk指出的问题有关,也可能与此无关).但是,随着版本的更新,即使在以前的工作量水平下,我们可能也不会再次遇到这个问题

我没有证据表明这两种解决方案中只有一种是正确的.但在服用了这两种药物后,问题就解决了

Mongodb相关问答推荐

如何将数组$拉到对象数组下

将消息流式传输到WebSocket

从MongoDB迁移到PostgreSQL:为PostgreSQL编写聚合管道查询

MongoDB:通过嵌套数组中的最后一个元素值获取文档

如何修改 mongodb 中嵌套对象数组中的字段名称/键?

使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

如何使用 C# MongoDB 驱动程序检索字段子集?

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

如何在 mongo JavaScript shell 中中止查询

ZonedDateTime 与 MongoDB

是否有适用于 Linux 的 MongoDB GUI 桌面应用程序?

Flask:设置应用程序和请求特定的属性?

Mongo:匹配聚合查询中的日期似乎被忽略了

Mongodb错误:The positional operator did not find the match needed from the query

Java + MongoDB:更新文档中的多个字段

Meteor订阅不更新集合的排序顺序

判断字段是否存在于数组的子文档中

使用 C# 聚合 $lookup

我可以只获取 Cursor 对象(pymongo)中的第一项吗?