Как настроить MongoDB Java драйвер MongoOptions для производственного использования?


Я искал в интернете лучшие практики для настройки MongoOptions для драйвера Java MongoDB, и я не придумал ничего, кроме API. Этот поиск начался после того, как я столкнулся с "com.в MongoDB.DBPortPool$SemaphoresOut: из семафоров, чтобы получить БД ошибка соединения " и путем увеличения соединения / множителя я смог решить эту проблему. Я ищу ссылки или ваши рекомендации по настройке этих параметров для производства.

в опции для драйвера 2.4 включают в себя: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionsPerHost
  • connectTimeout
  • maxWaitTime
  • socketTimeout
  • threadsAllowedToBlockForConnectionmultiplier

новые драйверы имеют больше возможностей, и мне было бы интересно услышать о них.

2 94

2 ответа:

обновлена до 2,9 :

  • autoConnectRetry просто означает, что драйвер автоматически попытается подключиться к серверу(ам) после неожиданного отключения. В производственных средах вы обычно хотите, чтобы это значение было true.

  • connectionsPerHost - это количество физических соединений, которые один экземпляр Mongo (это синглтон, поэтому у вас обычно есть один на приложение) может установить для процесса mongod/mongos. На момент написания драйвер java установит это количество соединений в конечном итоге, даже если фактическая пропускная способность запроса низкая (в словах заказа вы увидите статистику "conn" в mongostat, пока она не достигнет этого числа на сервер приложений).

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

    db.serverStatus().connections.available

    в производстве мы в настоящее время имеем это на 40.

  • connectTimeout. Поскольку имя предполагает количество миллисекунд, драйвер будет ждать, прежде чем попытка подключения будет прервана. Установите тайм-аут на что-то длинное (15-30 секунд), если нет реалистичного, ожидаемого шанса, что это будет мешать другим успешным попыткам подключения. Обычно, если попытка подключения занимает больше времени, чем пара секунд ваша сетевая инфраструктура не способна к высокой пропускной способности.

  • maxWaitTime. Количество МС поток будет ждать подключения, чтобы стать доступным в пуле соединений, и вызывает исключение, если это не произойдет вовремя. Сохранить значение по умолчанию.

  • socketTimeout. Стандартное значение таймаута сокета. Установлен на 60 секунд (60000).

  • threadsAllowedToBlockForConnectionmultiplier. Множитель для connectionsPerHost, который обозначает количество потоков, которым разрешено ожидать соединения, чтобы стать доступными, если пул в настоящее время исчерпан. Это параметр, который вызовет " com.в MongoDB.DBPortPool$SemaphoresOut: из семафоров, чтобы получить соединение с БД" исключение. Он выдаст это исключение, как только эта очередь потока превысит threadsAllowedToBlockForConnectionmultiplier значение. Например, если connectionsPerHost равен 10, а это значение равно 5, до 50 потоков могут блокироваться до появления вышеупомянутого исключения.

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

  • readPreference. (обновлены, 2.8+) используется для определения предпочтения чтения по умолчанию и заменяет "slaveOk". Настройка ReadPreference через один из методов фабрики класса. полное описание наиболее общих параметров можно найти в конце этого поста

  • w. (обновлены, 2.6+) это значение определяет "безопасность" писать. Если это значение равно -1, запись не будет сообщать о каких-либо ошибках, Независимо от ошибок сети или базы данных. WriteConcern.Ни один из них не является подходящим предопределенным WriteConcern для этого. Если w равно 0, то сетевые ошибки сделают ошибку записи, но ошибки mongo не будут. Это обычно называется" Огонь и забыть " пишет и должен использоваться, когда производительность является более важным, чем последовательность и долговечность. Использовать WriteConcern.Нормально для этого режима.

    Если вы установите w в 1 или выше, запись будет считается безопасным. Безопасная запись выполните запись и выполните ее по запросу на сервер, чтобы убедиться, что запись выполнена успешно или получить значение ошибки, если это не так (Другими словами, он отправляет команду getLastError() после записи). Обратите внимание, что пока эта команда getLastError() не будет завершена, соединение зарезервировано. В результате этого и дополнительной команды пропускная способность будет значительно ниже, чем при записи с w

    в случае наборов реплик вы можете использовать более высокие значения для w whcih сказать MongoDB, чтобы отправить запись по крайней мере "w" членов набора реплик перед возвратом (или, точнее, ждать репликации вашей записи в "w" членов). Вы также можете установить w в строку "большинство", которая говорит MongoDB выполнять запись в большинство членов набора реплик (WriteConcern.БОЛЬШИНСТВО.) Как правило, вы должны установить это значение равно 1, Если вам не нужна необработанная производительность (-1 или 0) или реплицированные записи (>1). Значения, превышающие 1, оказывают значительное влияние на пропускную способность записи.

  • fsync. Параметр долговечности, который заставляет mongo сбрасывать на диск после каждой записи, когда он включен. У меня никогда не было проблем с долговечностью, связанных с отставанием записи, поэтому у нас есть это на false (по умолчанию) в производстве.

  • j*(новый 2.7+)*. Логический это при значении true заставляет MongoDB ждать успешной фиксации группы ведения журнала перед возвращением. Если вы включили ведение журнала, вы можете включить это для дополнительной долговечности. См.http://www.mongodb.org/display/DOCS/Journaling чтобы увидеть, что журнал получает вас (и, следовательно, почему вы можете включить этот флаг).

