背景:
背景 一般來說,除了由於secondary延遲可能造成查詢secondary節點數據不准以外,關於count的准確性問題,詳情請見:https://developer.aliyun.com/article/704434
一、現象:db.collection.count()不准確:
MongoDB在分片后的集合上進行db.collection.count()操作時,出現結果不准確的現象,需要采用聚合的方法獲取集合的count結果,在使用MongoDB-Java客戶端做簡單的插入操作(10W條)以后,使用Studio 3T查看插入結果時,發現顯示的count結果與插入的數據不一致,偶然會多出幾條或十幾條,插入操作很簡單,其中table3被分片
發現問題后,通過在shell里面查詢count,命令如下 db.table3.count()
二、原因:
-
操作的是分片的集合(前提);
-
shard分片正在做塊遷移,導致有重復數據出現;
-
存在孤立文檔(因為不正常關機、塊遷移失敗等原因導致);
三、解決方法:
使用聚合aggregate的方式查詢count數量,shell命令如下:
db.collection.aggregate( [ { $group: { _id: null, count: { $sum: 1 } } } ] )
-
同時追求效率和准確性,可以設置負載均衡窗口,在窗口以外禁止move chunk
-
強調數據准確性的場景,使用db.collection.aggregate()方法代替count
-
針對帶謂詞條件的count操作,將mongo版本升級到4.0以上
-
針對出現大量孤立文檔的情況,做孤立文檔清理
##############################################################