如何配置MongoDB Java驱动程序Mongoopions以供生产使用?

如何配置MongoDB Java驱动程序Mongoopions以供生产使用?,mongodb,production-environment,database-performance,database-tuning,Mongodb,Production Environment,Database Performance,Database Tuning,我一直在网上搜索为MongoDB Java驱动程序配置Mongoptions的最佳实践,除了API之外,我还没有找到其他什么。这个搜索是在我遇到“com.mongodb.DBPortPool$SemaphoresOut:Out of semaphores to get db”之后开始的 “连接”错误,通过增加连接/乘数,我能够解决这个问题。我正在寻找链接或您在为生产配置这些选项时的最佳做法 2.4驱动程序的选项包括: 自动连接法 连接每主机 连接超时 maxWaitTime socketTi

我一直在网上搜索为MongoDB Java驱动程序配置Mongoptions的最佳实践,除了API之外,我还没有找到其他什么。这个搜索是在我遇到“com.mongodb.DBPortPool$SemaphoresOut:Out of semaphores to get db”之后开始的 “连接”错误,通过增加连接/乘数,我能够解决这个问题。我正在寻找链接或您在为生产配置这些选项时的最佳做法

2.4驱动程序的选项包括:

  • 自动连接法
  • 连接每主机
  • 连接超时
  • maxWaitTime
  • socketTimeout
  • 用于连接倍增管的螺纹锁片
较新的驱动程序有更多的选项,我也有兴趣了解这些选项。

更新到2.9:

  • 自动连接仅表示在意外断开连接后,驱动程序将自动尝试重新连接到服务器。在生产环境中,您通常希望此设置为true

  • connectionsPerHost是单个Mongo实例(它是单实例,所以通常每个应用程序都有一个)可以建立到mongod/mongos进程的物理连接量。在编写本文时,java驱动程序最终将建立这一数量的连接,即使实际的查询吞吐量很低(在mongostat中,您将看到“conn”统计数字上升,直到每个应用服务器达到这个数字)

    在大多数情况下,没有必要将其设置为高于100,但此设置是“测试并查看”的设置之一。请注意,您必须确保将该值设置得足够低,以便与服务器的连接总数不会超过

    db.serverStatus().connections.available

    在生产中,我们目前有40个

  • 连接超时。正如名称所示,在连接尝试中止之前,驱动程序将等待的毫秒数。将超时设置为较长的时间(15-30秒),除非有实际的、预期的机会,否则这将妨碍成功的连接尝试。通常,如果连接尝试花费的时间超过几秒钟,您的网络基础设施将无法实现高吞吐量

  • maxWaitTime。线程将等待连接池上的连接可用的毫秒数,如果未及时发生,将引发异常。保持默认

  • socketTimeout。标准套接字超时值。设置为60秒(60000)

  • 用于连接多路复用器的螺纹锁紧装置。connectionsPerHost的乘数,表示允许在池当前耗尽时等待连接可用的线程数。这是导致“com.mongodb.DBPortPool$SemaphoresOut:Out of semaphores to get db connection”异常的设置。一旦此线程队列超过threadsAllowedToBlockForConnectionMultiplier值,它将引发此异常。例如,如果connectionsPerHost为10且该值为5,则在引发上述异常之前最多可以阻止50个线程

    如果您预计吞吐量会出现较大的峰值,这可能会导致大型队列暂时增加此值。正是因为这个原因,我们现在定在1500点。如果您的查询负载始终超过服务器,那么您应该相应地改进硬件/扩展情况

  • readPreference(更新,2.8+)用于确定默认的读取首选项并替换“slaveOk”。通过类工厂方法之一设置ReadPreference最常见设置的完整说明可在本文末尾找到

  • w(更新,2.6+)此值确定写入的“安全性”。当该值为-1时,无论网络或数据库错误如何,写入操作都不会报告任何错误。WRITECOCERN.NONE是适用于此的预定义WRITECOCERN。如果w为0,则网络错误将导致写入失败,但mongo错误不会。这通常被称为“开火并忘记”写入,当性能比一致性和持久性更重要时,应该使用它。此模式使用WriteConcern.NORMAL

    如果将w设置为1或更高,则认为写入是安全的。安全写入执行写入操作,然后向服务器发出请求,以确保写入成功,或者如果写入未成功,则检索错误值(换句话说,写入后会发送getLastError()命令)。注意,在这个getLastError()命令完成之前,连接是保留的。因此,再加上额外的命令,吞吐量将明显低于使用w(1)的写入。大于1的值对写入吞吐量有很大影响

  • fsync。耐久性选项,在启用时强制mongo在每次写入后刷新到磁盘。我从来没有遇到过任何与写积压相关的耐久性问题,所以我们在生产中使用了false(默认值)

  • j*(新2.7+)*。布尔值,当设置为true时,强制MongoDB在返回之前等待成功的日志组提交。如果您已启用日记功能,则可以启用此功能以增加耐用性。请参阅以查看日志记录给您带来了什么(以及您可能希望启用此标志的原因)

ReadPreference ReadPreference类允许您配置mongod实例查询在使用副本集时路由的内容。以下选项可用:

  • ReadPreference.primary():所有读取仅转到repset主成员。如果需要所有查询返回consiste,请使用此选项