Acerca de esta tarea
Las creaciones de índices continuos son una alternativa a creaciones de índices por defecto.
Solamente usa una creación continua de índices si tu implementación cumple con uno de los siguientes casos:
Si tu utilización promedio de la CPU excede (N-1)/N-10% donde N es el número de hilos de CPU disponibles para mongod
Si el índice de ocupación de tu caché WiredTiger supera regularmente el 90%
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.
Nota
Si tu implementación no cumple con estos criterios, usa la creación de índices por defecto.
Tip
Con Atlas, puedes escalar temporalmente tu clúster para cumplir con los requisitos de una creación de índices tradicional. Sin embargo, Atlas cobra por escalar tu clúster. Consulte Costos de configuración de clúster para obtener más información.
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() en el primario de un set de réplicas.
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, puede terminar con datos inconsistentes entre los miembros del set de réplicas.
Advertencia
Si no puedes detener todas las escrituras en la colección, no utilices el siguiente procedimiento para crear índices únicos.
Procedimiento
Importante
El siguiente procedimiento para crear índices de manera progresiva se aplica a implementaciones de sets de réplicas, y no a clústeres. Para el procedimiento de clústeres fragmentados, consulte Crear una creación de índices integrada en clústeres fragmentados.
1. Ocultar y reiniciar un secundario.
Ejecute los siguientes comandos en su nodo primario para ocultar el secundario que compilará el nuevo índice.
En este ejemplo, el secundario que compilará el nuevo índice es el tercer nodo en cfg.members.
var cfg = rs.conf(); // Record originalPriority so that you can reset it later. var originalPriority = cfg.members[2].priority; cfg.members[2].priority = 0; cfg.members[2].hidden = 1; rs.reconfig(cfg);
2. Deten un secundario y reinícialo como autónomo.
Detener el proceso mongod asociado a un secundario. Reinicia después de hacer las siguientes actualizaciones de configuración:
Si está utilizando un archivo de configuración, realice las siguientes actualizaciones de configuración:
Comenta la opción
replication.replSetName.Cambia el
net.porta un puerto diferente. [1] Tome nota de la configuración de puerto original como comentario.Establece el parámetro
disableLogicalSessionCacheRefreshentrueen la secciónsetParameter.
Por ejemplo, el archivo de configuración actualizado para un set de réplicas incluirá contenido como el siguiente ejemplo:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27217 # port: 27017 #replication: # replSetName: myRepl setParameter: disableLogicalSessionCacheRefresh: true
Otras configuraciones (por ejemplo, storage.dbPath, etc.) permanecen iguales.
Y reinicia:
mongod --config <path/To/ConfigFile>
Si usas opciones de línea de comando, realiza las siguientes actualizaciones de configuración:
Remover
--replSet.Configura el parámetro
disableLogicalSessionCacheRefreshatrueen la opción--setParameter.
Por ejemplo, si tu set de réplicas normalmente se ejecuta en el puerto por defecto de 27017 y la opción --replSet, deberías especificar un puerto diferente, omitir la opción --replSet y configurar el parámetro disableLogicalSessionCacheRefresh en verdadero:
mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true
Otras configuraciones (por ejemplo, --dbpath, etc.) permanecen iguales.
| [1] | (1, 2) Al ejecutar el mongod en un puerto diferente, aseguras que los demás nodos del set de réplicas y todos los clientes no contactarán con el nodo mientras construyes el índice. |
3. Compila 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 usa el createIndex() para crear un índice ascendente en el campo username de la colección records:
db.records.createIndex( { username: 1 } )
4. Reinicie el programa mongod como miembro del Set de réplicas.
Cuando se complete la creación de índices, apaga la instancia de mongod. Para devolver el nodo a su configuración original, deshaz los cambios de configuración que realizaste cuando iniciaste el nodo como autónomo. Luego, reinicia el nodo como miembro del set de réplicas.
Importante
Asegúrese de remover el parámetro disableLogicalSessionCacheRefresh.
Por ejemplo, para reiniciar el miembro de tu set de réplicas:
Si estás usando un archivo de configuración:
Restaurar al número de puerto original.
Descomenta el
replication.replSetName.Remover el parámetro
disableLogicalSessionCacheRefreshen la secciónsetParameter.
Por ejemplo:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27017 replication: replSetName: myRepl
Otras configuraciones (por ejemplo, storage.dbPath, etc.) permanecen iguales.
Y reinicia:
mongod --config <path/To/ConfigFile>
Importante
Permitir que la replicación se ponga al día en este nodo antes de comenzar el siguiente paso.
5. Desocultar el secundario.
Ejecute el siguiente comando en su primario para desocultar el secundario que compiló el índice. En este ejemplo, el nodo secundario que construyó el índice es el tercer nodo en cfg.members.
var cfg = rs.conf(); cfg.members[2].priority = originalPriority; cfg.members[2].hidden = false; rs.reconfig(cfg);
6. Repite el procedimiento para los secundarios restantes.
Una vez que el nodo se ponga al día con los demás nodos del conjunto, repite el procedimiento un nodo a la vez para los nodos secundarios restantes:
7. Crear el índice en el primario.
Cuando todos los secundarios tengan el nuevo índice, desciende el primario, reinícialo como autónomo utilizando el procedimiento descrito anteriormente y construye el índice en el antiguo 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.Reinicie el programa mongod como miembro de tu set de réplicas.