общие вопросы по использованию mongodb - PullRequest
3 голосов
/ 29 сентября 2010

Я думаю о том, чтобы попытаться использовать MongoDB для хранения нашей статистики, но у меня есть несколько общих вопросов о том, правильно ли я понимаю, прежде чем я действительно начну изучать это.

Я понимаю концепцию использования документов, но мне не очень понятно, сколько данных может храниться внутри каждого документа. Следующая диаграмма объясняет макет, о котором я думаю:

Website (document)
 - some keys/values about the particular document
 - statistics (tree)
   - millions of rows where each record is inserted from a pageview (key/value array containing data such as timestamp, ip, browser, etc)

Что меня поразило в mongodb, так это функции группировки, такие как: http://www.mongodb.org/display/DOCS/Aggregation

db.test.group(
{ cond: {"invoked_at.d": {$gte: "2009-11", $lt: "2009-12"}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time = out.total_time / out.count }
} );

Но моя главная проблема в том, насколько трудной будет, например, эта команда на сервере, если, скажем, десятки миллионов записей в десятках документов на оперативном сервере 512-1 Гбайт на стойке, например? Будет ли он работать при низкой нагрузке?

Есть ли ограничения на количество документов, которые может иметь MongoDB (отдельные базы данных)? Кроме того, есть ли ограничение на количество записей в дереве, которое я объяснил выше? Кроме того, этот запрос, который я показывал выше, выполняется мгновенно или это какой-то запрос типа карты / уменьшения? Не уверен, смогу ли я выполнить это при загрузке страницы в нашей панели управления, чтобы мгновенно получить эту статистику.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 29 сентября 2010

Каждый документ имеет ограничение размера 4 МБ (что в тексте много).

Рекомендуется запускать MongoDB в режиме репликации или использовать шардинг, так как в противном случае у вас возникнут проблемы с долговечностью одного сервера. Долговечность для одного сервера не предоставляется, поскольку MongoDB только fsync записывает на диск каждые 60 секунд, поэтому, если ваш сервер выйдет из строя между двумя fsync, данные, которые были вставлены / обновлены за это время, будут потеряны.

Нет ограничений на количество документов, кроме вашего дискового пространства в mongodb.

Вы должны попытаться импортировать набор данных, который соответствует вашим данным (или сгенерировать некоторые тестовые данные), в MongoDB и проанализировать, как быстро выполняется ваш запрос. Не забудьте установить индексы для тех полей, которые вы интенсивно используете в своих запросах. Ваш запрос выше должен работать очень хорошо, даже с большим количеством данных.

Чтобы проанализировать скорость вашего запроса, используйте профилировщик базы данных , с которым поставляется MongoDB. На оболочке монго делаем:

db.setProfilingLevel(2); // to set the profiling level
[your query]
db.system.profile.find(); // to see the results

Не забудьте отключить профилирование, как только вы закончите (в противном случае журнал будет довольно большим).

Что касается структуры вашей базы данных, я предлагаю изменить "схему" (да, да, схема меньше ..) на:

веб-сайт (коллекция): - некоторые ключи / значения о конкретном документе

статистика (сборник) - миллионы строк, в которые каждая запись вставляется из просмотра страницы (массив ключ / значение, содержащий такие данные, как метка времени, ip, браузер и т. д.) + DBRef на сайт

См. Ссылки на базу данных

3 голосов
/ 29 сентября 2010

Документы в MongoDB ограничены размером 4 МБ.Допустим, один просмотр страницы приводит к сохранению 32 байтов.Тогда вы сможете хранить около 130 000 просмотров страниц в одном документе.

По сути, количество просмотров страниц, которые может генерировать страница, бесконечно, и вы указали, что ожидаете миллионы из них, поэтому я предлагаю вам сохранить записи журнала как отдельные документы .Каждая запись в журнале должна содержать _id родительского документа.

Количество документов в базе данных ограничено 2 ГБ общего пространства в 32-разрядных системах .64-битные системы не имеют этого ограничения.

Функция group() является скрытым запросом.В документации рекомендуется использовать запрос на уменьшение карты вместо group(), поскольку он имеет некоторые ограничения для больших наборов данных и изолированных сред.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...