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.
Ejecuta sh.status(true) para encontrar el fragmento etiquetado como jumbo.
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.
Usa tanto sh.splitAt() como sh.splitFind() para dividir el fragmento jumbo.
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.
Ejecuta sh.status(true) para encontrar el fragmento etiquetado como jumbo.
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)
Refina la clave de partición de la colección test.orders.
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 los rangos de zonas para incorporar los nuevos campos sin modificar los valores de rango de los campos clave existentes. Es decir, el refinamiento de la clave de partición no afecta inmediatamente la distribución de los fragmentos entre las particiones o zonas. Cualquier futura división de fragmentos o migración ocurre como parte de las operaciones rutinarias de particionado.
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 partición, asegúrese de que todos o la mayoría de los documentos de la colección tengan los campos 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.
Ejecuta sh.status(true) para encontrar el fragmento etiquetado como jumbo.
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 comando clearJumboFlag.
Desde la admin base de datos, ejecuta el clearJumboFlag, pasando el namespace de la colección particionada y uno de los siguientes:
los límites del fragmento
jumbo: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.