Ticket #95 (closed Bug: fixed)

Opened 14 years ago

Last modified 14 years ago

r系统调用接口报MongoException: norepl

Reported by: sunxiang Owned by: sunxiang
Priority: major Milestone:
Component: 报价库 Version: 产品库3.0
Keywords: Connections MongoDB Cc:
Due Date: 21/03/2012

Description (last modified by sunxiang) (diff)

报错

wap_product_price改版,报价页使用r系统调用接口。在测试中发现会报com.mongodb.MongoException?: norepl,具体如下:
MongoException: norepl

原因

在官网上看到,norepl原来是no replica(没有复制品)的意思,从测试得知只配了一台机。查了一下mongo连接相关的配置,在resin-web.xml中mongo配置如下:,

<env-entry>
<description>MongoConfig for 4</description>
<env-entry-name>mongoConfig4RClient</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>mongodb://192.168.75.100:5566/price_front_cache?slaveOk=true;maxPoolSize=256;w=2;safe=true</env-entry-value>
</env-entry>

其中,w=2;safe=true表示使用安全模式连接到复制组,等待复制操作至少在2台机器完成,但又没有配置复制集,因此报错。

解决

去掉配置中的w=2;safe=true即可。

附上连接相关的配置:
标准的连接字符串格式

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

•mongodb:// 必选的前缀,用来标示这是一个标准连接格式的字符串
•username:password@ 可选的。如果有,驱动在连接到数据库服务器后会尝试登录到一个数据库。
•host1 URL的必选部分。它标示了要连接的服务器地址。
•:portX 是可选的。如果没有提供默认连接到:27017.
•/database 要登录的数据库的名称,只有username:password@语法使用后它才有用。如果没有提供,默认使用“admin”。
•?options 是连接的可选项。注意如果database没有提供,在最后一个主机和?符号中间依然需要一个斜杠"/"。可选项是名称=值的配对,他们使用"&"或者";"隔开。


很多主机可能需要指定(连接到复制对/组)。

这些可选项是:

复制组:

•replicaSet=name

•驱动会检查连接到的复制组和这个名称是否匹配。意味着如果给出的主机是种子列表,驱动会尝试找到复制组内所有成员。

单台服务器:

•slaveOk=true|false


其他配置:

•safe=true|false

•true:驱动在执行更新操作后会发送一个getLastError命令确保更新成功(同时查看一下w和wtimeoutMS)。
•false:驱动在每次更新操作后不会发送getLastError命令。


•w=n

•驱动在getLastError命令中增加{w:n}。在safe=true的情况下.


•wtimeoutMS=ms

•驱动在getLastError命令中增加{wtimeout:ms}。在safe=true的情况下.


•fsync=true|false

•true:驱动在getLastError命令中增加{fsync:true}。在safe=true的情况下.
•false:驱动不在getLastError命令中增加同步参数。


•journal=true|false

•同步到日志文件。在safe=true的情况下.


•connectTimeoutMS=ms

•一个连接在超时之前可以保持打开的时间。


•socketTimeoutMS=ms

•套接字上面的发送和接收操作的超时时间。

Attachments

20120312180929.jpg Download (79.9 KB) - added by sunxiang 14 years ago.
MongoException?: norepl

Change History

Changed 14 years ago by sunxiang

MongoException?: norepl

comment:1 Changed 14 years ago by sunxiang

  • Description modified (diff)

comment:2 Changed 14 years ago by sunxiang

  • Description modified (diff)

comment:3 Changed 14 years ago by chenchongqi

  • Status changed from new to closed
  • Resolution set to fixed

mongodb的replicaset模式中,写只会写到master,读只会读到slave,safe=true则表示,为了数据安全,master在写的时候,会复制w台slave,并等待返回结果后才返回,又因为在当前版本的mongodb中,写锁是实例锁,因此这个配置如果写频繁的场景下,会极大影响slave的读效率。

Note: See TracTickets for help on using tickets.