Рекомендуемая структура документа для CouchDB

Мы в настоящее время рассматриваем изменение от Пост-ГРЭС до CouchDB для приложения мониторинга использования. Некоторые числа:

Приблизительно соединения 2000, опрашиваемые каждые 5 минут, приблизительно для 600 000 новых строк в день. В Пост-ГРЭС мы храним эти данные, разделенные днем:

t_usage {service_id, метка времени, data_in, data_out}
t_usage_20100101 наследовал t_usage.
t_usage_20100102 наследовал t_usage. и т.д.

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

Для чтения данных наши варианты использования, в порядке важности и текущей производительности:
* Единственное обслуживание, единственное дневное использование: хорошая производительность
* Многочисленные услуги, использование месяца: низкая производительность
* Единственное обслуживание, использование месяца: низкая производительность
* Многочисленные услуги, несколько месяцев: очень Низкая производительность
* Многочисленные услуги, единственный день: хорошая производительность

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

Мы часто должны параметризовать запрос к часам также, например, только давая результаты между 8:00 и 18:00, таким образом, сводные таблицы имеют ограниченное применение. (Эти параметры изменяются с достаточной частотой, что составление нескольких сводных таблиц данных препятствует).

С тем фоном первый вопрос: действительно ли CouchDB подходит для этих данных? Если это, дано вышеупомянутые варианты использования, как был бы Вы лучше всего моделировать данные в документах CouchDB? Некоторые опции, которые я соединил до сих пор, который мы находимся в процессе сравнительного тестирования, (_id, _rev исключены):

Один документ для каждого подключения в день

{
  service_id:555
  day:20100101
  usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}

Приблизительно 60 000 новых документов в месяц. Самые новые данные были бы обновлениями существующих документов, а не новых документов.

(Здесь, объекты в использовании включаются на метке времени опроса и значениях байты в и byes).

Один документ для каждого подключения в месяц

{
  service_id:555
  month:201001
  usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}

Приблизительно 2 000 новых документов в месяц. Требуются умеренные обновления существующих документов.

Один документ на строку собранных данных

{
  service_id:555
  timestamp:1265248762
  in:584
  out:11342
}
{
  service_id:555
  timestamp:1265249062
  in:94
  out:1242
}

Приблизительно 15 000 000 новых документов в месяц. Все данные были бы вставкой к новому документу. Быстрее вставляет, но у меня есть вопросы о том, как эффективный это будет после года или 2 лет с сотнями миллионов документов. IO файла казался бы препятствующим (хотя я являюсь первым, чтобы признать, что я не полностью понимаю механику его).

Я пытаюсь приблизиться к этому ориентированным на документ способом, хотя повреждение привычки RDMS является трудным:) Факт можно только минимально параметризовать представления, также имеет меня немного затронутый. Тем не менее, какое из вышеупомянутого было бы самым соответствующим? Есть ли другие форматы, которые я не рассмотрел, который будет работать лучше?

Заранее спасибо,

Jamie.

7
задан majelbstoat 4 February 2010 в 03:14
поделиться

1 ответ

Я не думаю, что это ужасная идея.

Давайте рассмотрим ваш сценарий "подключение/месяц".

Учитывая, что длина записи ~40 (это щедро) символов, и вы получаете ~8,200 записей в месяц, ваш конечный размер документа будет ~350K в конце месяца.

Это означает, что, работая в полную силу, вы будете читать и записывать 2000 350K документов каждые 5 минут.

С точки зрения ввода-вывода, это менее 6 МБ/с, учитывая чтение и запись, в среднем за 5 м времени. Это вполне приемлемо даже для современных аппаратных средств низкого класса.

Однако есть и другая проблема. Когда вы сохраняете документ, Couch собирается оценить его содержимое, чтобы построить представление, поэтому Couch будет разбирать 350K документов. Я боюсь, что (по последней проверке, но прошло уже некоторое время) я не верю, что Couch хорошо масштабируется по ядрам CPU, так что это может легко привести к тому, что Couch будет использовать одно ядро CPU. Я бы хотел надеяться, что Couch сможет читать, разбирать и обрабатывать данные со скоростью 2 МБ/с, но я, честно говоря, не знаю. При всех своих преимуществах, erlang - не самый лучший язык для работы с компьютером.

