2010-09-10 8 views
5

Tengo problemas con lo que parece ser una simple configuración de fragmentación en mongo.Mongo sharding no puede dividir una gran colección entre fragmentos

que tienen dos fragmentos, una única instancia mongo, y un servidor único conjunto de configuración de esta manera:

máquina A - 10.0.44.16 - servidor de configuración, Mongos
máquina B - 10.0.44.10 - fragmento 1
máquina C - 10.0.44.11 - fragmento 2

tengo una colección llamada 'semillas' que tiene una clave fragmento 'SeedType', que es un campo que está presente en todos los documentos de la colección, y contiene uno de los cuatro valores (eche un vistazo al estado de fragmentación a continuación). Dos de los valores tienen significativamente más entradas que los otros dos (dos de ellos tienen 784,000 registros cada uno, y dos tienen alrededor de 5,000).

El comportamiento que espero ver es que los registros en la colección 'Seeds' con InventoryPOS terminarán en un fragmento, y los que tienen InventoryOnHand terminarán en el otro.

Sin embargo, parece que todos los registros de las dos claves de fragmento más grandes terminan en el fragmento primario.

Aquí es mi texto de estado (sharding otras colecciones eliminadas para mayor claridad):

--- 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 }

estoy haciendo algo mal?

pregunta semi-sin relación:

¿Cuál es la mejor manera de transferir atómicamente un objeto de una colección a otra sin bloquear todo el servicio mongo?

Gracias de antemano, -Tim

Respuesta

6

Sharding realmente no está destinado a ser utilizado de esta manera. Debe elegir una clave de fragmento con alguna variación (o crear una clave compuesta de fragmento) para que MongoDB pueda crear fragmentos de tamaño razonable. Uno de los puntos de sharding es que su aplicación no necesita saber dónde están sus datos.

Si desea fragmentar manualmente, debe hacerlo: inicie servidores MongoDB no enrutados y enrute cosas usted mismo desde el lado del cliente.

Finalmente, si está realmente dedicado a esta configuración, puede migrar el fragmento usted mismo (hay un comando moveChunk).

El equilibrador mueve trozos según la cantidad asignada en la memoria (ejecuta serverStatus y mira el campo "mapeado"). Puede tomar un tiempo, MongoDB no quiere que tus datos vuelen por todos lados en producción, por lo que es bastante conservador.

Respuesta semi-no relacionada: no se puede hacer atómicamente con la fragmentación (eval no es atómico en varios servidores). Tendrás que hacer un findOne, insertar, eliminar.

Cuestiones relacionadas