Escalamiento

El escalamiento de un clúster es el proceso de agregarle o quitarle nodos en respuesta a los cambios en su carga de trabajo o en las necesidades de almacenamiento de datos. Puede ser útil escalar tu clúster de Bigtable en función de métricas como el uso de CPU del clúster. Por ejemplo, si tu clúster tiene una carga pesada y su uso de CPU es alto, puedes agregar nodos al clúster hasta que el uso de CPU disminuya. Además, para ahorrar dinero, puedes quitar nodos del clúster cuando no se use con cargas pesadas.

Opciones de escalamiento

Puedes escalar un clúster de Bigtable de las siguientes maneras:

En la mayoría de los casos, si deseas usar el ajuste de escala automático, debes usar la función integrada de ajuste de escala automático de Bigtable. Cuando habilitas esta función, Bigtable supervisa de forma continua el clúster y ajusta de manera automática la cantidad de nodos según la configuración.

Limitaciones

Antes de habilitar el ajuste de escala automático o configurar el escalamiento programático para tu clúster de Bigtable, ten en cuenta las siguientes limitaciones.

Disponibilidad de nodos

Las cuotas de nodos se aplican si un clúster tiene asignada de forma manual o el ajuste de escala automático habilitado. Consulta Cuotas y disponibilidad de nodos para obtener más detalles.

Retraso mientras los nodos se rebalancean

Después de agregar nodos a un clúster, pueden pasar hasta 20 minutos con carga para que veas una mejora notoria en el rendimiento. Como resultado, si tu carga de trabajo genera aumentos breves de actividad alta, agregar nodos a tu clúster en función de la carga de CPU no mejorará el rendimiento, ya que, para cuando Bigtable haya rebalanceado los datos, el aumento de actividad ya habrá terminado.

Para planificar esta demora, puedes agregar nodos a tu clúster, ya sea de manera programática o a través de la consola de Google Cloud, antes de aumentar la carga en el clúster. Este enfoque permite que Bigtable tenga tiempo de rebalancear tus datos en los nodos adicionales antes de que aumente la carga de trabajo. En los clústeres que usan la asignación de nodos manual, cambia la cantidad de nodos. En los clústeres que usan el ajuste de escala automático, cambia la cantidad mínima de nodos. Después de que el tráfico vuelva a la normalidad, cambia la configuración del nodo.

Aumentos de latencia debido a una disminución del escalamiento demasiado rápida

Cuando disminuyes la cantidad de nodos en un clúster para disminuir el escalamiento, intenta no reducir el tamaño del clúster en más de un 10% en un período de 10 minutos. Disminuir el escalamiento demasiado rápido puede causar problemas de rendimiento, como un aumento de la latencia, si los nodos restantes del clúster se sobrecargan de forma temporal.

Problemas de diseño de esquemas

Si hay problemas con el diseño del esquema de tu tabla, es posible que agregar nodos a tu clúster de Bigtable no ayude a mejorar el rendimiento. Por ejemplo, si tienes una gran cantidad de lecturas o escrituras en una sola fila de tu tabla, todas estas irán al mismo nodo del clúster; por lo tanto, agregar nodos no mejorará el rendimiento. Por el contrario, si estas están distribuidas de manera uniforme entre las filas de tu tabla, por lo general, agregar nodos mejorará el rendimiento.

Consulta Diseña tu esquema a fin de obtener detalles sobre cómo diseñar un esquema que habilite a Bigtable para escalar de forma efectiva.

Cómo escalar Bigtable de manera programática

En algunos casos, puede que quieras escribir tu propia aplicación para escalar tu clúster de Bigtable. En esta sección, se explica cómo escalar un clúster de manera programática y se proporciona una muestra de código que puedes usar como punto de partida. También se describen algunos límites que debes tener en cuenta antes de configurar el escalamiento programático.

Bigtable expone una variedad de métricas a través de la API de Cloud Monitoring. Puedes supervisar de manera programática estas métricas para tu clúster y, luego, usar una de las bibliotecas cliente de Bigtable o Google Cloud CLI para agregar o quitar nodos según las métricas actuales. Después de cambiar el tamaño del clúster, puedes supervisar su rendimiento a través de la consola de Google Cloud, un panel personalizado de Cloud Monitoring o de manera programática.

Métricas de la API de Monitoring