Последняя проблема - это поддержка базы данных. Это будет запись 700 МБ каждые 5 минут в конце месяца. С архитектурой Couchs (только добавление), вы будете записывать 700 МБ данных каждые 5 минут, что составляет 8,1 ГБ в час, и 201 ГБ через 24 часа.

После сжатия DB он уменьшится до 700 МБ (для одного месяца), но во время этого процесса файл будет становиться большим, и довольно быстро.

С точки зрения ретривера, эти большие документы меня не пугают. Загрузка документа JSON размером 350K, да, он большой, но он не настолько большой, не на современном оборудовании. На досках объявлений есть аватары и побольше. Так что все, что вы хотите сделать относительно активности соединения за месяц, будет довольно быстро, я думаю. Что касается всех подключений, очевидно, что чем больше вы захватываете, тем дороже это будет стоить (700MB для всех 2000 подключений). 700 МБ - это реальное число, которое имеет реальное влияние. Плюс ваш процесс должен быть агрессивным в отбрасывании данных, которые вас не интересуют, чтобы он мог отбросить мякину (если вы не хотите загрузить 700 МБ кучи в вашем процессе отчета).

Учитывая эти цифры, Connection/Day может быть лучшим вариантом, поскольку вы можете лучше контролировать детализацию. Однако, честно говоря, я бы выбрал самый крупный документ, который вы можете, потому что я думаю, что это даст вам лучшую ценность от базы данных, только потому, что сегодня все поиски головки и вращение пластины - это то, что убивает большую часть производительности ввода-вывода, многие данные дискового потока очень хороши. Большие документы (при условии хорошо расположенных данных, поскольку Couch постоянно уплотняется, это не должно быть проблемой) передают больше, чем ищут. Поиск в памяти "бесплатен" по сравнению с диском.

Конечно, проводите свои собственные тесты на нашем оборудовании, но примите все эти соображения к сведению.

EDIT:

После дополнительных экспериментов...

Пара интересных наблюдений.

При импорте больших документов CPU не менее важен, чем скорость ввода/вывода. Это связано с количеством маршалинга и потреблением CPU при преобразовании JSON во внутреннюю модель для использования представлениями. При использовании больших (350k) документов, мои CPU были практически максимально загружены (350%). Напротив, при использовании документов меньшего размера они работали на 200%, хотя в целом это была одна и та же информация, просто разбитая на куски по-разному.

Для ввода/вывода, при работе с 350-килобайтными документами я показывал скорость 11 МБ/с, а при работе с документами меньшего размера - только 8 МБ/с.

Оказалось, что уплотнение почти не связано с вводом-выводом. Мне трудно получить точные цифры о моем потенциале ввода-вывода. Копия кэшированного файла работает со скоростью 40+МБ/сек. Уплотнение работает со скоростью около 8 МБ/с. Но это соответствует необработанной нагрузке (если предположить, что couch перемещает материал сообщение за сообщением). CPU ниже, так как он выполняет меньше обработки (он не интерпретирует полезную нагрузку JSON и не перестраивает представления), плюс это был один CPU, выполняющий работу.

Наконец, для чтения я попробовал выгрузить всю базу данных. Для этого был задействован один процессор, а мой ввод/вывод был довольно низким. Я убедился, что файл CouchDB не был кэширован, у моей машины много памяти, поэтому многие вещи кэшируются. Необработанный дамп через _all_docs был всего около 1 МБ/с. Это почти все задержки поиска и вращения, чем что-либо еще. Когда я делал это с большими документами, скорость ввода/вывода достигала 3 МБ/с, что просто показывает влияние потоковой передачи, о котором я говорил, как о преимуществе для больших документов.

И следует отметить, что на сайте Couch есть методы повышения производительности, которым я не следовал. В частности, я использовал случайные идентификаторы. Наконец, это не было сделано для оценки производительности Couch, а скорее для определения того, где нагрузка оказывается в конечном итоге. Разница между большим и маленьким документом показалась мне интересной.

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

10
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: