疑似MongoDB数据丢失问题

使用MongoDB进行数据插入,发现存在数据丢失问题。

集群环境:五台windows server2008服务器,配备五个shard,模式为一主一从一仲裁。

场景描述:现有约4000w数据,大小为62G(图片数据),使用MongDB C# Driver提供的IMongoCollection接口的insertMany方法批量插入,每次大概100条,程序的写入模式已经配置为WriteConcern.Acknowledge,并且开启了journal,InsertMany处也是用try捕捉了异常,最终执行结果是未捕捉到异常。程序执行完成后,发现缺少部分数据。

程序解析到的数据量为39821308条,而mongoDB数据库中统计到的数量为39804543。

有大牛能帮忙分析解释一下吗,分析了一周左右,实在是没有头绪。

阅读 5.7k
2 个回答

因为做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统计正确的结果。

补充

基于你提到的情况,另外一些可能导致数据缺失的情况:

  1. 是否在大批量插入数据时压力超过极限导致结点发生过主从切换?可以观察日志中是否有出现过PRIMARY, SECONDARY等关键字来确定是否发生过切换。
  2. 默认情况下写入操作使用w=1,是否有修改过默认行为?
  3. 还有一种很少见但是确实在实际中遇到过的情况,是否插入的数据又被删除了?可以在local.oplog.rs中查找是否有出现过缺少的文档的_id来确定这一点。

检查下数据是否被覆盖写入了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题