我有一个写入副本集的 JAVA 应用程序。我正在使用 3.0.7 版本的 MongoDB 服务器。 Java 的 mongo-driver 是 3.0.4。 它工作得很好,但现在所有写入都出现以下错误:
com.mongodb.MongoWriteException: quota exceeded
at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:487)
at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:474)
at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:325)
查看了 MongoDB 配置文档,我没有在 mongod.conf 中设置任何配额限制。我也不使用 smallFiles。
但我认为我遇到了文件大小限制。我的数据库的文件大小如下:
total 6240548
-rw------- 1 mongod mongod 67108864 Dec 8 16:55 2015.0
-rw------- 1 mongod mongod 134217728 Dec 8 12:15 2015.1
-rw------- 1 mongod mongod 268435456 Dec 8 12:15 2015.2
-rw------- 1 mongod mongod 536870912 Dec 8 12:15 2015.3
-rw------- 1 mongod mongod 1073741824 Dec 8 12:15 2015.4
-rw------- 1 mongod mongod 2146435072 Dec 8 16:06 2015.5
-rw------- 1 mongod mongod 2146435072 Dec 8 16:06 2015.6
-rw------- 1 mongod mongod 16777216 Dec 8 16:55 2015.ns
drwxr-xr-x 2 mongod mongod 4096 Dec 7 09:14 _tmp
/etc/mongod.conf 如下:
storage:
dbPath: /data/mongoDB
indexBuildRetry: true
repairPath: /data/mongoDB/repair
journal:
enabled: true
directoryPerDB: true
syncPeriodSecs: 60
engine: mmapv1
mmapv1:
preallocDataFiles: false
nsSize: 16
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: false
journal:
debugFlags: 0
commitIntervalMs: 100
可能出了什么问题?
PS:正在使用/etc/mongod.conf。
mongod 10864 1 0 Nov16 ? 03:10:34 /usr/bin/mongod -f /etc/mongod.conf
更新 - 1。通过将集合名称更改为新集合来尝试相同的更新。成功了!但还没有解释这个问题。 2. 将 java 驱动程序更改为 3.0.3,但没有帮助。
Update- 2:(12/9) 添加集合统计信息,因为它与集合本身和 java 驱动程序有关。如果有什么问题请告诉我。
{
"ns" : "2015.events",
"count" : 827054,
"size" : 3814018,
"avgObjSize" : 4722,
"numExtents" : 22,
"extents" : [
{
"len" : 8192,
"loc: " : {
"file" : 0,
"offset" : 20480
}
},
{
"len" : 32768,
"loc: " : {
"file" : 0,
"offset" : 2134016
}
},
{
"len" : 131072,
"loc: " : {
"file" : 0,
"offset" : 2166784
}
},
{
"len" : 524288,
"loc: " : {
"file" : 0,
"offset" : 2297856
}
},
{
"len" : 2097152,
"loc: " : {
"file" : 0,
"offset" : 2822144
}
},
{
"len" : 8388608,
"loc: " : {
"file" : 0,
"offset" : 4919296
}
},
{
"len" : 11325440,
"loc: " : {
"file" : 0,
"offset" : 14356480
}
},
{
"len" : 15290368,
"loc: " : {
"file" : 0,
"offset" : 28827648
}
},
{
"len" : 20643840,
"loc: " : {
"file" : 0,
"offset" : 44118016
}
},
{
"len" : 27869184,
"loc: " : {
"file" : 1,
"offset" : 8192
}
},
{
"len" : 37625856,
"loc: " : {
"file" : 1,
"offset" : 36265984
}
},
{
"len" : 50798592,
"loc: " : {
"file" : 1,
"offset" : 78086144
}
},
{
"len" : 68579328,
"loc: " : {
"file" : 2,
"offset" : 8396800
}
},
{
"len" : 92585984,
"loc: " : {
"file" : 2,
"offset" : 93753344
}
},
{
"len" : 124993536,
"loc: " : {
"file" : 3,
"offset" : 8192
}
},
{
"len" : 168742912,
"loc: " : {
"file" : 3,
"offset" : 125001728
}
},
{
"len" : 227803136,
"loc: " : {
"file" : 4,
"offset" : 8192
}
},
{
"len" : 307535872,
"loc: " : {
"file" : 4,
"offset" : 239136768
}
},
{
"len" : 415174656,
"loc: " : {
"file" : 4,
"offset" : 595939328
}
},
{
"len" : 560488448,
"loc: " : {
"file" : 5,
"offset" : 8192
}
},
{
"len" : 756662272,
"loc: " : {
"file" : 5,
"offset" : 607756288
}
},
{
"len" : 1021497344,
"loc: " : {
"file" : 6,
"offset" : 8192
}
}
],
"storageSize" : 3826952,
"lastExtentSize" : 997556,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 8,
"indexDetails" : {
},
"totalIndexSize" : 348270,
"indexSizes" : {
"_id_" : 47123,
"remoteRequest.uri_1" : 76969,
"transactionId_1" : 59611,
"startTime_1" : 39027,
"endTime_1" : 35235,
"remoteRequest.queryParams.q_1" : 20328,
"remoteRequest.queryParams.fq_1" : 38285,
"elapsedTimeInNanos_1" : 31689
},
"ok" : 1
}
最佳答案
您的 mongod.conf
有一个 quota为每个数据库启用。基于该 mongod.conf
文件,您将无法创建超过 8 个数据库文件,这限制了您最大约 6.4 GB 的存储空间。你提到你可以通过使用一个新的集合来解决这个问题,所以我对你的数据目录现在的样子很感兴趣。我不希望您能够绕过这个硬限制,但是由于内部数据结构,可能会在短时间内“绕过”它。
您可以通过运行 dbStats command 来验证实际存储了多少数据
use 2015
db.stats(1024*1024)
此输出将告诉您数据库中实际有多少数据,以及分配的存储量。这些数字将不匹配,这是预期的,因为文档包含用于填充的空白空间。
我的下一个问题是,您是否有理由人为地限制您的 mongod
可以分配的存储空间量?也许是 capped collection会更适合您的需求?如果你能扩展你的用途,我或许可以给你一个更好的答案。
关于mongodb - 写入时出现 MongoDB 错误 - 超出配额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34166991/