Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Compilaciones

Los índices móviles se basan en clústeres fragmentados

La creación de índices puede afectar el rendimiento de los clústeres fragmentados. De forma predeterminada, MongoDB crea índices simultáneamente en todos los miembros del conjunto de réplicas que contienen datos. La creación de índices en clústeres fragmentados solo se realiza en los fragmentos que contienen datos de la colección que se indexa. Para cargas de trabajo que no toleran una disminución del rendimiento debido a la creación de índices, considere usar el siguiente procedimiento para crear índices de forma continua.

Las creaciones de índices continuas sacan como máximo a un nodo del set de réplicas de partición a la vez, comenzando por los nodos secundarios, y compilan el índice en ese nodo como autónomo. Las creaciones de índices continuas requerirán al menos una elección de set de réplicas por partición.

Nota

Para obtener información sobre cómo crear índices en Atlas, consulta la página de gestión de índices en la documentación de Atlas.

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 para un clúster mongos fragmentado.

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.

Para construir índices únicos
  1. 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 puede detener todas las escrituras en la colección, no utilice el siguiente procedimiento para crear índices únicos.

  2. 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 un mongos para descartar el índice de la colección.

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 "Creación continua de índices en conjuntos de réplicas".

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 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 4.2, también deshabilita la división automática para el clústersh.stopBalancer() fragmentado.

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 fragmentos. Por ejemplo, considere un clúster fragmentado con 3 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 compilas los índices para test.records en shardA y shardC.

Para cada fragmento que contenga fragmentos para la colección, siga el procedimiento para crear el índice en el fragmento.

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:

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 usas opciones de línea de comando, realiza las siguientes actualizaciones de configuració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.

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 } )

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úrate de remover el parámetro skipShardingConfigurationChecks y el parámetro disableLogicalSessionCacheRefresh.

Por ejemplo, para reiniciar el miembro del fragmento del conjunto de réplicas:

Si estás usando un archivo de configuració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:

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.

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:

  1. C1. Detener un sistema secundario y reiniciarlo como independiente

  2. C2. Construir el índice

  3. C3. Reiniciar el programa mongod como miembro del set de réplicas

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:

  1. 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 nuevo mongosh principal.

  2. C1. Detener un sistema secundario y reiniciarlo como independiente

  3. C2. Construir el índice

  4. C3. Reiniciar el programa mongod como miembro del set de réplicas

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.

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 4.2, sh.startBalancer() también permite la división automática para el clúster fragmentado.

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 unique y 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.

Volver

Crear en Set de réplicas

En esta página