Я смущен ситуацией и попытаюсь исправить это уже пару дней. Я запускаю 3 осколка поверх трех наборов реплик из трех членов (rs0, rs1 и rs2). Все работает до сих пор. Данные распределяются по трем осколкам, а также клонируются в наборах реплик.MongoDB осколок кластера 25 медленнее, чем автономный узел
НО: импорт данных в один из наборов реплик отлично работает с постоянно 40k docs/s, но при включении sharding замедляет весь процесс вплоть до 1,5k docs/s.
Я заселена данные различными методами:
- генерируются случайные данные в Монго оболочки (работает в моей mongos)
- JSON импорт данных через mongoimport
- MongoDB дамп восстановления от другого сервер через mongorestore
Все они приводят к разочарованию всего 1.5k doc/s. Mongod - это физические Xeon-боксы по 32 ГБ каждый, 3-х конфигурационные серверы - это виртуальные серверы (40-Гбайт HDD, 2 ГБ ОЗУ, если это имеет значение), монго работает на моем сервере приложений. Кстати, значение 1.5k inserts/s не зависит от ключа осколка, такого же поведения для выделенного ключа осколка (одно полевого ключа, а также составного ключа), а также хэшированного ключа осколка в поле _id.
Я пробовал много, даже переустановил весь кластер дважды. Возникает вопрос: каково узкое место в этой настройке:
- серверы конфигурации, работающие на виртуальном сервере? -> не должно быть проблематичным из-за низкого потребления ресурсов конфигурационными серверами
- mongos? -> запуск нескольких Mongos на выделенном ящике за HAproxy может быть альтернативой, еще не проверял, что еще нет
Попробуйте остановить балансировщик в течение всего этого массового обновления и посмотреть, не ускорит ли он это. Кроме того, если это возможно, и данные позволяют это, попробуйте использовать метод целевого осколка, например «Tag Aware Sharding» –
Когда вы загружаете данные на один сервер, вы, вероятно, используете большие партии, которые амортизируют стоимость блокировки, сетевые накладные расходы и т. д. Когда вы загружаете монго, монго нужно разбить свои партии на более мелкие партии, которые идут на каждый осколок. То, как это делается, неэффективно (https://github.com/Tokutek/mongo/issues/912 объясняет больше). Кстати, если это ваша проблема, убедитесь, что каждая партия документов из вашего приложения имеет один и тот же ключ осколка. – leif
ОК, что сбивает с толку: коллекции, которые не зарегистрированы sh.shardCollection(), которые должны быть оштукатурены, сохраняются по умолчанию в основном осколке. Таким образом, нет маршрутизации, балансировки нагрузки и т. Д.требуется для них. Поэтому я создал фиктивную коллекцию, не делил ее, чтобы ее делили и заполняли ее в оболочке mongo mongo. Результат: такие же медленные вставки данных, как в общих коллекциях. Тем не менее 1/25 скорости при импорте одних и тех же данных в один из наборов реплик. – ctp