Si MongoDB no puede dividir un fragmento que excede el tamaño de rango especificado, MongoDB etiqueta el fragmento como jumbo.
Los siguientes procedimientos describen los pasos para borrar manualmente la bandera jumbo.
Procedimientos
Fragmentos divisibles
La forma manual preferida de borrar la bandera jumbo de un fragmento es intentar dividir el fragmento. Si el fragmento es divisible, MongoDB remueve la bandera al hacer la división exitosa del fragmento.
Encuentra el fragmento de jumbo.
Ejecute para encontrar el sh.status(true) fragmento jumbo etiquetado.
sh.status(true)
Por ejemplo, la siguiente salida de sh.status(true) muestra que el fragmento con el rango de la clave de partición { "x" : 2 } -->> { "x" : 4 } está jumbo.
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.foo shard key: { "x" : 1 } chunks: shard-b 2 shard-a 2 { "x" : { "$minKey" : 1 } } -->> { "x" : 1 } on : shard-b Timestamp(2, 0) { "x" : 1 } -->> { "x" : 2 } on : shard-a Timestamp(3, 1) { "x" : 2 } -->> { "x" : 4 } on : shard-a Timestamp(2, 2) jumbo { "x" : 4 } -->> { "x" : { "$maxKey" : 1 } } on : shard-b Timestamp(3, 0)
Divida el fragmento de jumbo.
Utilice sh.splitAt() o para dividir sh.splitFind() el jumbo fragmento.
sh.splitAt( "test.foo", { x: 3 })
MongoDB remueve la marca jumbo tras la división exitosa del fragmento.
Fragmentos indivisibles
En algunas instancias, MongoDB no puede dividir el fragmento que ya no es jumbo, como un fragmento con un rango de valor de la clave de partición único. Por lo tanto, no puedes dividir el fragmento para limpiar la marca.
En tales casos, puede cambiar la clave de partición para que el fragmento pueda hacerse divisible o borrar manualmente la bandera.
Refina la clave de partición
MongoDB proporciona el refineCollectionShardKey comando. Mediante el comando refineCollectionShardKey, se puede perfeccionar la clave de partición de una colección añadiendo uno o varios campos sufijos a la clave existente. Al agregar nuevos campos a la clave de partición, los fragmentos jumbo indivisibles pueden volverse divisibles.
Encuentra el fragmento de jumbo.
Ejecute para encontrar el sh.status(true) fragmento jumbo etiquetado.
sh.status(true)
Por ejemplo, la siguiente salida de sh.status(true) muestra que para la colección particionada test.orders, tanto el fragmento con el rango de clave de partición { "status" : "A" } -->> {
"status" : "D" } como el fragmento con el rango { "status" : "D" }
-->> { "status" : "P" } están jumbo.
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.orders shard key: { "status" : 1 } unique: false balancing: true chunks: shardA 2 shardB 2 { "status" : { "$minKey" : 1 } } -->> { "status" : "A" } on : shardB Timestamp(3, 0) { "status" : "A" } -->> { "status" : "D" } on : shardA Timestamp(5, 1) jumbo { "status" : "D" } -->> { "status" : "P" } on : shardA Timestamp(4, 2) jumbo { "status" : "P" } -->> { "status" : { "$maxKey" : 1 } } on : shardB Timestamp(5, 0)
Refinar la clave de test.orders fragmento para la colección.
Para solucionar la baja cardinalidad de la clave status, refine la clave para la colección test.orders. Por ejemplo, agregue los campos order_id y customer_id como un sufijo a la clave de partición actual; es decir, la clave de partición será { status: 1, order_id: 1,
customer_id: 1 } después de la refinación.
Primero,
create the indexpara admitir la clave de partición{ status: 1, order_id: 1, customer_id: 1 }si el índice aún no existe.db.orders.createIndex( { status: 1, order_id: 1, customer_id: 1 } ) Para consideraciones de índice adicionales para refinar la clave de partición, consulta Consideraciones de índices.
En la base de datos
admin, ejecute el comandorefineCollectionShardKeypara agregar los camposorder_idycustomer_idcomo sufijo a la clave existente:db.adminCommand( { refineCollectionShardKey: "test.orders", key: { status: 1, order_id: 1, customer_id: 1 } } )
El comando refineCollectionShardKey actualiza los rangos de fragmentos y zonas para incorporar los nuevos campos sin modificar los valores de rango de los campos de clave existentes. Es decir, el refinamiento de la clave de fragmento no afecta inmediatamente la distribución de fragmentos entre fragmentos o zonas. Cualquier división o migración de fragmentos futura se realiza como parte de las operaciones rutinarias de fragmentación.
Tip
Después de refinar la clave de partición, puede que no todos los documentos de la colección tengan el/los campo(s) sufijo(s). Para rellenar los campos de clave de partición faltantes, consulte Campos de clave de partición faltantes.
Antes de refinar la clave de fragmento, asegúrese de que todos o la mayoría de los documentos de la colección tengan los campos de sufijo, si es posible, para evitar tener que completar el campo posteriormente.
Borrar manualmente la bandera jumbo para un fragmento indivisible
Para borrar manualmente la bandera jumbo, puedes usar el comando clearJumboFlag. Si borras la bandera jumbo de un fragmento que aún excede el tamaño de fragmento, MongoDB volverá a etiquetar el fragmento como jumbo cuando intente moverlo.
Importante
Utiliza este método solo si el método preferido no es aplicable.
Para borrar manualmente la marca, use los siguientes pasos:
Encuentra el fragmento de jumbo.
Ejecute para encontrar el sh.status(true) fragmento jumbo etiquetado.
sh.status(true)
Por ejemplo, la siguiente salida de sh.status(true) muestra que el fragmento con el rango de la clave de partición { "x" : 2 } -->> { "x" : 3 } está jumbo.
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.foo shard key: { "x" : 1 } chunks: shard-b 2 shard-a 2 { "x" : { "$minKey" : 1 } } -->> { "x" : 1 } on : shard-b Timestamp(2, 0) { "x" : 1 } -->> { "x" : 2 } on : shard-a Timestamp(3, 1) { "x" : 2 } -->> { "x" : 3 } on : shard-a Timestamp(2, 2) jumbo { "x" : 3 } -->> { "x" : { "$maxKey" : 1 } } on : shard-b Timestamp(3, 0)
Ejecute el clearJumboFlag comando.
Desde la admin base de clearJumboFlag datos, ejecute, pasando el espacio de nombres de la colección fragmentada y:
los límites del
jumbofragmento:db.adminCommand( { clearJumboFlag: "test.foo", bounds: [{ "x" : 2 }, { "x" : 3 }] }) el find documento con clave de partición y valor contenido en el fragmento
jumbo:db.adminCommand( { clearJumboFlag: "test.foo", find: { "x" : 2 } }) Nota
Si la colección utiliza una clave de partición con hash, no utilices el campo
findconclearJumboFlag. Para clave de partición con hash, usa el campoboundsen su lugar.