Administración de índices secundarios globales - Amazon DynamoDB

Administración de índices secundarios globales

En esta sección se describe cómo crear, modificar y eliminar índices secundarios globales en Amazon DynamoDB.

Creación de una tabla con índices secundarios globales

Para crear una tabla con uno o varios índices secundarios globales, use la operación CreateTable con el parámetro GlobalSecondaryIndexes. Para disfrutar de la máxima flexibilidad en las consultas, puede crear hasta 20 índices secundarios globales (cuota predeterminada) por tabla.

Debe especificar un atributo que actúe como clave de partición del índice. También tiene la opción de especificar otro atributo para la clave de ordenación del índice. No es necesario que ninguno de estos atributos de clave sea igual que un atributo de clave de la tabla. Por ejemplo, en la tabla GameScores (consulte Uso de índices secundarios globales en DynamoDB), ni TopScore ni TopScoreDateTime son atributos de clave. Puede crear un índice secundario global que tenga una clave de partición de TopScore y una clave de ordenación de TopScoreDateTime. Se podría usar un índice de este tipo para determinar si existe una correlación entre las mejores puntuaciones y la hora del día a la que se juega.

Todos los atributos de clave del índice deben ser escalares y pueden ser de tipo String, Number o Binary. No pueden ser documentos ni conjuntos. Puede proyectar atributos de cualquier tipo de datos en un índice secundario global. Esto incluye escalares, documentos y conjuntos. Para obtener una lista completa de los tipos de datos, consulte Tipos de datos.

Si usa el modo aprovisionado, debe proporcionar para el índice los ajustes de ProvisionedThroughput, que constan de ReadCapacityUnits y WriteCapacityUnits. Estos ajustes de rendimiento aprovisionado son independientes de los de la tabla pero se comportan de forma parecida. Para obtener más información, consulte Consideraciones sobre el rendimiento aprovisionado para los índices secundarios globales.

Los índices secundarios globales heredan el modo de capacidad de lectura/escritura de la tabla base. Para obtener más información, consulte Aspectos a tener en cuenta al cambiar los modos de capacidad.

nota

Las operaciones de reposición y de escritura en curso comparten el rendimiento de escritura dentro del índice secundario global. Al crear un nuevo índice secundario global, resulta importante verificar si la elección de clave de partición produce una distribución desigual o restringida de datos o tráfico entre los valores de clave de partición del nuevo índice. Si esto ocurre, podría ver operaciones de reposición y escritura que se producen al mismo tiempo y que se limiten las escrituras en la tabla base. El servicio adopta medidas para minimizar el potencial de este escenario, pero no tiene información de la forma de los datos del cliente con respecto a la clave de partición de índice, la proyección elegida o la escasez de la clave principal del índice.

Si sospecha que el nuevo índice secundario global puede tener datos estrechos o sesgados, o bien una distribución del tráfico entre los valores clave de partición, tenga en cuenta lo siguiente antes de agregar nuevos índices a tablas importantes desde el punto de vista operativo.

  • Es posible que sea más seguro agregar el índice en un momento en que la aplicación esté generando la menor cantidad de tráfico.

  • Considere la posibilidad de habilitar CloudWatch Contributor Insights en la tabla base y los índices. Esto le proporcionará información valiosa sobre la distribución del tráfico.

  • Para tablas base del modo de capacidad aprovisionada e índices, establezca la capacidad de escritura aprovisionada del nuevo índice en al menos el doble de la de la tabla base. Vea las métricas de WriteThrottleEvents, ThrottledRequests, OnlineIndexPercentageProgress, OnlineIndexConsumedWriteCapacity y OnlineIndexThrottleEvents de CloudWatch durante todo el proceso. Ajuste la capacidad de escritura aprovisionada según sea necesario para completar la reposición en un tiempo razonable sin ningún efecto de limitación significativo en las operaciones en curso.

  • Prepárese para cancelar la creación del índice si experimenta un impacto operativo debido a la limitación de escritura y el aumento de la capacidad de escritura aprovisionada en el nuevo índice secundario global no lo resuelve.

Descripción de los índices secundarios globales en una tabla

Para ver el estado de todos los índices secundarios globales de una tabla, se usa la operación DescribeTable. La parte GlobalSecondaryIndexes de la respuesta enumera todos los índices de la tabla, junto con el estado actual de cada uno de ellos (IndexStatus).

El IndexStatus para un índice secundario global será uno de los siguientes:

  • CREATING: el índice está en proceso de creación y aún no está disponible para usarlo.

  • ACTIVE: el índice está listo para usarlo y las aplicaciones pueden realizar operaciones Query en él.

  • UPDATING: se están cambiando los ajustes de desempeño provisionado del índice.

  • DELETING: el índice se está eliminando y ya no se puede utilizar.

