时间:2021-07-01 10:21:17 帮助过:25人阅读
其中_numStonesToKeep
为oplog应该保持的Stone个数,而_minBytesPerStone
代表每个Stone的最小字节数。
接下来,会根据oplog当前的大小以及_minBytesPerStone
来估算下,当前的oplog大致包含的Stone数量,并通过采样的方式来获取每个Stone的起始位置(不能保证每个Stone的大小跟预期完全一样),然后将所有的Stone按顺序存储到一个队列中。
mongod在服务写请求的过程中,每次都会记录下新产生oplog的大小,当新产生的oplog的总量超过_minBytesPerStones
时,就会产生一个新的Stone加入到队列中。
void WiredTigerRecordStore::OplogStones::createNewStoneIfNeeded(RecordId lastRecord) {
if (_currentBytes.load() < _minBytesPerStone) {
// Must have raced to create a new stone, someone else already triggered it.
return;
}
// ...
OplogStones::Stone stone = {_currentRecords.swap(0), _currentBytes.swap(0), lastRecord};
_stones.push_back(stone);
_pokeReclaimThreadIfNeeded(); // 唤醒后台回收oplog空间的线程
}
当队列中的Stone数量超过_numStonesToKeep
,后台线程就会删除最老的Stone里的数据,来回收oplog的存储空间。
转载自:https://yq.aliyun.com/articles/50138
MongoDB-3.2 oplog删除策略优化
标签:keep 插入 tle 采样 默认 唤醒 std yun word