2010-09-10 9 views
5

Mam problemy z tym, co wydaje się być prostym układem odłamków w Mongo.Złamanie Mongo nie dzieli dużej kolekcji między odłamkami.

Mam dwa odłamki, pojedynczą instancję Mongos, a pojedynczy serwer config skonfigurować tak:

Machine - 10.0.44.16 - server config, Mongos
maszyny B - 10.0.44.10 - odłamek 1
Maszyna C - 10.0.44.11 - odłamek 2

mam kolekcję o nazwie „Nasiona”, które odgrywa kluczową shard „SeedType”, która jest dziedziną, która jest obecna na każdym dokumencie w zbiorach i zawiera jeden z czterech wartości (spójrz na status shardowania poniżej). Dwie wartości mają znacznie więcej wpisów niż pozostałe dwie (dwie z nich mają 784,000 rekordów, a dwa mają około 5000).

Zachowanie, którego się spodziewam, polega na tym, że rekordy w kolekcji "Nasiona" za pomocą InventoryPOS znajdą się na jednym fragmencie, a te z InventoryOnHand znajdą się na drugim.

Jednak wydaje się, że wszystkie rekordy dla obu większych kluczy odłamkowych trafiają do głównego fragmentu.

Oto mój tekst statusu sharding (inne zbiory usunięte dla jasności):

--- Sharding Status --- 
    sharding version: { "_id" : 1, "version" : 3 } 
    shards: 
     { "_id" : "shard0000", "host" : "10.44.0.11:27019" } 
     { "_id" : "shard0001", "host" : "10.44.0.10:27017" } 
    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "TimMulti", "partitioned" : true, "primary" : "shard0001" } 
       TimMulti.Seeds chunks: 
         { "SeedType" : { $minKey : 1 } } -->> { "SeedType" : "PBI.AnalyticsServer.KPI" } on : shard0000 { "t" : 2000, "i" : 0 } 
         { "SeedType" : "PBI.AnalyticsServer.KPI" } -->> { "SeedType" : "PBI.Retail.InventoryOnHand" } on : shard0001 { "t" : 2000, "i" : 7 } 
         { "SeedType" : "PBI.Retail.InventoryOnHand" } -->> { "SeedType" : "PBI.Retail.InventoryPOS" } on : shard0001 { "t" : 2000, "i" : 8 } 
         { "SeedType" : "PBI.Retail.InventoryPOS" } -->> { "SeedType" : "PBI.Retail.SKU" } on : shard0001 { "t" : 2000, "i" : 9 } 
         { "SeedType" : "PBI.Retail.SKU" } -->> { "SeedType" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 10 }

robię coś złego?

Semi-niezwiązane pytanie:

Jaki jest najlepszy sposób na atomowo przeniesienie obiektu z jednego zbioru do drugiego bez blokowania całą usługę Mongo?

Dzięki z góry, -Tim

Odpowiedz

6

Sharding naprawdę nie jest przeznaczone do pracy w ten sposób. Powinieneś wybrać klucz odłamkowy z pewną odmianą (lub utworzyć złożony klucz odłamu), aby MongoDB mógł tworzyć porcje o rozsądnej wielkości. Jednym z punktów odtrącania jest to, że twoja aplikacja nie musi wiedzieć, gdzie są twoje dane.

Jeśli chcesz ręcznie odłamać, powinieneś to zrobić: uruchom niepowiązane serwery MongoDB i skieruj rzeczy samodzielnie ze strony klienta.

Wreszcie, jeśli naprawdę jesteś oddany tej konfiguracji, możesz samemu dokonać migracji tej części (jest tam polecenie moveChunk).

Balancer przesuwa porcje w zależności od ilości odwzorowań w pamięci (uruchom serverStatus i spójrz na pole "mapowane"). To może trochę potrwać, MongoDB nie chce, aby twoje dane latały w miejscu produkcji, więc jest to dość konserwatywne.

Odpowiedź semi-niepowiązana: nie można tego zrobić atomicznie z shardingiem (eval nie jest atomowy na wielu serwerach). Będziesz musiał zrobić findOne, wstawić, usunąć.

Powiązane problemy