Acerca de esta tarea
Las compilaciones de índices móviles son una alternativa a Construcciones de índice predeterminadas.
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 mediante el siguiente procedimiento, debe detener todas las escrituras en la colección durante este procedimiento.
Si no puede detener todas las escrituras en la colección durante este procedimiento, no utilice el procedimiento de esta página. En su lugar, cree su índice único en la colección emitiendo db.collection.createIndex()en el para un clúster mongos fragmentado.
Tamaño del Oplog
Asegúrese de que su registro de operaciones sea lo suficientemente grande como para permitir que la operación de indexación o reindexación se complete sin retrasarse demasiado. Consulte la documentación sobre el tamaño del registro de operaciones para obtener más información.
Las compilaciones de índice continuo reducen la resiliencia de su clúster y aumentan la duración de la compilación.
Requisitos previos
- Para construir índices únicos
Para crear índices únicos mediante el siguiente procedimiento, debe detener todas las escrituras en la colección durante la creación del índice. De lo contrario, podría obtener datos incoherentes entre los miembros del conjunto de réplicas. Si no puede detener todas las escrituras en la colección, no utilice el siguiente procedimiento para crear índices únicos.
Advertencia
Si no puede detener todas las escrituras en la colección, no utilice el siguiente procedimiento para crear índices únicos.
Antes de crear el índice, verifique que ningún documento de la colección infrinja las restricciones del índice. Si una colección está distribuida en fragmentos y uno de ellos contiene un fragmento con documentos duplicados, la operación de creación del índice puede tener éxito en los fragmentos sin duplicados, pero no en el fragmento con duplicados. Para evitar índices incoherentes en los fragmentos, puede ejecutar desde para eliminar el índice de la
db.collection.dropIndex()mongoscolección.
Procedimiento
Importante
El siguiente procedimiento para crear índices de forma continua se aplica a implementaciones de clústeres fragmentados, no a implementaciones de conjuntos de réplicas. Para conocer el procedimiento para conjuntos de réplicas, consulte "Crear una compilación de índice continua en conjuntos de réplicas".
A. Detener el balanceador
Conéctese mongosh a una instancia mongos en el clúster, y a continuación, ejecute sh.stopBalancer() para desactivar el equilibrador: [1]
sh.stopBalancer()
Nota
Si hay una migración en curso, el sistema completará la migración en curso antes de detener el balanceador.
Para verificar que el balanceador esté deshabilitado, ejecute, que devuelve falso si el balanceador está sh.getBalancerState() deshabilitado:
sh.getBalancerState()
| [1] | A partir de MongoDB,6.0.3 la división automática de fragmentos no se realiza. Esto se debe a mejoras en la política de balanceo. Los comandos de división automática aún existen, pero no realizan ninguna operación. Para obtener más información, consulte Cambios en la política de balanceo.En versiones de MongoDB anteriores 6.0.3 a, sh.stopBalancer() también deshabilita la división automática para el clúster fragmentado. |
B. Determinar la distribución de la colección
Desde mongosh conectado mongos a, actualice la tabla de enrutamiento en caché de mongos ese para evitar que se devuelva información de distribución obsoleta para la colección. Una vez actualizada, ejecute para la colección donde desea crear el db.collection.getShardDistribution() índice.
Por ejemplo, si desea 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 fragmentos. Por ejemplo, considere un clúster 3 fragmentado con shardA fragmentos, shardB y, y shardC el devuelve lo db.collection.getShardDistribution() 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 se crean los índices para test.records en shardA y shardC.
C. Crear índices en los fragmentos que contienen fragmentos de colección
Para cada fragmento que contenga fragmentos para la colección, siga el procedimiento para crear el índice en el fragmento.
C1. Detener un sistema secundario y reiniciarlo como independiente
En un fragmento afectado, detenga el proceso asociado a uno de sus secundarios. Reinicie después de realizar las siguientes actualizaciones de mongod configuración:
Si está utilizando un archivo de configuración, realice las siguientes actualizaciones de configuración:
net.portCambie a un puerto diferente. []2 Anote la configuración del puerto original como comentario.Comente la
replication.replSetNameopción.Comente la
sharding.clusterRoleopción.Establezca el parámetro
skipShardingConfigurationChecksentrueen lasetParametersección.Establezca el parámetro
disableLogicalSessionCacheRefreshentrueen lasetParametersección.
Por ejemplo, para un miembro del conjunto de réplicas de fragmentos, el archivo de configuración actualizado incluirá contenido como el 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 utiliza opciones de línea de comandos, realice las siguientes actualizaciones de configuración:
Elimine si es un
--shardsvr--configsvrmiembro del fragmento y si es un miembro del servidor de configuración.Establezca el parámetro
skipShardingConfigurationChecksentrueen la--setParameteropción.Establezca el parámetro
disableLogicalSessionCacheRefreshentrueen la--setParameteropción.
Por ejemplo, reinicie el miembro del conjunto de réplicas de fragmentos sin las --replSet --shardsvr opciones y. Especifique un nuevo número de puerto y configure skipShardingConfigurationChecks los disableLogicalSessionCacheRefresh parámetros y como verdaderos:
mongod --port 27218 --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
Otras configuraciones (por ejemplo, --dbpath, etc.) permanecen iguales.
| [2] | (,1 2) Al ejecutar en un puerto diferente, se asegura de que los demás miembros del conjunto de réplicas y todos los clientes no se comuniquen con el miembro mientras usted crea el mongod índice. |
C2. Construir el índice
Conéctese directamente a la mongod instancia que se ejecuta como independiente en el nuevo puerto y cree el nuevo índice para esta instancia.
Por ejemplo, conectemongosha la instancia y utilice el métododb.collection.createIndex()para crear un índice ascendente en el campo username de la colección records:
db.records.createIndex( { username: 1 } )
3C. Reiniciar el programa mongod como miembro del conjunto de réplicas
Al finalizar la compilación del índice, apague la instancia. Deshaga los cambios de configuración realizados al iniciarla como independiente para volver a su configuración original y mongod reiniciar.
Importante
Asegúrese de eliminar el parámetro skipShardingConfigurationChecks disableLogicalSessionCacheRefresh y el parámetro.
Por ejemplo, para reiniciar el miembro del fragmento del conjunto de réplicas:
Si estás usando un archivo de configuración:
Restaurar al número de puerto original.
Descomente
replication.replSetNameel.Descomente
sharding.clusterRoleel.Eliminar
skipShardingConfigurationChecksel parámetro en lasetParametersección.Eliminar
disableLogicalSessionCacheRefreshel parámetro en lasetParametersección.
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.
--replSetIncluya si es
--shardsvr--configsvrun miembro del fragmento o si es un miembro 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 miembro alcanza a los otros miembros del conjunto, repita el procedimiento un miembro a la vez para los miembros secundarios restantes del fragmento:
C5. Construir el índice en el primario
Cuando todos los secundarios del fragmento tengan el nuevo índice, baje el nivel del primario del fragmento, reinícielo como independiente utilizando el procedimiento descrito anteriormente y construya el índice en el primario anterior:
Utilice el
rs.stepDown()método en para reducir el principal. Tras una reducción exitosa, el principal actual se convierte en secundario y los miembros del conjunto de réplicas eligen un nuevomongoshprincipal.C1. Detener un sistema secundario y reiniciarlo como independiente
C3. Reiniciar el programa
mongodcomo miembro del conjunto de réplicas
D. Repita para los demás fragmentos afectados
Una vez que termine de crear el índice para un fragmento, repita el paso C. Cree índices en los fragmentos que contienen fragmentos de colección para los demás fragmentos afectados.
E. Reinicia el balanceador
Una vez que finalice la creación del índice móvil para los fragmentos afectados, reinicie el balanceador.
Conecte mongosh a una instancia en el clúster fragmentado mongos y sh.startBalancer() ejecute: []3
sh.startBalancer()
| [3] | A partir de MongoDB,6.0.3 la división automática de fragmentos no se realiza. Esto se debe a mejoras en la política de balanceo. Los comandos de división automática aún existen, pero no realizan ninguna operación. Para obtener más información, consulte Cambios en la política de balanceo.En versiones de MongoDB anteriores 6.0.3 a, sh.startBalancer() también habilita la división automática para el clúster fragmentado. |
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.