Utilice la fragmentación de escritura para distribuir uniformemente las cargas de trabajo entre las particiones - Amazon Keyspaces (para Apache Cassandra)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Utilice la fragmentación de escritura para distribuir uniformemente las cargas de trabajo entre las particiones

Una forma de distribuir mejor las escrituras en una partición en Amazon Keyspaces es ampliar el espacio. Esto puede hacerse de diferentes maneras. Puede añadir una columna de clave de partición adicional en la que escriba números aleatorios para distribuir las filas entre las particiones. O puede usar un número que se calcula en función de algo que esté consultando.

Fragmentación mediante claves de partición compuestas y valores aleatorios

Una estrategia para distribuir cargas de forma más uniforme en una partición consiste en añadir una columna de clave de partición adicional en la que se escriben números aleatorios. De ese modo, las escrituras se distribuyen aleatoriamente por un espacio mayor.

Por ejemplo, considere la siguiente tabla que tiene una única clave de partición que representa una fecha.

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, title text, description int, PRIMARY KEY (publish_date));

Para distribuir de forma más uniforme esta tabla entre las particiones, podría incluir una columna de clave de partición adicional shard que almacene números aleatorios. Por ejemplo:

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, shard int, title text, description int, PRIMARY KEY ((publish_date, shard)));

Al insertar datos podría elegir un número aleatorio entre 1 y 200 para la columna shard. Esto produce valores de clave de partición compuestos como (2020-07-09, 1), (2020-07-09, 2) y así sucesivamente hasta (2020-07-09, 200). Al aplicar un número aleatorio a la clave de partición, las escrituras que se producen en la tabla de cada día se distribuyen uniformemente por varias particiones. Como resultado, se mejora el paralelismo y el rendimiento general.

Sin embargo, para leer todas las filas de un día determinado, tendría que consultar las filas de todas las particiones y luego fusionar los resultados. Por ejemplo, primero emitiría una instrucción SELECT para el valor de la clave de partición (2020-07-09, 1). A continuación, emitiría otra instrucción SELECT para (2020-07-09, 2) y así sucesivamente hasta (2020-07-09, 200). Por último, su aplicación tendría que fusionar los resultados de todas esas instrucciones SELECT.

Partición mediante claves de partición compuestas y valores aleatorios

Aplicar una estrategia de aleatorización puede mejorar considerablemente el rendimiento de la escritura. Pero resulta difícil leer una fila en concreto porque no sabe qué valor se escribió en la columna shard al escribirse la fila. Para facilitar la lectura de filas individuales, puede utilizar una estrategia diferente. En vez de utilizar un número aleatorio para distribuir las filas entre las particiones, utilice un número que pueda calcular basándose en algo que desee consultar.

Consideremos el ejemplo anterior, en el que una tabla utiliza la fecha de hoy en la clave de partición. Supongamos ahora que cada fila tiene una columna title accesible y que lo más frecuente es que necesite encontrar filas por título además de por fecha. Antes de que su aplicación escriba la fila en la tabla, podría calcular un valor hash basado en el título y utilizarlo para rellenar la columna shard. El cálculo podría generar un número comprendido entre 1 y 200 que esté bastante bien distribuido, igual que el que se genera con la estrategia aleatoria.

Probablemente bastaría con un cálculo sencillo, como el producto de los valores de punto de código UTF-8 de los caracteres del título, módulo 200, + 1. El valor de la clave de partición compuesta sería entonces la combinación de la fecha y el resultado del cálculo.

Con esta estrategia, las escrituras se distribuyen de manera uniforme entre los valores de clave de partición y, por lo tanto, entre las particiones físicas. Puede realizar fácilmente una instrucción SELECT para una fila y una fecha en concreto porque puede calcular el valor de clave de partición para un valor title específico.

Para leer todas las filas de un día determinado, aún debe SELECT cada una de las claves (2020-07-09, N) (donde N es de 1 a 200), y su aplicación tiene entonces que fusionar todos los resultados. El beneficio es que evitaría que un único valor de clave de partición "caliente" acaparase toda la carga de trabajo.