1

运行包含上限集合的副本集是否会出现问题?

出于某种原因,我的副本集上的一个辅助节点会定期以 90% 的 CPU 运行几个小时。

gdb几乎每次都显示以下堆栈跟踪:

#0  0x00000000008c3e3a in mongo::ps::Rolling::access(unsigned long, short, bool) ()
#1  0x00000000008c3bd6 in mongo::Record::accessed() ()
#2  0x000000000086eb03 in mongo::CoveredIndexMatcher::matches(mongo::BSONObj const&, mongo::DiskLoc const&, mongo::MatchDetails*, bool) ()
#3  0x000000000086ed78 in mongo::CoveredIndexMatcher::matchesCurrent(mongo::Cursor*, mongo::MatchDetails*) ()
#4  0x00000000009794dc in mongo::UpdateOp::next() ()
#5  0x00000000008c9a96 in mongo::QueryPlanSet::Runner::nextOp(mongo::QueryOp&) ()
#6  0x00000000008d9930 in mongo::QueryPlanSet::Runner::next() ()
#7  0x00000000008d9f86 in mongo::QueryPlanSet::Runner::runUntilFirstCompletes() ()
#8  0x00000000008ddc3e in mongo::QueryPlanSet::runOp(mongo::QueryOp&) ()
#9  0x00000000008df5f5 in mongo::MultiPlanScanner::runOpOnce(mongo::QueryOp&) ()
#10 0x00000000008dfaf0 in mongo::MultiCursor::nextClause() ()
#11 0x00000000008e1bcd in mongo::MultiCursor::MultiCursor(char const*, mongo::BSONObj const&, mongo::BSONObj const&, boost::shared_ptr<mongo::MultiCursor::CursorOp>, bool) ()
#12 0x000000000095f542 in mongo::_updateObjects(bool, char const*, mongo::BSONObj const&, mongo::BSONObj, bool, bool, bool, mongo::OpDebug&, mongo::RemoveSaver*) ()
#13 0x00000000009642d5 in mongo::updateObjects(char const*, mongo::BSONObj const&, mongo::BSONObj, bool, bool, bool, mongo::OpDebug&) ()
#14 0x00000000008339cf in mongo::applyOperation_inlock(mongo::BSONObj const&, bool) ()
#15 0x00000000008232cb in mongo::ReplSetImpl::syncApply(mongo::BSONObj const&) ()
#16 0x0000000000826f65 in mongo::ReplSetImpl::syncTail() ()
#17 0x00000000008283e5 in mongo::ReplSetImpl::_syncThread() ()
#18 0x0000000000828438 in mongo::ReplSetImpl::syncThread() ()
#19 0x00000000008288d0 in mongo::startSyncThread() ()
#20 0x0000000000aabd90 in thread_proxy ()
#21 0x00007effd9cd09ca in start_thread () from /lib/libpthread.so.0
#22 0x00007effd927fcdd in clone () from /lib/libc.so.6

是否需要使用一些额外的魔法才能让有上限的收藏品得以复制?

4

1 回答 1

3

您需要在 _id 上有一个唯一索引才能快速复制(否则它必须对集合上的每个操作进行全表扫描,这就是您在跟踪中看到的内容)。_id 索引不会在上限集合上自动创建。在您的主节点上创建索引,然后您可能想要重新同步您的辅助节点:如果您有非唯一的 _id,它可能会弄乱复制。

确保在 _id 上创建唯一索引。如果您创建一个非唯一索引,则很难从中恢复:mongod 通过不让您删除它并且不让您在 _id 上创建任何其他索引来“保护”该索引。

请参阅http://www.mongodb.org/display/DOCS/Capped+Collections#CappedCollections-UsageandRestrictions上的警告。

于 2012-05-17T14:56:17.817 回答