db.collection.count () gibt viel mehr Dokumente für die Sharded Collection in MongoDB zurück

Ich habe 2 Shards mit Replikationssätzen (jeweils 3 Instanzen). Wenn ich es tuecount() Auf einer Sharded-Sammlung erhalte ich viel mehr als die tatsächliche Anzahl von Dokumenten (mehr als 2,5 Millionen Dokumentendifferenzen). Das gleiche, wenn ich es gerade tuefind() und Zähler inkrementierenforEach() Schleife.

Woher weiß ich die tatsächliche Anzahl von Dokumenten? Zuallererst kenne ich den Trend der Zunahme, d. H. Er kann nicht so radikal zunehmen. Zweitens, wenn ich Dokumente mit dem folgenden M / R-Skript zähle, erhalte ich eine echte Anzahl von Dokumenten (wie ich annehme). Ich benutze dieses Skript, um doppelte Dokumente zu sehen. Die Anzahl der Duplikate beträgt mehrere Tausend, nicht Millionen. Und die Zählung auftest_duplicate_collection Minus-Duplikate geben mir die tatsächliche Anzahl von Dokumenten.

var map = function(){
   emit(this.doc_id, 1);
};

var reduce = function(key, values){
   var result = 0;
   values.forEach(function(value) {
     result += value;
   });

   return result;
};

db.test_collection.mapReduce(map, reduce, "test_duplicate_collection",null );

Jetzt verstehe ich, dass es beim Balancieren passieren kann, dass einige Chunks noch nicht gelöscht werden, während sie auf einen anderen Shard übertragen werden. Aber ich sehe im Status (sh.status()), dass alle Stücke gleich verteilt sind. Ich habe auch versucht, Schreibvorgänge anzuhalten, um festzustellen, ob es einige Zeit dauert, aber es ist nichts passiert.

Man könnte sagen, das Löschen von verschobenen Chunks ist noch im Gange, und als ich gerade mit dem Sharding anfing, sah ich leichte Abnahmen (ohne Schreiboperationen) für die Sharded Collection. Momentan ändert sich jedoch nichts, es bleibt einfach stehen. Ich habe auch versucht, zu verwendenorphanage.js mit der Hoffnung, verwaiste Dokumente zu finden (mit dem Skript vonhttps://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I), aber es wurden keine derartigen Dokumente gefunden.

Meine Frage ist, woran das liegen kanncount() undfind().forEach() Geben Sie mehr als die tatsächliche Anzahl von Dokumenten an (d. h. vs M / R-Skript).

Schätze deine Hilfe.

EDIT1

Bei der Konfiguration des Replikationssatzes in einem der Shards ist ein Problem aufgetreten. Insbesondere wurde in der Konfigurationsdatei kein Master festgelegt. Im MMS-Dashboard stattPrimary Ich habe es immer gesehenSlave für Host, der von anderen Replikationshosts abgehört wurde. Als wir es repariert haben,forEach Die Schleifenzählung zeigte nun die gleiche Anzahl von Dokumenten wie im obigen M / R-Skript. Das einzige Problem ist also derzeit mit demcount() selbst.

In MongoDB JIRA habe ich den folgenden ungelösten Fehler mit count () in einer Sharded-Umgebung gefundenhttps://jira.mongodb.org/browse/SERVER-3645 Es bezieht sich jedoch wirklich auf count () während des Auswuchtens, d. H. Count kann Blöcke zählen, die gegenwärtig vom Auswuchtgerät bewegt werden. Um dieses Problem zu umgehen, schlägt dieser Fehler vor, eine Abfrage zu platzieren, die immer wahr ist. Ich habe es auch versucht, aber immer noch zählt es wie zuvor.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage