2013-07-09 28 views
5

Mam 2 odłamki z zestawami replikacji (po 3 wystąpienia). Kiedy wykonuję count() w kolekcji Sharded, dostaję o wiele więcej niż rzeczywistą liczbę dokumentów (ponad 2,5 miliona różnic w dokumentach). To samo, co po prostu robię find() i zwiększam licznik w pętli forEach().db.collection.count() zwraca znacznie więcej dokumentów dla kolekcji Sharded w MongoDB

Skąd mam wiedzieć, ile dokumentów? Przede wszystkim znam trend wzrostu, tj. Nie może on tak radykalnie wzrosnąć. Po drugie, kiedy liczę dokumenty za pomocą następującego skryptu M/R, otrzymuję rzeczywistą liczbę dokumentów (jak zakładam). Używam tego skryptu, aby zobaczyć duplikaty dokumentów. Liczba duplikatów to kilka tysięcy, a nie miliony. A liczba na test_duplicate_collection minus duplikaty daje mi prawdziwą liczbę dokumentów.

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); 

Rozumiem, że podczas równoważenia może się zdarzyć, że niektóre kawałki nie zostaną jeszcze usunięte podczas przenoszenia do innego fragmentu. Ale widzę w stanie (sh.status()), że wszystkie porcje są równomiernie rozmieszczone. Próbowałem również wstrzymać operacje zapisu, aby sprawdzić, czy zajmie to trochę czasu, ale nic się nie stało.

Można powiedzieć, że usunięcie przeniesionych fragmentów nadal trwa, a nawet gdy dopiero zacząłem używać odłamków, zauważyłem niewielkie spadki (bez operacji zapisu) dla kolekcji Sharded. Ale obecnie nie ma zmian w czasie, po prostu stoi nieruchomo. Próbowałem również użyć orphanage.js z nadzieją znalezienia osieroconych dokumentów (przy użyciu skryptu z https://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I), ale nie znaleziono takich dokumentów.

Moje pytanie brzmi, co może być powodem, dla którego count() i find().forEach() dają więcej niż rzeczywistą liczbę dokumentów (tj. W stosunku do skryptu M/R).

Doceń swoją pomoc.

Edit1

Wystąpił problem z konfiguracją replikacji określonym w jednym z odłamków. W szczególności, żaden plik główny nie został ustawiony w pliku konfiguracyjnym. W panelu MMS zamiast Primary zawsze widziałem Slave dla hosta, który był odsłuchiwany przez inne hosty replikacji. Kiedy to naprawiliśmy, liczba pętli zaczęła pokazywać taką samą liczbę dokumentów, jak w powyższym skrypcie M/R. Tak więc jedynym problemem jest obecnie sama count().

W MongoDB JIRA znalazłem następujący nierozwiązany problem z count() w sharded środowiska https://jira.mongodb.org/browse/SERVER-3645 Ale to naprawdę dotyczy count() w trakcie równoważenia, czyli licznik może liczyć kawałki, które są obecnie przenoszone przez wyważarki. Jako obejście tego błędu proponuje się umieścić zapytanie, które zawsze jest prawdziwe. Próbowałem go również, ale nadal zwraca tak jak wcześniej.

+0

pan sprawdzić, czy kwerenda wstawiania/updation jest prawidłowe (dzielenie, które byłyby przydatne)? – Sai

+0

Wykonujesz wszystkie zapytania za pośrednictwem mongos, a nie bezpośrednio w stosunku do odłamków, prawda? –

+0

@ Sai Sprawdzę podwójnie pod kątem wkładki/aktualizacji. –

Odpowiedz

-1

Spróbuj użyć wolniejszy (ale widocznie bardziej dokładne) .itcount()

+0

1. itcount to specjalna funkcja sterownika java. OP nigdy nie powiedział, że używają java 2. ma duży "tylko do testowania!" ostrzeżenie. – Philipp

+0

Użyłem go w powłoce. Po prostu nie mam jeszcze żadnej dokumentacji. https://jira.mongodb.org/browse/DOCS-2147 – eric