Я пытаюсь создать систему, которая хранит данные, связанные с временем, для большого количества уникальных устройств (> 200 000) каждые 10 секунд или около того. Основная структура документа выглядит следующим образом:Mongo update large documents
{
_id: ObjectID('$some_mongo_id'),
start: $start_epoch,
end: $end_epoch
identifier: $some_string,
values: {
'cpu': [
[1, 2, 3, 4, ...],
[1, 2, 3, 4, ...]
]
}
}
Несколько деталей, вероятно, не очень хорошо объяснены выше:
Мы предварительное выделение полноты каждого массива значений с нулевыми значениями в обойти любые проблемы с добавлением/перемещением. Я считаю, что это подтверждается, потому что dds stats paddingFactor всегда что-то вроде 1.000000000029.
Массив значений является многомерным, основанным на чтении и наблюдении, что массив больше похож на связанный список внутри mongo, поэтому это уменьшает количество прогулок, которые необходимо выполнить для данного обновления. Структура довольно произвольная, но для простоты воображения это в основном индекс 1 - час, индекс 2 - квартал, индекс 3 - минута.
Мы обновляем документы каждые 10 секунд и с помощью позиционных запросов обновления помещаем новое значение в нужное место в массиве. Что-то вроде «$ set: {'values.cpu.2.7': 1234}". Каждое обновление запрашивает только один документ на основе его уникального идентификатора + время начала/окончания (индексируется и проверяется на основе объяснения).
Мы видим значительно отличающуюся производительность в зависимости от того, насколько велик документ. Если документ охватывает один день, наша пропускная способность равна X и ограничена дисковым IO. Если длина документа составляет около часа, наша пропускная способность составляет около 8X и ограничена процессором (блокировка коллекции, наблюдаемая mongostat). Все остальные переменные остаются неизменными в этих тестах.
Я нашел this thread, который находится около 2 лет назад и, похоже, соответствует тому, что мы видим, но я не смог найти что-нибудь более недавнее, и у меня закончилось google fu. затем
Мой вопрос:
Когда Монго обновляет документ, это делает грязные все страницы, пролеты документа и, следовательно, требуют ОС, чтобы смыть все эти противы только страниц, что изменение произошло на? Кажется, так, но я не могу подтвердить официально.
Есть ли лучший способ структурировать/сделать это, чтобы выше не сжигать нас? Использование 1-часовых документов возможно, но это около 24x индексное пространство дневных документов, которое в этом случае довольно велико.
Заранее благодарим за любую помощь.
Технические биты:
сервер MongoDB 2.4.7 RHEL6 x86_64 питон 2.6.6 PyMongo 2.5.2-3
Попытайтесь взглянуть на http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb – Martin
Отлично читайте Martin – Jinxcat
Martin - Спасибо за эту ссылку, отлично читать. Как ни странно, мы фактически делаем почти то же самое! Кроме того, мы пытаемся использовать более крупные документы, чтобы уменьшить размер индекса. Я добавлю комментарий, спрашивая об этом. – Shazz