Scalabilità

La scalabilità di un cluster è il processo di aggiunta o rimozione di nodi a un cluster in risposta ai cambiamenti nel carico di lavoro del cluster o nelle esigenze di archiviazione dei dati. Può essere utile scalare il cluster Bigtable in base a metriche come l'utilizzo della CPU del cluster. Ad esempio, se il cluster è sottoposto a un carico elevato e l'utilizzo della CPU è elevato, puoi aggiungere nodi al cluster fino a quando l'utilizzo della CPU non cala. Puoi anche risparmiare rimuovendo i nodi dal cluster quando non viene utilizzato in modo massiccio.

Opzioni di scalabilità

Puoi scalare un cluster Bigtable nei seguenti modi:

Nella maggior parte dei casi, se vuoi scalare automaticamente, devi utilizzare la funzionalità di scalabilità automatica integrata di Bigtable. Quando abiliti questa funzionalità, Bigtable monitora continuamente il cluster e regola automaticamente il numero di nodi in base alle tue impostazioni.

Limitazioni

Prima di abilitare la scalabilità automatica o di configurare la scalabilità programmatica per il tuo cluster Bigtable, considera le seguenti limitazioni.

Disponibilità dei nodi

Le quote per i nodi si applicano indipendentemente dal fatto che un cluster abbia l'allocazione manuale dei nodi o la scalabilità automatica abilitata. Per maggiori dettagli, consulta Quote e disponibilità dei nodi.

Ritardo durante il ribilanciamento dei nodi

Dopo aver aggiunto nodi a un cluster, possono essere necessari fino a 20 minuti sotto carico prima che si registrino un miglioramento significativo delle prestazioni del cluster. Di conseguenza, se il carico di lavoro prevede brevi burst di attività elevata, l'aggiunta di nodi al cluster in base al carico della CPU non migliorerà le prestazioni: quando Bigtable ribilancia i dati, il breve burst di attività finirà.

Per pianificare questo ritardo, puoi aggiungere nodi al cluster in modo programmatico o tramite la console Google Cloud, prima di aumentare il carico sul cluster. Questo approccio dà a Bigtable il tempo di ribilanciare i dati nei nodi aggiuntivi prima che il carico di lavoro aumenti. Nei cluster che utilizzano l'allocazione manuale dei nodi, modifica il numero di nodi. Nei cluster che utilizzano la scalabilità automatica, modifica il numero minimo di nodi. Quando il traffico torna alla normalità, ripristina le impostazioni dei nodi.

Aumenti di latenza causati da uno scale down troppo rapido

Quando diminuisci il numero di nodi in un cluster per fare lo scale down, prova a non ridurre le dimensioni del cluster di oltre il 10% in un periodo di 10 minuti. Lo scale down troppo rapido può causare problemi di prestazioni, ad esempio un aumento della latenza, nel caso in cui i nodi rimanenti nel cluster vengano sovraccaricati temporaneamente.

Problemi di progettazione dello schema

In caso di problemi con la progettazione dello schema per la tua tabella, l'aggiunta di nodi al cluster Bigtable potrebbe non migliorare le prestazioni. Ad esempio, se hai un numero elevato di letture o scritture su una singola riga della tabella, tutte le operazioni di lettura o scrittura andranno allo stesso nodo nel tuo cluster; di conseguenza, l'aggiunta di nodi non migliorerà le prestazioni. Al contrario, se le operazioni di lettura e scrittura sono distribuite in modo uniforme tra le righe della tabella, l'aggiunta di nodi generalmente migliorerà le prestazioni.

Per maggiori dettagli su come progettare uno schema che consenta a Bigtable di scalare in modo efficace, consulta Progettazione dello schema.

Scalabilità programmatica di Bigtable

In alcuni casi, potresti voler scrivere una tua applicazione per scalare il cluster Bigtable. Questa sezione spiega come scalare un cluster in modo programmatico e fornisce un esempio di codice che puoi utilizzare come punto di partenza. Descrive inoltre alcune limitazioni che è necessario conoscere prima di configurare la scalabilità programmatica.

Bigtable espone una serie di metriche tramite l'API Cloud Monitoring. Puoi monitorare in modo programmatico queste metriche per il cluster, quindi utilizzare una delle librerie client di Bigtable o Google Cloud CLI per aggiungere o rimuovere nodi in base alle metriche attuali. Dopo aver ridimensionato il cluster, puoi monitorarne le prestazioni tramite la console Google Cloud, una dashboard personalizzata di Cloud Monitoring o in modo programmatico.

Metriche dell'API Monitoring

L'API Monitoring fornisce una serie di metriche che puoi utilizzare per monitorare lo stato attuale del tuo cluster. Ecco alcune delle metriche più utili per la scalabilità programmatica:

  • bigtable.googleapis.com/cluster/cpu_load: carico della CPU del cluster.
  • bigtable.googleapis.com/cluster/node_count: il numero di nodi nel cluster.
  • bigtable.googleapis.com/cluster/storage_utilization: lo spazio di archiviazione utilizzato come frazione della capacità di archiviazione totale.
  • bigtable.googleapis.com/server/latencies: la distribuzione delle latenze di richiesta del server per una tabella.

Codice di esempio

Come punto di partenza per il tuo strumento di scalabilità programmatica, puoi utilizzare uno dei seguenti strumenti di esempio:

Gli strumenti di esempio aggiungono nodi a un cluster Bigtable quando il carico della CPU è superiore a un valore specificato. Analogamente, gli strumenti di esempio rimuovono i nodi da un cluster Bigtable quando il carico della CPU è inferiore a un valore specificato. Per eseguire gli strumenti di esempio, segui le istruzioni per ogni esempio su GitHub.

Gli strumenti di esempio utilizzano il codice seguente per raccogliere informazioni sul carico della CPU sul cluster:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

In base al carico della CPU, gli strumenti di esempio utilizzano la libreria client Bigtable per ridimensionare il cluster:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Dopo il ridimensionamento del cluster, puoi utilizzare la console Google Cloud o una dashboard personalizzata di Cloud Monitoring per monitorare le variazioni delle prestazioni nel tempo.

Passaggi successivi