#mongodb
#mongodb
Вопрос:
У нас есть кластер из 2 наборов реплик, по 3 сервера в наборе. При разделении одной коллекции. У нас также есть еще довольно много (более 8) коллекций, которые мы используем ежедневно. Большая часть данных находится в разделенной коллекции, в которой содержится около 100 миллионов записей.
Недавно мы добавили требование получать в 100 раз больше данных, которые мы получали ранее, и нам нужно записать это в mongodb. Установлен демон для выполнения операций записи, необходимых для поддержания базы данных в актуальном состоянии. Скрипт выполняет более 200 операций записи в секунду, причем большинство операций выполняется во всех отдельных коллекциях.
При таком количестве операций записи мы не смогли выполнять большие операции чтения в аналитических целях. Получение комбинации тайм-аутов курсора на стороне клиента и на стороне сервера («Курсор не найден»).
Мы пытались использовать схемы ограничения / пропуска при чтении, но проблема сохраняется. Каков наилучший способ исправить это, поскольку нам требуется как большое количество операций записи, так и несколько, но больших операций чтения?
Ответ №1:
Обычно в подобном случае вы хотите начать просмотр запросов, вызывающих время. Затем вы хотите взглянуть на аппаратное обеспечение, чтобы увидеть, что находится под напряжением.
- Правильно ли проиндексированы эти запросы?
- Насколько велики индексы? Помещаются ли они в оперативную память?
- Можете ли вы предоставить некоторые подробности о том, где находятся узкие места?
- Вы заблокированы в режиме ввода-вывода?
- Работают ли ваши процессоры на полной скорости?
Кроме того, есть ли что-нибудь необычное в журналах?
В принципе, нам нужно убедиться, что у вас: 1. Правильно построенная система для обработки запроса 2. Правильно подготовленная система для обработки объемов данных
Комментарии:
1. 1. Мы запрашиваем наши операции чтения только с полем _id. 2. Наши индексы лишь немного превышают объем памяти, у наших экземпляров EC2 — 7,5 ГБ, а наши индексы на replSet — 9,5 ГБ. В настоящее время мы находимся в процессе обновления до 32 ГБ masters. 3. Я не вижу никаких узких мест, просто проблемы с полным чтением данных. 4. Обычно у нас заблокирована запись в коллекции, которая выполняет больше всего операций записи, но в остальном все в порядке. 5. Наши процессоры на самом деле не испытывают слишком большой нагрузки.
2. Как выглядят iostat и mongostat? Вы работаете на дисках EBS? ПОДВЕРГСЯ РЕЙДУ? Какова их производительность?
3. mongostat показывает заблокированный процент, плавающий около 90%, с обновлениями, доминирующими на графиках. В настоящее время мы запускаем ephemeral на основных устройствах и EBS на вторичных. iostat показывает количество операций чтения / с на уровне 622 и 365 для операций записи / с, количество операций чтения, вероятно, велико, потому что в настоящее время мы восстанавливаем 2 сервера по 32 ГБ.
4. обычно я делаю
iostat -dxk 1
. Здесь есть%util
столбец. Если это значение велико, то вы облагаете налогом операции ввода-вывода на диске (дисках).5. Стандартные решения для максимального ввода-вывода: RAID, больше оперативной памяти и сегментирование. Вы захотите начать с RAID и RAM, прежде чем переходить к сегментированию. Также рассмотрите возможность использования
slaveOkay
для ваших операций чтения.