2013-07-11 2 views
1

Я использую MongoDB с примерно 4 миллионами документов и размером базы 5-6 ГБ. Аппарат имеет 10 ГБ оперативной памяти, и бесплатно доступны только около 3,7 ГБ. База данных используется для веб-сайта, ориентированного на видеоигры (рейтинг), разделенного по региону.MongoDB High Avg. Flush Time - Write Heavy

Это довольно тяжелая операция записи, но по-прежнему получает значительное количество сообщений. Мы используем программу обновления, которая запрашивает внешний источник каждый час или два. Затем этот модуль обновления обрабатывает документы и обновляет документы в базе данных. Обновитель обрабатывает только один регион за раз (см. Предыдущий параграф), поэтому обновляется примерно 33% базы данных.

Когда программа обновления работает и в течение всего времени ее запуска, среднее время промывки увеличивается примерно до 35-40 секунд, и мы наблюдаем общее замедление с другими запросами. Обновитель является RAN на SEPARATE MACHINE и только запрашивает MongoDB в конце, когда все данные были получены и обработаны от третьего лица.

Некоторые люди предложили замедлить количество обновлений или только обновить игроков, которые изменились, но проблема сводится к ранжированию. Поскольку мы поддерживаем связи между игроками, нам нужно предварительно вычислить ряды - так что, если только несколько пользователей действительно изменили ряды, нам все равно необходимо обновить остальные ранжирования пользователей соответственно. По крайней мере, так было с MySQL - я не уверен, есть ли хорошее решение с MongoDB для ранжирования ~ 800K-> 1,2 миллиона документов при поддержке связей.

Мой вопрос: как мы можем улучшить флеш и замедление, которые мы испытываем? Почему это так высоко? Отключить ведение журнала (чтобы взять некоторую нагрузку с помощью ввода-вывода), поскольку потеря данных не является чем-то, что меня беспокоит, поскольку база данных часто обновляется независимо?

Статус сервера: http://pastebin.com/w1ETfPWs

+0

http://docs.mongodb.org/manual/reference/command/serverStatus/ – Hariharan

+0

Я добавил ссылку на статус сервера. –

+0

Отключение журнала поможет в некоторой степени, когда сервер очень занят. Но это будет не очень эффективно. MongoDB по умолчанию очищает все грязные страницы каждые 60 секунд и когда обновляется 33% данных, что означает, что все страницы (~ ГБ страниц) загрязнены, поэтому я не думаю, что 35-40 секунд - очень большое число. На мой взгляд, логику проектирования нужно учитывать, так как вышеуказанный метод не будет масштабироваться. –

ответ

1

Не видя никакой статистики диска, я придерживаюсь мнения, что вы насыщающего дисков.

Это может быть проверено с помощью iostat -xmt 2 и проверкой колонки %util.

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

Разделение коллекций не будет иметь эффекта. Разделение баз данных может, но если вы связаны с IO, это не поможет вам.

Опции

Если я правильно, и ваши диски насыщенными, добавляя больше дисков в конфигурации RAID 10 будет значительно способствовать производительность и долговечность - более, если вы отделить журнал от к SSD.

Предполагая, что этот аппарат является единственным сервером, вы можете настроить репликас и отправить свои прочитанные запросы там. Это должно помочь вам честно, но не так сильно, как диски.

+0

Скажем, RAID 10 сейчас недоступен. Могу ли я увидеть значительное увеличение производительности при перемещении базы данных и журнала на SSD? В настоящее время мы раскачиваем гибридные приводы, но похоже, что идея кэширования с ними будет работать лучше, если мы не будем случайно получать доступ к какой-либо части нашего набора данных довольно часто. –

5

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

Используйте что-то вроде Redis, у Redis есть что-то, называемое «Сортированный список», предназначенный только для этой работы, с ним вы можете иметь 100 миллионов записей и по-прежнему получать 5000000-ое до 5001000-го со скоростью до миллисекунды.

С официального сайта (Redis - Sorted sets):

Сортировка устанавливает

С отсортированных наборов вы можете добавлять, удалять или элементы обновления в очень быстрый способ (за время, пропорциональное к логарифму числа элементов). Поскольку элементы принимаются по порядку и не упорядочены впоследствии, вы также можете получить диапазоны по количеству баллов или по рангу (позиции) очень быстро. Доступ к середине отсортированного набора также очень быстрый, поэтому вы можете использовать Sorted Sets в качестве интеллектуального списка не повторяющихся элементов, где вы можете быстро получить доступ ко всему, что вам нужно: элементы в порядке, быстрый тест существования, быстрый доступ к элементам в середина!

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

сортированных наборы вы можете:

Возьми лидер доску в масштабных онлайн-играх, где каждый раз, когда новый счет представляется обновить его с помощью Zadd. Вы можете легко взять верхних пользователей с помощью ZRANGE, вы также можете, учитывая имя пользователя, вернуть свой рейтинг в листинг, используя ZRANK. Используя ZRANK и ZRANGE вместе, вы можете показывать пользователям со счетом, подобным данному пользователю. Все очень быстро.

Сортированные наборы часто используются для индексации данных, хранящихся внутри Redis. Например, если у вас много хешей, представляющих пользователей, вы можете использовать отсортированный набор с элементами, имеющими возраст пользователя, в качестве оценки и идентификатором пользователя в качестве значения. Таким образом, используя ZRANGEBYSCORE, будет тривиально и быстро получить всех пользователей с заданным интервалом времени.

Сортированные наборы, вероятно, являются самыми передовыми типами данных Redis, поэтому потребуется некоторое время, чтобы проверить полный список команд Sorted Set, чтобы узнать, что вы можете сделать с Redis!

+0

Так жаль, только что обнаружил, что я случайно проголосовал за этот ответ.По какой-то причине так меня перестает отменять, если ответ не отредактирован. Можете ли вы сделать какое-то случайное редактирование, и я удалю свой случайный голос? – Frans

Смежные вопросы