ReadPreference Класс ReadPreference позволяет настроить на то, что команду mongod экземпляров запросы маршрутизируются если вы работаете с наборами реплик. Доступны следующие опции :

  • ReadPreference.первичный(): все чтения идут только к основному члену repset. Используйте это, если требуется, чтобы все запросы возвращали непротиворечивые (самые последние записанные) данные. Это значение по умолчанию.

  • ReadPreference.primaryPreferred (): все чтения переходят к первичному члену repset, если это возможно, но могут запрашивать вторичные члены, если первичный узел недоступен. Таким образом, если первичный становится недоступным, чтения становятся в конечном итоге согласованными, но только если первичный недоступен.

  • ReadPreference.вторичный (): все операции чтения переходят к вторичным элементам repset, а первичный элемент используется только для записи. Используйте это только в том случае, если вы можете жить с в конечном итоге последовательным чтением. Дополнительные члены repset можно использовать для увеличения производительности чтения, хотя есть ограничения на количество (голосующих) членов repset может иметь.

  • ReadPreference.secondaryPreferred(): все чтения переходят к вторичным членам repset, если любой из них доступен. Первичный элемент используется исключительно для записи, если все вторичные элементы не становятся недоступными. Помимо резервного копирования к основному члену для чтения это то же самое, что и ReadPreference.вторичный.)(

  • ReadPreference.ближайший(): чтение перейти к ближайшему члену repset доступно для клиента базы данных. Используйте только в том случае, если в конечном итоге допустимы последовательные чтения. Ближайший элемент-это элемент с наименьшей задержкой между клиентом и различными членами repset. Поскольку занятые члены в конечном итоге будут иметь более высокие задержки это должны также автоматически балансирует нагрузку на чтение, хотя по моему опыту вторичный (предпочтительный), кажется, делает это лучше, если задержки членов относительно последовательны.

Примечание : все вышеперечисленное есть тег включен версии того же метода, которые возвращают экземпляры TaggableReadPreference вместо этого. Полное описание тегов набора реплик можно найти здесь:Набор Тегов Реплики

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

вот несколько важных параметров для MongoClient, которые вы хотите установить при подключении к серверу MongoDB в производстве.

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

Тайм-Аут Соединения :тайм-аут соединения - это количество миллисекунд, которое драйвер будет ждать, прежде чем новая попытка соединения будет прервана.Значение тайм-аута соединения по умолчанию зависит от версии и языка драйвера. Последние версии драйверов Mongo Java & Ruby имеют тайм-аут по умолчанию 10s для установления соединения, в то время как драйвер NodeJs не имеет тайм-аута.Если время ожидания слишком велико, вы рискуете остановить приложение. Если тайм-аут слишком низкий, вы можете сдаться слишком быстро. Лучше протестировать с разными значениями, чтобы найти правильный тайм-аут для вашего приложения.

SocketTimeout:тайм-аут сокета-это количество миллисекунд, которое может занять отправка или получение сокета до истечения времени ожидания.Драйвер Mongo Java & Nodejs имеет тайм-аут сокета по умолчанию 0s, что означает в основном отсутствие тайм-аута. В то время как Рубин предлагает 5s сокет тайм-аут. Вы не хотите ограничивать этот тайм-аут, так как различные операции будут принимать переменную время работы.

понимание параметров таймаута клиента MongoDB есть подробное описание, чтобы иметь более глубокое понимание этих вариантов.