Cuando DynamoDB ha terminado de crear un índice secundario global, el estado de este último cambia de CREATING a ACTIVE.

Adición de un índice secundario global a una tabla existente

Para agregar un índice secundario global a una tabla existente, se usa la operación UpdateTable con el parámetro GlobalSecondaryIndexUpdates. Debe proporcionar lo siguiente:

  • El nombre del índice. Este nombre debe ser único entre todos los índices de la tabla.

  • El esquema de claves del índice. Debe especificar un atributo para la clave de partición del índice y, si lo desea, otro atributo para la clave de ordenación del índice. No es necesario que ninguno de estos atributos de clave sea igual que un atributo de clave de la tabla. Los tipos de datos de cada atributo del esquema deben ser escalares: String, Number o Binary.

  • Los atributos de la tabla que se van a proyectar en el índice:

    • KEYS_ONLY: cada elemento del índice consta únicamente de los valores de la clave de partición y la clave de ordenación de la tabla, así como de los valores de las claves del índice.

    • INCLUDE: además de los atributos que se describen en KEYS_ONLY, el índice secundario incluye otros atributos sin clave que se especifiquen.

    • ALL: el índice incluye todos los atributos de la tabla de origen.

  • Los ajustes de rendimiento aprovisionado del índice, que constan de ReadCapacityUnitsWriteCapacityUnits. Estos ajustes de rendimiento aprovisionado son independientes de los de la tabla.

Solo puede crear un índice secundario global por operación UpdateTable.

Fases de creación del índice

Cuando se agrega un nuevo índice secundario global a una tabla existente, la tabla sigue estando disponible mientras se crea el índice. Sin embargo, el nuevo índice no estará disponible para las operaciones de consulta hasta que el estado cambie de CREATING a ACTIVE.

nota

La creación de índices secundarios globales no utiliza Application Auto Scaling. El aumento de la capacidad de MIN de Application Auto Scaling no disminuirá el tiempo de creación del índice secundario global.

En segundo plano, DynamoDB crea el índice en dos fases:

Asignación de recursos

DynamoDB asigna los recursos informáticos y de almacenamiento que se necesitan para crear el índice.

Durante la fase de asignación de recursos, el valor del atributo IndexStatus es CREATING y el valor del atributo Backfilling es false. Use la operación DescribeTable para recuperar el estado de una tabla y todos sus índices secundarios.

Mientras el índice se encuentra en la fase de asignación de recursos, no se puede eliminar el índice ni eliminar su tabla principal. Tampoco se puede modificar el rendimiento aprovisionado del índice ni de la tabla. No se pueden agregar ni eliminar otros índices de la tabla. Sin embargo, se puede modificar el rendimiento aprovisionado de estos otros índices.

Reposición

Para cada elemento de la tabla, DynamoDB determina el conjunto de atributos que se escribirá en el índice según su proyección (KEYS_ONLY, INCLUDE o ALL). A continuación, escribe estos atributos en el índice. Durante la fase de reposición, DynamoDB lleva un seguimiento de los elementos que se agregan, eliminan o actualizan en la tabla. Los atributos de estos elementos también se agregan, eliminan o actualizan en el índice, según proceda.

Durante la fase de reposición, el atributo IndexStatus está establecido en CREATING y el atributo Backfilling está establecido en true. Use la operación DescribeTable para recuperar el estado de una tabla y todos sus índices secundarios.

Mientras el índice se encuentra en la fase de reposición, no se puede eliminar su tabla principal. Sin embargo, sí se puede eliminar el índice o modificar el rendimiento aprovisionado de la tabla y de cualquiera de sus índices secundarios globales.

nota

Durante la fase de reposición, algunas escrituras de elementos infractores podrían realizarse correctamente y otras se rechazarán. Después de la reposición, se rechazarán todas las escrituras en elementos que infrinjan el esquema de claves del nuevo índice. Recomendamos ejecutar la herramienta Violation Detector una vez que haya finalizado la fase de reposición para detectar y resolver cualquier infracción de clave que pueda haberse producido. Para obtener más información, consulte Detección y corrección de infracciones de la clave del índice.

Mientras las fases de asignación de recursos y reposición están en curso, el índice se encuentra en el estado CREATING. Durante este plazo de tiempo, DynamoDB realiza operaciones de lectura en al tabla. No se le cobrará por las operaciones de lectura de la tabla base para rellenar el índice secundario global. Sin embargo, se le cobran las operaciones de escritura para rellenar el índice secundario global recién creado.

Una vez que se completa la creación del índice, su estado cambia a ACTIVE. No puede Query ni Scan el índice hasta que esté ACTIVE.

nota