La API de Supervisión ofrece una variedad de métricas que puedes usar para supervisar el estado actual de tu clúster. Algunas de las métricas más útiles para el escalamiento programático incluyen las siguientes:

  • bigtable.googleapis.com/cluster/cpu_load: La carga de CPU del clúster.
  • bigtable.googleapis.com/cluster/node_count: La cantidad de nodos del clúster.
  • bigtable.googleapis.com/cluster/storage_utilization: El almacenamiento se usa como una fracción de la capacidad de almacenamiento total.
  • bigtable.googleapis.com/server/latencies: La distribución de las latencias de solicitud del servidor para una tabla.

Código de muestra

Puedes usar una de las siguientes herramientas de muestra como punto de partida para tu herramienta de escalamiento programático:

Estas herramientas de muestra agregan nodos al clúster de Bigtable cuando su carga de CPU supera un valor específico. Del mismo modo, las herramientas de muestra quitan todos los nodos de un clúster de Bigtable cuando su carga de CPU es inferior a un valor especificado. Para ejecutar las herramientas de muestra, sigue las instrucciones de cada una en GitHub.

Las herramientas de muestra usan el siguiente código para recopilar información sobre la carga de CPU en el clúster:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si quieres obtener más información, consulta Configura la autenticación para las bibliotecas cliente.

Timestamp now = timeXMinutesAgo(0);
Timestamp fiveMinutesAgo = timeXMinutesAgo(5);
TimeInterval interval =
    TimeInterval.newBuilder().setStartTime(fiveMinutesAgo).setEndTime(now).build();
String filter = "metric.type=\"" + CPU_METRIC + "\"";
ListTimeSeriesPagedResponse response =
    metricServiceClient.listTimeSeries(projectName, filter, interval, TimeSeriesView.FULL);
return response.getPage().getValues().iterator().next().getPointsList().get(0);

Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si quieres obtener más información, consulta Configura la autenticación para las bibliotecas cliente.

client = monitoring_v3.MetricServiceClient()
cpu_query = query.Query(
    client,
    project=PROJECT,
    metric_type="bigtable.googleapis.com/" "cluster/cpu_load",
    minutes=5,
)
cpu_query = cpu_query.select_resources(
    instance=bigtable_instance, cluster=bigtable_cluster
)
cpu = next(cpu_query.iter())
return cpu.points[0].value.double_value

Según la carga de CPU, las herramientas de muestra usan la biblioteca cliente de Bigtable para modificar el tamaño del clúster:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si quieres obtener más información, consulta Configura la autenticación para las bibliotecas cliente.

double latestValue = getLatestValue().getValue().getDoubleValue();
if (latestValue < CPU_PERCENT_TO_DOWNSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize > MIN_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.max(clusterSize - SIZE_CHANGE_STEP, MIN_NODE_COUNT));
  }
} else if (latestValue > CPU_PERCENT_TO_UPSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize <= MAX_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.min(clusterSize + SIZE_CHANGE_STEP, MAX_NODE_COUNT));
  }
}

Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si quieres obtener más información, consulta Configura la autenticación para las bibliotecas cliente.

bigtable_client = bigtable.Client(admin=True)
instance = bigtable_client.instance(bigtable_instance)
instance.reload()

if instance.type_ == enums.Instance.Type.DEVELOPMENT:
    raise ValueError("Development instances cannot be scaled.")

cluster = instance.cluster(bigtable_cluster)
cluster.reload()

current_node_count = cluster.serve_nodes

if scale_up:
    if current_node_count < max_node_count:
        new_node_count = min(current_node_count + size_change_step, max_node_count)
        cluster.serve_nodes = new_node_count
        operation = cluster.update()
        response = operation.result(480)
        logger.info(
            "Scaled up from {} to {} nodes for {}.".format(
                current_node_count, new_node_count, response.name
            )
        )
else:
    if current_node_count > min_node_count:
        new_node_count = max(current_node_count - size_change_step, min_node_count)
        cluster.serve_nodes = new_node_count
        operation = cluster.update()
        response = operation.result(480)
        logger.info(
            "Scaled down from {} to {} nodes for {}.".format(
                current_node_count, new_node_count, response.name
            )
        )

Después de cambiar el tamaño del clúster, puedes usar la consola de Google Cloud o un panel personalizado de Cloud Monitoring para supervisar cómo cambia el rendimiento con el tiempo.

¿Qué sigue?