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

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

Параметры для драйвера 2.4 включают: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionsPerHost
  • ConnectTimeout
  • maxWaitTime
  • socketTimeout
  • threadsAllowedToBlockForConnectionMultiplier

У более новых драйверов больше опций, и мне было бы интересно узнать об этом.

Ответ 1

Обновлено до 2.9:

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

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

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

    db.serverStatus().connections.available

    В настоящее время у нас это на 40.

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

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

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

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

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

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

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

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

    В случае наборов реплик вы можете использовать более высокие значения для w, которые сообщают MongoDB, чтобы отправить запись, по крайней мере, "w" членам набора реплик перед возвратом (или, точнее, дождитесь, когда репликация вашей записи будет "w" ). Вы также можете установить w в строку "большинство", которая сообщает MongoDB выполнить запись большинству членов набора реплик (WriteConcern.MAJORITY). Typicall вы должны установить это значение 1, если вам не нужна сырая производительность (-1 или 0) или реплицированная запись ( > 1). Значения, превышающие 1, оказывают значительное влияние на пропускную способность записи.

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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