La capacidad y disponibilidad totales de un clúster de DAX dependen del tipo y el número de nodos. Más nodos en el clúster aumentan su capacidad de lectura, pero no la capacidad de escritura. Los tipos de nodos más grandes (hasta r5.8xlarge) pueden gestionar más escrituras, pero tener muy pocos nodos puede afectar a la disponibilidad si se produce un error en el nodo. Para obtener más información acerca del dimensionamiento de su clúster de DAX, consulte Guía de tamaño del clúster de DAX.
En las siguientes secciones, se analizan los diferentes aspectos del dimensionamiento que se deben tener en cuenta para equilibrar el tipo y la cantidad de nodos a fin de crear un clúster escalable y rentable.
En esta sección
Planificación de la disponibilidad
Al dimensionar un clúster de DAX, primero debe centrarse en la disponibilidad prevista. La disponibilidad de un servicio en clúster, como DAX, es una dimensión del número total de nodos del clúster. Dado que un clúster de un solo nodo no tiene tolerancia a errores, su disponibilidad es la misma que la de un nodo. En un clúster de 10 nodos, la pérdida de un solo nodo tiene una repercusión mínima en la capacidad general del clúster. Esta pérdida no afecta directamente a la disponibilidad, ya que los nodos restantes pueden satisfacer las solicitudes de lectura. Para reanudar las escrituras, DAX nombra rápidamente un nuevo nodo principal.
DAX está basado en VPC. Utiliza un grupo de subredes para determinar en qué zonas de disponibilidad
Planificación del rendimiento de escritura
Todos los clústeres de DAX tienen un nodo principal para las solicitudes de escritura indirecta. El tamaño del tipo de nodo del clúster determina su capacidad de escritura. Agregar réplicas de lectura adicionales no aumenta la capacidad de escritura del clúster. Por lo tanto, debe tener en cuenta la capacidad de escritura durante la creación del clúster, ya que no podrá cambiar el tipo de nodo más adelante.
Si su aplicación necesita escribir de forma indirecta en DAX para actualizar la caché de elementos, considere la posibilidad de aumentar el uso de los recursos del clúster para facilitar la escritura. Las escrituras en DAX consumen aproximadamente 25 veces más recursos que las lecturas de aciertos de caché. Esto puede requerir un tipo de nodo más grande que el de los clústeres de solo lectura.
Para obtener información adicional sobre cómo determinar si la escritura indirecta o la escritura directa funcionan mejor para su aplicación, consulte Estrategias de escritura.
Planificación del rendimiento de lectura
La capacidad de lectura de un clúster de DAX depende de la proporción de aciertos de caché de la carga de trabajo. Dado que DAX lee los datos de DynamoDB cuando se produce un error de caché, consume aproximadamente 10 veces más recursos del clúster que un acierto de caché. Para aumentar los aciertos de caché, aumente la configuración de TTL de la caché para definir el periodo durante el que se almacena un elemento en la caché. Sin embargo, una mayor duración de TTL aumenta la probabilidad de leer versiones anteriores de los elementos, a menos que las actualizaciones se escriban de forma indirecta en DAX.
Para asegurarse de que el clúster tiene una capacidad de lectura suficiente, escale el clúster horizontalmente como se indica en Escalado horizontal de un clúster. Al agregar más nodos, se agregan réplicas de lectura al conjunto de recursos, mientras que al eliminar nodos se reduce la capacidad de lectura. Al seleccionar la cantidad de nodos y sus tamaños para un clúster, tenga en cuenta la cantidad mínima y máxima de capacidad de lectura necesaria. Si no puede escalar horizontalmente un clúster con tipos de nodos más pequeños para satisfacer sus requisitos de lectura, use un tipo de nodo más grande.
Planificación del tamaño del conjunto de datos
Cada tipo de nodo disponible tiene un tamaño de memoria establecido para que DAX almacene los datos en caché. Si un tipo de nodo es demasiado pequeño, el conjunto de datos de trabajo que solicita una aplicación no cabrá en la memoria y provocará errores de caché. Como los nodos más grandes admiten cachés más grandes, utilice un tipo de nodo mayor que el conjunto de datos estimado que necesita almacenar en caché. Una caché más grande también mejora la tasa de aciertos de caché.
Es posible que obtenga un rendimiento menor si guarda elementos en caché con pocas lecturas repetidas. Calcule el tamaño de la memoria de los elementos a los que se accede con frecuencia y asegúrese de que la caché sea lo suficientemente grande como para almacenar ese conjunto de datos.
Cálculo de los requisitos aproximados de capacidad del clúster
Puede calcular las necesidades de capacidad total de su carga de trabajo para ayudarle a seleccionar el tamaño y la cantidad adecuados de nodos del clúster. Para realizar esta estimación, calcule la variable solicitud normalizada por segundo (RPS normalizado). Esta variable representa el total de unidades de trabajo que la aplicación necesita que admita el clúster de DAX, incluidos los aciertos de caché, los errores de caché y las escrituras. Para calcular el RPS normalizado, utilice los siguientes datos:
-
ReadRPS_CacheHit
: especifica el número de lecturas por segundo que provocan un acierto de caché. -
ReadRPS_CacheMiss
: especifica el número de lecturas por segundo que provocan un error de caché. -
WriteRPS
: especifica el número de escrituras por segundo que se realizarán de forma indirecta en DAX. -
DaxNodeCount
: especifica el número de nodos del clúster de DAX. -
Size
: especifica el tamaño del elemento que se va a escribir o leer en KB redondeado al KB más cercano. -
10x_ReadMissFactor
: representa un valor de 10. Cuando se produce un error de caché, DAX utiliza aproximadamente 10 veces más recursos que los aciertos de caché. -
25x_WriteFactor
: representa un valor de 25 porque una escritura indirecta de DAX utiliza aproximadamente 25 veces más recursos que los aciertos de caché.
Con la siguiente fórmula, puede calcular el RPS normalizado.
Normalized RPS = (ReadRPS_CacheHit * Size) + (ReadRPS_CacheMiss * Size * 10x_ReadMissFactor) + (WriteRequestRate * 25x_WriteFactor * Size * DaxNodeCount)
Por ejemplo, observe los siguientes valores de entrada:
-
ReadRPS_CacheHit
= 50 000 -
ReadRPS_CacheMiss
= 1000 -
ReadMissFactor
= 1 -
Size
= 2 KB -
WriteRPS
= 100 -
WriteFactor
= 1 -
DaxNodeCount
= 3
Si sustituye estos valores en la fórmula, puede calcular el RPS normalizado de la siguiente manera.
Normalized RPS = (50,000 Cache Hits/Sec * 2KB) + (1,000 Cache Misses/Sec * 2KB * 10) + (100 Writes/Sec * 25 * 2KB * 3)
En este ejemplo, el valor calculado del RPS normalizado es 135 000. Sin embargo, este valor de RPS normalizado no tiene en cuenta el mantenimiento del uso del clúster por debajo del 100 % ni los errores de nodos. Le recomendamos que agregue capacidad adicional. Para ello, determine el mayor de los dos factores multiplicadores: el objetivo de utilización o la tolerancia a los errores de nodos. A continuación, multiplique el RPS normalizado por el factor mayor para obtener un objetivo de solicitudes por segundo (RPS objetivo).
-
Objetivo de utilización
Dado que la repercusión en el rendimiento aumenta los errores de caché, no recomendamos ejecutar el clúster de DAX con un uso del 100 %. Lo ideal es mantener la utilización del clúster en un 70 % o por debajo de ese porcentaje. Para lograrlo, multiplique el RPS normalizado por 1,43.
-
Tolerancia a errores de nodos
Si un nodo falla, la aplicación debe poder distribuir sus solicitudes entre los nodos restantes. Para asegurarse de que los nodos se mantengan por debajo del 100 % de utilización, elija un tipo de nodo lo suficientemente grande como para absorber el tráfico adicional hasta que el nodo que ha fallado vuelva a estar en línea. En el caso de un clúster con menos nodos, cada nodo debe tolerar mayores aumentos de tráfico cuando se produce un error en uno de ellos.
En el caso de que falle el nodo principal, DAX realiza automáticamente una conmutación por error a una réplica de lectura y la designa como nuevo nodo principal. Si falla un nodo de réplica, otros nodos del clúster de DAX pueden seguir atendiendo las solicitudes hasta que se consigue recuperar el nodo que ha fallado.
Por ejemplo, un clúster de DAX de 3 nodos con un nodo fallido requiere un 50 % adicional de capacidad en los dos nodos restantes. Esto requiere un factor multiplicador de 1,5. Por el contrario, un clúster de 11 nodos con un nodo fallido requiere un 10 % de capacidad adicional en los nodos restantes o un factor de multiplicación de 1,1.
Con la siguiente fórmula, puede calcular el objetivo de RPS.
Target RPS = Normalized RPS * CEILING(TargetUtilization, NodeLossTolerance)
Por ejemplo, para calcular el objetivo de RPS, tenga en cuenta los siguientes valores:
-
Normalized RPS
= 135 000 -
TargetUtilization
= 1,43Como nuestro objetivo es una utilización máxima de los clústeres del 70 %, hemos configurado
TargetUtilization
en 1,43. -
NodeLossTolerance
= 1,5Supongamos que estamos usando un clúster de 3 nodos, por lo tanto, hemos configurado
NodeLossTolerance
en una capacidad del 50 %.
Si sustituye estos valores en la fórmula, puede calcular el objetivo de RPS de la siguiente manera.
Target RPS = 135,000 * CEILING(1.43, 1.5)
En este ejemplo, dado que el valor de NodeLossTolerance
es mayor que TargetUtilization
, calculamos el valor del objetivo de RPS con NodeLossTolerance
. Esto nos da un objetivo de RPS de 202 500, que es la cantidad total de capacidad que debe admitir el clúster de DAX. Para determinar la cantidad de nodos que necesitará en un clúster, asigne el objetivo de RPS a una columna adecuada de la siguiente tabla. Para este ejemplo de un objetivo de RPS de 202 500, necesitará el tipo de nodo dax.r5.large con tres nodos.
Estimación de la capacidad de rendimiento del clúster por tipo de nodo
Con la Target RPS formula, puede calcular la capacidad del clúster para diferentes tipos de nodos. En la siguiente tabla, se muestran las capacidades aproximadas de los clústeres con 1, 3, 5 y 11 tipos de nodos. Estas capacidades no sustituyen la necesidad de realizar pruebas de carga de DAX con sus propios patrones de solicitudes y datos. Además, estas capacidades no incluyen las instancias de tipo t, porque no tienen capacidad de CPU fija. La unidad de todos los valores de la siguiente tabla es el RPS normalizado.
Tipo de nodo (memoria) | 1 nodo | 3 nodos | 5 nodos | 11 nodos |
---|---|---|---|---|
dax.r5.24xlarge (768 GB) | 1M | 3 millones | 5 millones | 11 millones |
dax.r5.16xlarge (512 GB) | 1M | 3 millones | 5 millones | 11 millones |
dax.r5.12xlarge (384 GB) | 1M | 3 millones | 5 millones | 11 millones |
dax.r5.8xlarge (256 GB) | 1M | 3 millones | 5 millones | 11 millones |
dax.r5.4xlarge (128 GB) | 600 000 | 1,8 millones | 3 millones | 6,6 millones |
dax.r5.2xlarge (64 GB) | 300 000 | 900 000 | 1,5 millones | 3,3 millones |
dax.r5.xlarge (32 GB) | 150 000 | 450 000 | 750 000 | 1,65 millones |
dax.r5.large (16 GB) | 75 000 | 225 000 | 375 000 | 825 000 |
Debido al límite máximo de 1 millón de NPS (operaciones de red por segundo) de cada nodo, los nodos de tipo dax.r5.8xlarge o superiores no aportan capacidad de clúster adicional. Es posible que los tipos de nodos más grandes que 8xlarge no contribuyan a la capacidad de rendimiento total del clúster. Sin embargo, estos tipos de nodos pueden resultar útiles para almacenar un conjunto de datos de trabajo más grande en la memoria.
Escalado de la capacidad de escritura en los clústeres de DAX
Cada escritura en DAX consume 25 solicitudes normalizadas en cada nodo. Como hay un límite de 1 millón de RPS para cada nodo, un clúster de DAX está limitado a 40 000 escrituras por segundo, sin tener en cuenta el uso de lectura.
Si su caso de uso requiere más de 40 000 escrituras por segundo en la caché, debe utilizar clústeres de DAX independientes y particionar las escrituras entre ellos. Al igual que en DynamoDB, puede aplicar un hash a la clave de partición de los datos que va a escribir en la caché. A continuación, utilice el módulo para determinar en qué partición escribir los datos.
En el siguiente ejemplo, se calcula el hash de una cadena de entrada. A continuación, se calcula el módulo del valor hash con 10.
def hash_modulo(input_string): # Compute the hash of the input string hash_value = hash(input_string) # Compute the modulus of the hash value with 10 bucket_number = hash_value % 10 return bucket_number #Example usage if _name_ == "_main_": input_string = input("Enter a string: ") result = hash_modulo(input_string) print(f"The hash modulo 10 of '{input_string}' is: {result}.")