我使用MongoDB来存储定期测量的值。每隔约100毫秒将一堆值插入为文档。它工作正常,但我担心性能问题。(我使用安全插入,似乎在PyMongo中这是默认值。)
如果每秒插入的内容多于mongod可以保存到硬盘上的内容,会发生什么情况?会发出任何警告,还是只是默默地失败?
有什么方法可以监视写负载?我发现只有db.serverStatus().writeBacksQueued
在调用它时始终将其设置为false的情况。我如何测试必须插入多少数据才能填满写队列?
mongostat
显示锁。这是我应该担心的事情吗?
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn repl time
*117 *0 *0 *0 0 2|0 0 17.4g 35.3g 3.76g 0 .:6.5% 0 0|0 0|0 124b 6k 2 SLV 09:58:10
*111 *0 *0 *0 0 2|0 0 17.4g 35.3g 3.76g 0 .:0.8% 0 0|0 0|0 124b 6k 2 SLV 09:58:11
*111 *0 *0 *0 0 2|0 0 17.4g 35.3g 3.76g 0 .:4.2% 0 0|0 0|0 124b 6k 2 SLV 09:58:1
我是否需要担心写锁?在写锁定时间段内插入会发生什么情况?是否排队并稍后存储?
我正在考虑使用一个主机和一个从机进行简单的复制设置。初始同步或重新同步过程是否锁定数据库?
(我使用的是版本2.4.3。)
更新: 我认为部分回答了我自己的问题。我使用循环插入一个小的测试文档的简单循环设法每秒获得多达12.000次插入。但是qr | qw仍然显示有读写队列仍然为空:
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn repl time
11234 *0 2 *0 1563 1|0 1 21.9g 44.3g 1.22g 0 testdb:58.9% 0 1|0 1|1 797k 980k 6 PRI 10:26:32
12768 *0 2 *0 1284 1|0 0 21.9g 44.3g 1.22g 0 testdb:58.0% 0 0|0 0|1 881k 1m 6 PRI 10:26:33
12839 *0 2 *0 1231 1|0 0 21.9g 44.3g 1.22g 0 testdb:60.3% 0 0|0 0|1 883k 1m 6 PRI 10:26:34
12701 *0 2 *0 910 1|0 0 21.9g 44.3g 1.22g 0 testdb:61.8% 0 0|0 0|1 858k 1m 6 PRI 10:26:35
12241 *0 2 *0 1206 1|0 0 21.9g 44.3g 1.22g 0 testdb:56.7% 0 0|0 0|0 843k 1m 6 PRI 10:26:36
11581 *0 2 *0 1406 1|0 0 21.9g 44.3g 1.22g 0 testdb:61.8% 0 0|0 0|1 811k 1m 6 PRI 10:26:37
8719 *0 2 *0 1210 1|0 0 21.9g 44.3g 1.22g 0 testdb:43.8% 0 0|0 0|1 618k 762k 6 PRI 10:26:38
11429 *0 2 *0 1469 1|0 0 21.9g 44.3g 1.22g 0 testdb:60.6% 0 0|0 0|1 804k 993k 6 PRI 10:26:39
12779 *0 2 *0 1092 1|0 0 21.9g 44.3g 1.22g 0 testdb:60.2% 0 1|0 0|1 872k 1m 6 PRI 10:26:40
12757 *0 2 *0 436 1|0 0 21.9g 44.3g 1.22g 0 testdb:59.7% 0 0|0 0|1 838k 432k 6 PRI 10:26:41
我想这意味着仅插入一项不会带来很多麻烦:“如果您与其他大量写入操作(例如大范围删除操作)一起执行大量写入操作,则队列将趋于高峰。” (在这里找到)
我的公开问题是:如果写入队列长期增加,对我的数据会有什么影响?