关于网友提出的“ 疑似MongoDB数据丢失问题”问题疑问,本网通过在网上对“ 疑似MongoDB数据丢失问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 疑似MongoDB数据丢失问题
描述:使用MongoDB进行数据插入,发现存在数据丢失问题。
集群环境:五台windows server2008服务器,配备五个shard,模式为一主一从一仲裁。
场景描述:现有约4000w数据,大小为62G(图片数据),使用MongDB C# Driver提供的IMongoCollection接口的insertMany方法批量插入,每次大概100条,程序的写入模式已经配置为WriteConcern.Acknowledge,并且开启了journal,InsertMany处也是用try捕捉了异常,最终执行结果是未捕捉到异常。程序执行完成后,发现缺少部分数据。
程序解析到的数据量为39821308条,而mongoDB数据库中统计到的数量为39804543。
有大牛能帮忙分析解释一下吗,分析了一周左右,实在是没有头绪。
解决方案1:因为做MongoDB相关服务,隔三差五就会被疑似丢失一回,不过目前为止都没有哪一个是真的丢失的。
如果有十足的把握没有代码上的问题,大部分人遇到的情况可能有以下几种:
非正常关闭后count结果不正确:Accuracy after Unexpected Shutdown;
After an unclean shutdown of a mongod using the Wired Tiger storage engine, count statistics reported by count may be inaccurate.
在Sharding环境中count结果不准确:Behavior
On a sharded cluster, count can result in an inaccurate count if orphaned documents exist or if a chunk migration is in progress.
你上面提到:
程序解析到的数据量为39821308条,而mongoDB数据库中统计到的数量为39804543。
因为程序和shell中返回的数据应该是一样的,所以你可能是上述第二种可能性。要得到准确的数值需要用照文档中所述使用aggregation统计正确的结果。
补充
基于你提到的情况,另外一些可能导致数据缺失的情况:
- 是否在大批量插入数据时压力超过极限导致结点发生过主从切换?可以观察日志中是否有出现过PRIMARY, SECONDARY等关键字来确定是否发生过切换。
- 默认情况下写入操作使用w=1,是否有修改过默认行为?
- 还有一种很少见但是确实在实际中遇到过的情况,是否插入的数据又被删除了?可以在
local.oplog.rs
中查找是否有出现过缺少的文档的_id
来确定这一点。
解决方案2:检查下数据是否被覆盖写入了。
以上介绍了“ 疑似MongoDB数据丢失问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/4535473.html