Acerca de esta tarea
Las creaciones de índices continuos son una alternativa a creaciones de índices por defecto.
Advertencia
Evita realizar procesos de creación de índices en modo continuo y replicado al mismo tiempo, ya que podría generar problemas inesperados, como compilaciones fallidas y bucles de fallos.
Considerations
Unique Indexes
Para crear índices únicos utilizando el siguiente procedimiento, debes detener todas las escrituras en la colección durante este procedimiento.
Si no puedes detener todos los guardados en la colección durante este procedimiento, no utilices el procedimiento en esta página. En su lugar, compile su índice único en la colección emitiendo db.collection.createIndex() on the mongos para un clúster particionado.
Tamaño del Oplog
Asegúrate de que tu oplog sea lo suficientemente grande para permitir que la operación de indexación o reindexación se complete sin retrasarse demasiado para ponerse al día. Consulta la documentación de dimensionamiento del oplog para obtener información adicional.
Las creaciones de índices continuos disminuyen la resiliencia de tu clúster e incrementan la duración de compilación.
Requisitos previos
- Para construir índices únicos
Para crear índices únicos usando el siguiente procedimiento, debe detener todas las escrituras en la colección durante la creación de índices. De lo contrario, se podría terminar con datos incoherentes entre los miembros del conjunto de réplicas. Si no puedes detener todas las escrituras en la colección, no uses el siguiente procedimiento para crear índices únicos.
Advertencia
Si no puedes detener todas las escrituras en la colección, no utilices el siguiente procedimiento para crear índices únicos.
Antes de crear el índice, valide que ningún documento de la colección infrinja las restricciones del índice. Si una colección está distribuida entre particiones y una partición contiene un fragmento con documentos duplicados, la operación de creación de índices puede tener éxito en las particiones sin duplicados pero no en la partición con duplicados. Para evitar dejar índices inconsistentes en las particiones, puedes emitir el comando
db.collection.dropIndex()desde unmongospara descartar el índice de la colección.
Procedimiento
Importante
El siguiente procedimiento para crear índices de forma gradual se aplica a las implementaciones de clústeres, y no a las implementaciones de sets de réplicas. Para el procedimiento para conjuntos de réplicas, consulta Crear una creación de índices con cambios continuos en conjuntos de réplicas en su lugar.
A. Detener el balanceador
Conectar mongosh a una mongos instancia en el clúster particionado, y ejecute sh.stopBalancer() para desactivar el balanceador: [1]
sh.stopBalancer()
Nota
Si una migración está en curso, el sistema completará la migración en curso antes de detener el balanceador.
Para comprobar que el balanceador esté deshabilitado, ejecuta sh.getBalancerState(), que retorna false si el balanceador está deshabilitado:
sh.getBalancerState()
| [1] | A partir de MongoDB 6.0.3, No se realiza la división automática en fragmentos. Esto se debe a mejoras en las políticas de equilibrio. Los comandos de división automática siguen existiendo, pero no realizan ninguna operación.En versiones de MongoDB anteriores a 6.0.3, sh.stopBalancer() también desactiva la división automática para el clúster fragmentado. |
B. Determinar la Distribución de la Colección
Desde mongosh conectado al mongos, actualice la tabla de enrutamiento en caché para ese mongos para evitar devolver información desactualizada de la distribución para la colección. Una vez actualizado, ejecute db.collection.getShardDistribution() para la colección en la que desea compilar el índice.
Por ejemplo, si deseas crear un índice ascendente en la colección records en la base de datos test:
db.adminCommand( { flushRouterConfig: "test.records" } ); db.records.getShardDistribution();
El método genera la distribución de partición. Por ejemplo, considera un clúster particionado con 3 particiones shardA, shardB y shardC y el db.collection.getShardDistribution() devuelve lo siguiente:
Shard shardA at shardA/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018 data : 1KiB docs : 50 chunks : 1 estimated data per chunk : 1KiB estimated docs per chunk : 50 Shard shardC at shardC/s3-mongo1.example.net:27018,s3-mongo2.example.net:27018,s3-mongo3.example.net:27018 data : 1KiB docs : 50 chunks : 1 estimated data per chunk : 1KiB estimated docs per chunk : 50 Totals data : 3KiB docs : 100 chunks : 2 Shard shardA contains 50% data, 50% docs in cluster, avg obj size on shard : 40B Shard shardC contains 50% data, 50% docs in cluster, avg obj size on shard : 40B
A partir de la salida, solo compilas los índices para test.records en shardA y shardC.
C. Crear índices en las particiones que contienen fragmentos de la colección
Para cada partición que contenga fragmentos de la colección, sigue el procedimiento para compilar el índice en la partición.
C1. Detener uno secundario y reiniciarlo como autónomo
Para una partición afectada, detén el proceso de mongod asociado con uno de sus secundarios. Reinicie después de realizar las siguientes actualizaciones de configuración:
Si está utilizando un archivo de configuración, realice las siguientes actualizaciones de configuración:
Cambia el
net.porta un puerto diferente. [2] Toma nota de la configuración original del puerto como comentario.Comenta la opción
replication.replSetName.Comenta la opción
sharding.clusterRole.Establece el parámetro
skipShardingConfigurationChecksentrueen la secciónsetParameter.Establece el parámetro
disableLogicalSessionCacheRefreshentrueen la secciónsetParameter.
Por ejemplo, para uno de los miembros del conjunto de réplicas de la partición, el archivo de configuración actualizado incluirá contenido similar al siguiente ejemplo:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27218 # port: 27018 #replication: # replSetName: shardA #sharding: # clusterRole: shardsvr setParameter: skipShardingConfigurationChecks: true disableLogicalSessionCacheRefresh: true
Y reinicia:
mongod --config <path/To/ConfigFile>
Otras configuraciones (por ejemplo, storage.dbPath, etc.) permanecen iguales.
Si usas opciones de línea de comando, realiza las siguientes actualizaciones de configuración:
Remover
--replSet.Elimine
--shardsvrsi es un nodo de la partición y--configsvrsi es un nodo del servidor de configuración.Configura el parámetro
skipShardingConfigurationChecksentrueen la opción--setParameter.Configura el parámetro
disableLogicalSessionCacheRefreshatrueen la opción--setParameter.
Por ejemplo, reinicie el miembro del conjunto de réplicas de particiones sin las opciones --replSet y --shardsvr. Especifica un nuevo número de puerto y configura tanto los parámetros skipShardingConfigurationChecks como disableLogicalSessionCacheRefresh en verdadero:
mongod --port 27218 --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
Otras configuraciones (por ejemplo, --dbpath, etc.) permanecen iguales.
| [2] | (1, 2) Al ejecutar el mongod en un puerto diferente, se asegura que los demás nodos del set de réplicas y todos los clientes no se contacten con el nodo mientras se crea el índice. |
C2. Construir el índice
Conéctese directamente a la instancia mongod que se ejecuta como una autónomo en el nuevo puerto y cree el nuevo índice para esta instancia.
Por ejemplo, conecta mongosh a la instancia y utiliza el método db.collection.createIndex() para crear un índice ascendente en el campo username de la colección records:
db.records.createIndex( { username: 1 } )
C3. Reiniciar el Programa mongod como un set de réplicas
Cuando se complete la creación del índice, apaga la instancia mongod. Deshaz los cambios de configuración realizados al iniciar como autónomo para regresar a su configuración original y reiniciar.
Importante
Asegúrate de remover el parámetro skipShardingConfigurationChecks y el parámetro disableLogicalSessionCacheRefresh.
Por ejemplo, para reiniciar su nodo de la set de réplicas de partición:
Si estás usando un archivo de configuración:
Restaurar al número de puerto original.
Descomenta el
replication.replSetName.Descomenta el
sharding.clusterRole.Remover el parámetro
skipShardingConfigurationChecksen la secciónsetParameter.Remover el parámetro
disableLogicalSessionCacheRefreshen la secciónsetParameter.
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27018 replication: replSetName: shardA sharding: clusterRole: shardsvr
Otras configuraciones (por ejemplo, storage.dbPath, etc.) permanecen iguales.
Y reinicia:
mongod --config <path/To/ConfigFile>
Si está utilizando opciones de línea de comandos:
Restaurar al número de puerto original.
Incluir
--replSet.Incluye
--shardsvrsi se trata de un nodo de la partición o--configsvrsi se trata de un nodo del servidor de configuración.Remove parameter
skipShardingConfigurationChecks.Remove parameter
disableLogicalSessionCacheRefresh.
Por ejemplo:
mongod --port 27018 --replSet shardA --shardsvr
Otras configuraciones (por ejemplo, --dbpath, etc.) permanecen iguales.
Permitir que la replicación se ponga al día en este nodo.
C4. Repita el procedimiento para los secundarios restantes de la partición
Una vez que el nodo se ponga al día con los otros nodos del conjunto, repita el procedimiento de un nodo a la vez para los nodos secundarios restantes de la partición:
C5. Construir el índice en el primario
Cuando todos los secundarios del shard tengan el nuevo índice, degrada el primario del shard, reinícialo como uno autónomo usando el procedimiento descrito anteriormente y crea el índice en el ex-primario:
Utilice el método
rs.stepDown()enmongoshpara bajar la primaria. Después de una degradación exitosa, el primario actual se convierte en un secundario y los miembros del set de réplicas eligen un nuevo primario.C3. Reiniciar el programa
mongodcomo miembro del set de réplicas
D. Repetir para las otras particiones afectadas
Una vez que termines de crear un índice para una partición, repite C. Crear índices en las particiones que contienen fragmentos de la colección para las otras particiones afectadas.
E. Reinicia el balanceador
Una vez que termines la creación de índices rodante para las particiones afectadas, reinicia el balanceador.
Conecta mongosh a una instancia mongos en el clúster particionado y ejecuta sh.startBalancer(): [3]
sh.startBalancer()
| [3] | A partir de MongoDB 6.0.3, no se realiza la división automática en fragmentos. Esto se debe a mejoras en la política de equilibrio. Los comandos de división automática aún existen, pero no realizan ninguna operación. En las versiones de MongoDB anteriores a 6.0.3, sh.startBalancer() también permite la división automática para el clúster particionado. |
Información Adicional
Una colección particionada tiene un índice inconsistente si la colección no tiene exactamente los mismos índices (incluidas las opciones de índice) en cada partición que contiene fragmentos de la colección. Aunque no deberían ocurrir índices inconsistentes durante las operaciones normales, pueden ocurrir índices inconsistentes, como por ejemplo:
Cuando un usuario está creando un índice con una restricción de clave
uniquey una partición contiene un fragmento con documentos duplicados. En tales casos, la operación de creación de índice puede tener éxito en las particiones sin duplicados, pero no en la partición con duplicados.Cuando un usuario está creando un índice en las particiones de manera continua, pero no logra compilar el índice para una partición asociada o lo compila incorrectamente con una especificación diferente.
El servidor de configuración primario comprueba periódicamente las inconsistencias de índice en los particiones de las colecciones particionadas. Para configurar estas comprobaciones periódicas, consulta enableShardedIndexConsistencyCheck y shardedIndexConsistencyCheckIntervalMS.
El comando serverStatus devuelve el campo shardedIndexConsistency para informar sobre inconsistencias en los índices cuando se ejecuta en el servidor de configuración primario.
Para verificar si una colección fragmentada tiene índices inconsistentes, consulta Buscar índices inconsistentes entre particiones.