2012-07-11 85 views
10

昨晚将收藏集转换为封面收藏集时,我的辅助时间开始落后于小学。它每隔几分钟就会缓慢地前进几秒钟,最终从主要的oplog窗口中退出。根据指令here,我停止了辅助节点上的mongod,删除了所有数据文件,并重新启动了它,但我忘记锁定主节点。中学经历了其初始阶段,这需要花费很长时间,并且终于恢复了业务,但是当我登录时,复制现在更加落后了。为什么我的MongoDB副本继续落后?

因为这是云,毕竟我创建了一个我的主映像(它应该复制所有数据)的映像,尽管我当时无法运行db.fsyncLock(),因为它需要一些写道。新图像完成后,我会启动一个基于该图像的新服务器,将它添加到我的副本集,删除旧的辅助图像,并且生活很好,对不对?不完全 - 新的中学落后了大约一个小时,并且在一天中(和今天晚上)最终达到落后14个小时的时间(尽管仍然在oplog窗口内仍然奇怪)。

我从“重新陈旧的成员页面”开始下一步。在两台服务器上关闭mongod,gzip并将我的数据文件夹从主要副本复制到辅助副本,然后解压并将它们同时激活,db.fsyncLock()是我的主要副本。我的想法是,即使在初始化完成之后,我的辅助者说,它已经落后了1个小时。我将它重新添加到副本集中,并迅速赶上5分钟后。

所有不错,对不对?没有 - 向前闪,中学正在前进,现在落后20分钟。 Mongostat有95%以上的锁定率,iostat -xm 2没有显示任何疯狂的情况 - 小学目前由于没有写入而处于闲置状态,二级绝对没有太多的工作(0.04 WMB /秒)。不知道是否值得一提,但目前初级感觉 狗慢 登录进mongo shell等反应迟钝

什么给Mongo?为什么你不能赶上?我试图让自己的第二手被抓住,我做错了什么?

编辑 回答问题:

  • 版本:2.0.4
  • 硬件:两个节点在相同的硬件,靠近我可以告诉大家 - 8GB的内存,四核CPU。我认为这是虚拟化的东西。
  • 写入速率:不同。如前所述,昨天晚上我转变为封顶收藏,这引发了整个事情。一夜之间,有一个过程每小时几次写几百个小文档(每个大约155字节),所以我估计大约100-200kbytes /小时。在白天,处理更加激烈,更新了数十万个500字节的文档,并且编写了几十万个文档。仍然没有谈论巨大的数据量。 EDIT发现从今天早些时候一些iostat的输出:
 
Device:   rrqm/s wrqm/s  r/s  w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 
xvda    1.00 2564.50 243.50 282.50 8986.00 11388.00 77.47 11.32 21.46 2.36 37.93 0.50 26.50 

那一个是在11 WMB/s的特别突发,锯UTIL%击中34%与7 WMB/s,并且在52元72%/秒。所以不是饱和的,但肯定是早上的阅读繁重的工作量。尽管有obj,但它很有趣。大小〜5GB,以及〜1GB的索引(见下文),磁盘活动非常多。不应该全部在RAM中吗?

  • 工作集:我还没有找到计算工作组接受的方法,但如果它可以帮助:
 
    "collections" : 21, 
    "objects" : 15540092, 
    "avgObjSize" : 325.26198326238995, 
    "dataSize" : 5054601144, 
    "storageSize" : 5874327552, 
    "numExtents" : 132, 
    "indexes" : 43, 
    "indexSize" : 864366720, 
    "fileSize" : 10666115072, 
    "nsSizeMB" : 16, 
    "ok" : 1 

我无法想象,这是的RAM 8GB铺天盖地,但我可能是错的。

  • 从二级最近的一些mongostat样本:
 
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss %  qr|qw ar|aw netIn netOut conn set repl  time 
    *0  *0  *0  *0  0  1|0  0 22.2g 44.9g 912m  0  99.2   0  0|0  0|1  2k 303b 151 mySet SEC 03:47:54 
    *0  *0  *0  *0  0  1|0  0 22.2g 44.9g 1.85g  0  101   0  0|0  0|1  3k 303b 151 mySet SEC 03:48:04 

编辑

尝试更多的东西。我关闭了主服务器(现在叫做A,次要服务器会是B),删除了它的数据,并且解压了它的快照(现在已经过了几个小时了,但是现在我们并没有写任何新的东西)。开始使用--fastsync,它仍然比B(现在主要)的optime晚了45秒,这个时间大约在02:19:52UTC。最后大约一个小时后,A赶上了,所以我在B上调用了rs.stepDown()。即时地,rs.status()告诉我两台服务器在UTC时间04:08左右都有optimes,但是B(现在是次要的)再次滞后17数秒然后在30秒......现在7分钟...

编辑

采取@ matulef的建议,并几分钟后重新创建我的收藏上限指标,以及重新启动辅助的mongod进程,其运行时间只增加了几秒钟。来自mongostat的二级锁定百分比仍然在95-104%之间徘徊,有趣的是,res size的大小从100M到2GB变得非常大,然后又回到了1GB左右。

EDIT(第二天晚上)

结论的故事 - @matulef是在正确的轨道上,我应该更小心复制的集合转换为上限的集合。接下来是发生了什么,虽然我没有宣传这是数据安全的 - 我自由地承认我可能在这个过程中丢失了一些数据,所以YMMV。

在主(A)上创建加盖集合的索引不会传播到辅助节点(B),并且偶然发生故障切换(并非有意)。一旦B是主要的,我手动在那里的封顶集合上创建索引,并且使A与B一致的再同步操作开始快速移动。不幸的是,我的oplog窗口不再排队,所以我最终不得不将数据从B快照到A.一旦我用相同的数据重新启动了mongo,A & B又开心了,复制又回来了从此同步。

+0

是次要的硬件明智的主要?也是什么版本的mongoDB是这样的? – 2012-07-11 02:56:13

+0

写入速率是多少?多少内存和什么是mongos工作集? – Kevin 2012-07-11 03:03:03

+1

你有一个_id指数为你的封顶集合?默认情况下,它不是创建在加盖集合上,所以我的猜测是,当你做了“convertToCapped”时,你就失去了它。这是复制滞后的常见(且易于修复)原因。在这里看到警告:http://www.mongodb.org/display/DOCS/Capped+Collections – matulef 2012-07-11 04:17:15

回答

6

这里的问题是,默认情况下,加盖集合没有_id索引(并且“convertToCapped”命令实际上会为该集合删除全部索引)。这是一个问题,因为辅助人员通过应用来自oplog的ops来执行更新,opks通过_ids引用文档。如果缺少_id索引,则每个更新都需要对辅助节点进行全表扫描,导致它们远远落后。

解决方法是在封顶集合上创建一个_id索引。但是,如果您在主服务器上创建索引,但您的副服务器已经落后,他们将不会足够快地接收索引创建操作。相反,解决问题的最佳方法是首先逐个修正每个滞后的次要问题。对于每一个,关闭它并以独立模式重新启动(在不同的端口上,不带--replSet选项),构建_id索引,然后将其添加回集中。最后,一旦辅助人员解决了问题,您可以降低主要人员,并重复此过程。

更新:在mongoDB 2.0.x和更早的版本中,默认情况下,capped集合没有_id索引。但是,默认行为计划在mongoDB 2.2中更改,以便在2.2+中创建的加盖集合将自动创建_id索引,就像非封顶集合一样。对于2.2之前创建的封顶集合,您仍然需要使用上述步骤手动创建_id索引,但新集合不应该遭受上述问题。

相关问题