En algunos casos, DynamoDB no puede escribir datos de la tabla en el índice porque se producen infracciones en las claves del índice. Esto puede ocurrir si:

  • El tipo de dato de un valor de atributo no coincide con el del esquema de claves de índice.

  • El tamaño de un atributo supera la longitud máxima de un atributo de clave del índice.

  • Un atributo de clave del índice tiene un valor binario o de cadena vacío.

Las infracciones de claves del índice no interfieren con la creación de un índice secundario global. Sin embargo, cuando el índice adquiera el estado ACTIVE, las claves infractoras no estarán presentes en él.

DynamoDB proporciona una herramienta independiente para encontrar y resolver estos problemas. Para obtener más información, consulte Detección y corrección de infracciones de la clave del índice.

Adición de un índice secundario global a una tabla grande

El tiempo necesario para crear un índice secundario global depende de varios factores, como los siguientes:

  • El tamaño de la tabla.

  • El número de elementos de la tabla que son aptos para incluirlos en el índice.

  • El número de atributos que se proyectan en el índice.

  • La capacidad de escritura aprovisionada del índice.

  • La actividad de escritura en la tabla principal mientras se crean los índices.

Si se va a agregar un índice secundario global a una tabla muy grande, el proceso de creación puede tardar mucho tiempo en completarse. Para monitorear el progreso y determinar si el índice tiene suficiente capacidad de escritura, consulte las siguientes métricas de Amazon CloudWatch:

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

nota

Para obtener más información acerca de cómo las métricas de CloudWatch se relacionan con DynamoDB, consulte Métricas de DynamoDB.

Si el ajuste de rendimiento de escritura aprovisionado del índice es demasiado bajo, la creación del índice tardará más en completarse. Para reducir el tiempo que se tarda en crear un nuevo índice secundario global, puede aumentar temporalmente su capacidad de escritura aprovisionada.

nota

Por regla general, recomendamos establecer la capacidad de escritura aprovisionada del índice en 1,5 veces la capacidad de escritura de la tabla. Este ajuste es adecuado en muchos casos de uso. No obstante, puede que sus requisitos reales sean superiores o inferiores.

Mientras el índice está en la fase de reposición, DynamoDB utiliza la capacidad interna del sistema para leer la tabla. Esto permite minimizar el impacto de la creación del índice y asegurarse de que no se agote la capacidad de lectura de la tabla.

Sin embargo, es posible que el volumen de una actividad de escritura entrante supere la capacidad de lectura aprovisionada del índice. En este caso, se produciría un cuello de botella y la creación del índice tardaría más porque la actividad de escritura en el índice sería objeto de una limitación controlada. Mientras se crea el índice, recomendamos monitorear las métricas de Amazon CloudWatch del índice para determinar si su capacidad de escritura consumida es superior a la aprovisionada. Si se produce un cuello de botella, debe aumentar la capacidad de escritura aprovisionada en el índice para evitar que se imponga la limitación controlada a las escrituras durante la fase de reposición.

Una vez que se haya creado el índice, conviene establecer su capacidad de escritura aprovisionada de modo que refleje el uso normal de la aplicación.

Eliminación de un índice secundario global

Si ya no necesita un índice secundario global, puede eliminarlo mediante la ooperación UpdateTable.

Solo se puede eliminar un índice secundario global por operación UpdateTable.

Mientras se elimina el índice secundario global, no afecta en absoluto a la actividad de lectura o escritura en la tabla principal. Mientras la eliminación está en curso, puede modificar el rendimiento aprovisionado de los demás índices.

nota
  • Al eliminar una tabla mediante la acción DeleteTable, todos los índices secundarios globales de esa tabla se eliminan también.

  • No se cargará en su cuenta la operación de eliminación del índice secundario global.

Modificación de un índice secundario global durante la creación

Mientras se está creando un índice, puede usar la operación DescribeTable para determinar en qué fase se encuentra. La descripción del índice incluye un atributo de tipo Boolean, Backfilling, que indica si DynamoDB está cargando elementos de la tabla en el índice en un momento dado. Si Backfilling es true, significa que la fase de asignación de recursos se ha completado y el índice se encuentra en la fase de reposición.

Mientras que la reposición está en curso, puede actualizar los parámetros de rendimiento aprovisionado del índice. Puede optar por esta opción para agilizar la creación del índice: puede aumentar la capacidad de escritura del índice mientras se crea y reducirla después. Para modificar los ajustes de rendimiento aprovisionado del índice, utilice la operación UpdateTable. El estado del índice cambia a UPDATING y el valor de Backfilling es true hasta que el índice esté listo para usarlo.

Durante la fase de reposición, puede eliminar el índice que se está creando. Durante esta fase, no se pueden agregar ni eliminar otros índices de la tabla.

nota

En el caso de los índices que se han creado como parte de una operación CreateTable, el atributo Backfilling no aparece en el resultado de DescribeTable. Para obtener más información, consulte Fases de creación del índice.