Crie pools de armazenamento de Hyperdisk


Os Hyperdisk Storage Pools são um novo recurso de armazenamento em blocos que ajuda a gerir o seu armazenamento em blocos do Hyperdisk de forma agregada. Os pools de armazenamento Hyperdisk estão disponíveis nas variantes de pool de armazenamento de débito do Hyperdisk e pool de armazenamento equilibrado do Hyperdisk.

Tem de especificar as seguintes propriedades quando criar um conjunto de armazenamento:

  • Zona
  • Tipo de banco de armazenamento
  • Tipo de aprovisionamento de capacidade
  • Capacidade aprovisionada do conjunto
  • Tipo de aprovisionamento de desempenho
  • IOPS e débito aprovisionados do conjunto

Pode usar tipos de aprovisionamento de capacidade padrão, capacidade avançada, desempenho padrão ou desempenho avançado com pools de armazenamento Hyperdisk:

  • Capacidade padrão: a capacidade aprovisionada para cada disco criado no conjunto de armazenamento é deduzida da capacidade aprovisionada total do conjunto de armazenamento.
  • Capacidade avançada: o conjunto de armazenamento beneficia do aprovisionamento reduzido e da redução de dados. Apenas a quantidade de dados efetivamente escritos é deduzida da capacidade aprovisionada total do conjunto de armazenamento.
  • Desempenho padrão: o desempenho aprovisionado para cada disco criado no conjunto de armazenamento é deduzido do desempenho total aprovisionado do conjunto de armazenamento.
  • Desempenho avançado: o desempenho aprovisionado para cada disco beneficia do aprovisionamento reduzido. Apenas a quantidade de desempenho usada por um disco é deduzida do desempenho total aprovisionado do conjunto de armazenamento.

Antes de começar

  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

    Go

    Para usar os Go exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para mais informações, consulte Set up authentication for a local development environment.

    Java

    Para usar os Java exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para mais informações, consulte Set up authentication for a local development environment.

    Node.js

    Para usar os Node.js exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para mais informações, consulte Set up authentication for a local development environment.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud.

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.

Funções e autorizações necessárias

Para receber as autorizações de que precisa para criar um conjunto de armazenamento, peça ao seu administrador que lhe conceda as seguintes funções de IAM no projeto:

  • Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1)
  • Para se ligar a uma instância de VM que pode ser executada como uma conta de serviço: Utilizador da conta de serviço (v1) (função roles/iam.serviceAccountUser)

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para criar um conjunto de armazenamento. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

As seguintes autorizações são necessárias para criar um conjunto de armazenamento:

  • compute.storagePools.create no projeto
  • compute.storagePools.setLabels no projeto

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Limitações

Tenha em atenção as seguintes limitações ao criar pools de armazenamento Hyperdisk:

Limites de recursos:

  • Pode criar um conjunto de armazenamento Hyperdisk com até 5 PiB de capacidade aprovisionada.
  • Pode criar um máximo de 5 conjuntos de armazenamento por hora.
  • Pode criar um máximo de 10 conjuntos de armazenamento por dia.
  • Pode criar, no máximo, 10 conjuntos de armazenamento por projeto.
  • Não pode alterar o modelo de aprovisionamento de um conjunto. Não pode alterar um conjunto de armazenamento de capacidade padrão para um conjunto de armazenamento de capacidade avançada nem um conjunto de armazenamento de desempenho avançado para um conjunto de armazenamento de desempenho padrão.
  • Os conjuntos de armazenamento são um recurso zonal.
  • Pode criar até 1000 discos num conjunto de armazenamento.
  • Só pode usar pools de armazenamento Hyperdisk com o Compute Engine. As instâncias do Cloud SQL não podem usar pools de armazenamento Hyperdisk.
  • Pode alterar a capacidade aprovisionada ou o desempenho de um conjunto de armazenamento, no máximo, duas vezes num período de 24 horas.

Limites para discos num conjunto de armazenamento:

  • Só é possível criar novos discos no mesmo projeto e zona num conjunto de armazenamento.
  • Não é permitido mover discos para dentro ou para fora de um conjunto de armazenamento. Para mover um disco para dentro ou para fora de um pool de armazenamento, tem de recriar o disco a partir de um instantâneo. Para mais informações, consulte o artigo Altere o tipo de disco.
  • Para criar discos de arranque num conjunto de armazenamento, tem de usar um conjunto de armazenamento equilibrado de hiperdisco.
  • Os conjuntos de armazenamento não são compatíveis com discos regionais.
  • Não pode clonar, criar instantâneos nem configurar a replicação assíncrona para discos num conjunto de armazenamento.

Intervalos de capacidade e limites de desempenho aprovisionados

Ao criar um conjunto de armazenamento, a capacidade aprovisionada, as IOPS e a taxa de transferência estão sujeitas aos limites descritos em Limites para conjuntos de armazenamento.

Crie um conjunto de armazenamento Hyperdisk

Para criar um novo conjunto de armazenamento Hyperdisk, use a Google Cloud consola, a CLI Google Cloud ou a API REST.

Consola

  1. Aceda à página Criar um conjunto de armazenamento na Google Cloud consola.
    Aceda à página Criar conjunto de armazenamento
  2. No campo Nome, introduza um nome exclusivo para o conjunto de armazenamento.
  3. Opcional: no campo Descrição, introduza uma descrição para o conjunto de armazenamento.
  4. Selecione a Região e a Zona nas quais quer criar o conjunto de armazenamento.
  5. Escolha um valor para o Tipo de conjunto de armazenamento.
  6. Escolha um tipo de aprovisionamento no campo Tipo de capacidade e especifique a capacidade a aprovisionar para o conjunto de armazenamento no campo Capacidade do conjunto de armazenamento. Pode especificar um tamanho de 10 TiB a 1 PiB.

    Para criar um conjunto de armazenamento com uma grande capacidade, pode ter de pedir um ajuste da quota.

  7. Escolha um tipo de aprovisionamento no campo Tipo de desempenho.

  8. Para os conjuntos de armazenamento equilibrados do Hyperdisk, no campo IOPS aprovisionadas, introduza as IOPS a aprovisionar para o conjunto de armazenamento.

  9. Para um conjunto de armazenamento de débito Hyperdisk ou um conjunto de armazenamento equilibrado Hyperdisk, no campo Débito aprovisionado, introduza o débito a aprovisionar para o conjunto de armazenamento.

  10. Clique em Enviar para criar o conjunto de armazenamento.

gcloud

Para criar um pool de armazenamento de Hyperdisk, use o comando gcloud compute storage-pools create.

gcloud compute storage-pools create NAME  \
    --zone=ZONE   \
    --storage-pool-type=STORAGE_POOL_TYPE   \
    --capacity-provisioning-type=CAPACITY_TYPE \
    --provisioned-capacity=POOL_CAPACITY   \
    --performance-provisioning-type=PERFORMANCE_TYPE \
    --provisioned-iops=IOPS   \
    --provisioned-throughput=THROUGHPUT   \
    --description=DESCRIPTION

Substitua o seguinte:

  • NAME: o nome exclusivo do conjunto de armazenamento.
  • ZONE: a zona na qual criar o conjunto de armazenamento, por exemplo, us-central1-a.
  • STORAGE_POOL_TYPE: o tipo de disco a armazenar no conjunto de armazenamento. Os valores permitidos são hyperdisk-throughput e hyperdisk-balanced.
  • CAPACITY_TYPE: Opcional: o tipo de aprovisionamento de capacidade do conjunto de armazenamento. Os valores permitidos são advanced e standard. Se não for especificado, é usado o valor advanced.
  • POOL_CAPACITY: a capacidade total a aprovisionar para o novo conjunto de armazenamento, especificada em GiB por predefinição.
  • PERFORMANCE_TYPE: Opcional: o tipo de aprovisionamento de desempenho do conjunto de armazenamento. Os valores permitidos são advanced e standard. Se não for especificado, é usado o valor advanced.
  • IOPS: o IOPS a aprovisionar para o conjunto de armazenamento. Só pode usar esta flag com pools de armazenamento equilibrado do Hyperdisk.
  • THROUGHPUT: o débito em MBps a aprovisionar para o conjunto de armazenamento.
  • DESCRIPTION: opcional: uma string de texto que descreve o conjunto de armazenamento.

REST

Construa um pedido POST para criar um Hyperdisk Storage Pool através do método storagePools.insert.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/storagePools

{
    "name": "NAME",
    "description": "DESCRIPTION",
    "poolProvisionedCapacityGb": "POOL_CAPACITY",
    "storagePoolType": "projects/PROJECT_ID/zones/ZONE/storagePoolTypes/STORAGE_POOL_TYPE",
    "poolProvisionedIops": "IOPS",
    "poolProvisionedThroughput": "THROUGHPUT",
    "capacityProvisioningType": "CAPACITY_TYPE",
    "performanceProvisioningType": "PERFORMANCE_TYPE"
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto
  • ZONE: a zona na qual criar o conjunto de armazenamento, por exemplo, us-central1-a.
  • NAME: um nome exclusivo para o conjunto de armazenamento .
  • DESCRIPTION: opcional: uma string de texto que descreve o conjunto de armazenamento.
  • POOL_CAPACITY: a capacidade total a aprovisionar para o novo conjunto de armazenamento, especificada em GiB por predefinição.
  • STORAGE_POOL_TYPE: o tipo de disco a armazenar no conjunto de armazenamento. Os valores permitidos são hyperdisk-throughput e hyperdisk-balanced.
  • IOPS: Opcional: o IOPS a aprovisionar para o conjunto de armazenamento. Só pode usar esta flag com pools de armazenamento equilibrado do Hyperdisk.
  • THROUGHPUT: opcional: o débito em MBps a aprovisionar para o conjunto de armazenamento.
  • CAPACITY_TYPE: Opcional: o tipo de aprovisionamento de capacidade do conjunto de armazenamento. Os valores permitidos são advanced e standard. Se não for especificado, é usado o valor advanced.
  • PERFORMANCE_TYPE: Opcional: o tipo de aprovisionamento de desempenho do conjunto de armazenamento. Os valores permitidos são advanced e standard. Se não for especificado, é usado o valor advanced.

Go


// createHyperdiskStoragePool creates a new Hyperdisk storage pool in the specified project and zone.
func createHyperdiskStoragePool(w io.Writer, projectId, zone, storagePoolName, storagePoolType string) error {
	// projectID := "your_project_id"
	// zone := "europe-west4-b"
	// storagePoolName := "your_storage_pool_name"
	// storagePoolType := "projects/**your_project_id**/zones/europe-west4-b/diskTypes/hyperdisk-balanced"

	ctx := context.Background()
	client, err := compute.NewStoragePoolsRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewStoragePoolsRESTClient: %v", err)
	}
	defer client.Close()

	// Create the storage pool resource
	resource := &computepb.StoragePool{
		Name:                        proto.String(storagePoolName),
		Zone:                        proto.String(zone),
		StoragePoolType:             proto.String(storagePoolType),
		CapacityProvisioningType:    proto.String("advanced"),
		PerformanceProvisioningType: proto.String("advanced"),
		PoolProvisionedCapacityGb:   proto.Int64(10240),
		PoolProvisionedIops:         proto.Int64(10000),
		PoolProvisionedThroughput:   proto.Int64(1024),
	}

	// Create the insert storage pool request
	req := &computepb.InsertStoragePoolRequest{
		Project:             projectId,
		Zone:                zone,
		StoragePoolResource: resource,
	}

	// Send the insert storage pool request
	op, err := client.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("Insert storage pool request failed: %v", err)
	}

	// Wait for the insert storage pool operation to complete
	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	// Retrieve and return the created storage pool
	storagePool, err := client.Get(ctx, &computepb.GetStoragePoolRequest{
		Project:     projectId,
		Zone:        zone,
		StoragePool: storagePoolName,
	})
	if err != nil {
		return fmt.Errorf("Get storage pool request failed: %v", err)
	}

	fmt.Fprintf(w, "Hyperdisk Storage Pool created: %v\n", storagePool.GetName())
	return nil
}

Java

import com.google.cloud.compute.v1.InsertStoragePoolRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.StoragePool;
import com.google.cloud.compute.v1.StoragePoolsClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateHyperdiskStoragePool {
  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the zone in which you want to create the storagePool.
    String zone = "us-central1-a";
    // Name of the storagePool you want to create.
    String storagePoolName = "YOUR_STORAGE_POOL_NAME";
    // The type of disk you want to create.
    // Storage types can be "hyperdisk-throughput" or "hyperdisk-balanced"
    String storagePoolType = String.format(
        "projects/%s/zones/%s/storagePoolTypes/hyperdisk-balanced", projectId, zone);
    // Optional: the capacity provisioning type of the storage pool.
    // The allowed values are advanced and standard. If not specified, the value advanced is used.
    String capacityProvisioningType = "advanced";
    // The total capacity to provision for the new storage pool, specified in GiB by default.
    long provisionedCapacity = 128;
    // the IOPS to provision for the storage pool.
    // You can use this flag only with Hyperdisk Balanced Storage Pools.
    long provisionedIops = 3000;
    // the throughput in MBps to provision for the storage pool.
    long provisionedThroughput = 140;
    // The allowed values are low-casing strings "advanced" and "standard".
    // If not specified, "advanced" is used.
    String performanceProvisioningType = "advanced";

    createHyperdiskStoragePool(projectId, zone, storagePoolName, storagePoolType,
            capacityProvisioningType, provisionedCapacity, provisionedIops,
        provisionedThroughput, performanceProvisioningType);
  }

  // Creates a hyperdisk storagePool in a project
  public static StoragePool createHyperdiskStoragePool(String projectId, String zone,
        String storagePoolName, String storagePoolType, String capacityProvisioningType,
        long capacity, long iops, long throughput, String performanceProvisioningType)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (StoragePoolsClient client = StoragePoolsClient.create()) {
      // Create a storagePool.
      StoragePool resource = StoragePool.newBuilder()
              .setZone(zone)
              .setName(storagePoolName)
              .setStoragePoolType(storagePoolType)
              .setCapacityProvisioningType(capacityProvisioningType)
              .setPoolProvisionedCapacityGb(capacity)
              .setPoolProvisionedIops(iops)
              .setPoolProvisionedThroughput(throughput)
              .setPerformanceProvisioningType(performanceProvisioningType)
              .build();

      InsertStoragePoolRequest request = InsertStoragePoolRequest.newBuilder()
              .setProject(projectId)
              .setZone(zone)
              .setStoragePoolResource(resource)
              .build();

      // Wait for the insert disk operation to complete.
      Operation operation = client.insertAsync(request).get(1, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("StoragePool creation failed!");
        throw new Error(operation.getError().toString());
      }

      // Wait for server update
      TimeUnit.SECONDS.sleep(10);

      StoragePool storagePool = client.get(projectId, zone, storagePoolName);

      System.out.printf("Storage pool '%s' has been created successfully", storagePool.getName());

      return storagePool;
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

// Instantiate a storagePoolClient
const storagePoolClient = new computeLib.StoragePoolsClient();
// Instantiate a zoneOperationsClient
const zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await storagePoolClient.getProjectId();
// Name of the zone in which you want to create the storagePool.
const zone = 'us-central1-a';
// Name of the storagePool you want to create.
// storagePoolName = 'storage-pool-name';
// The type of disk you want to create. This value uses the following format:
// "projects/{projectId}/zones/{zone}/storagePoolTypes/(hyperdisk-throughput|hyperdisk-balanced)"
const storagePoolType = `projects/${projectId}/zones/${zone}/storagePoolTypes/hyperdisk-balanced`;
// Optional: The capacity provisioning type of the storage pool.
// The allowed values are advanced and standard. If not specified, the value advanced is used.
const capacityProvisioningType = 'advanced';
// The total capacity to provision for the new storage pool, specified in GiB by default.
const provisionedCapacity = 10240;
// The IOPS to provision for the storage pool.
// You can use this flag only with Hyperdisk Balanced Storage Pools.
const provisionedIops = 10000;
// The throughput in MBps to provision for the storage pool.
const provisionedThroughput = 1024;
// Optional: The performance provisioning type of the storage pool.
// The allowed values are advanced and standard. If not specified, the value advanced is used.
const performanceProvisioningType = 'advanced';

async function callCreateComputeHyperdiskPool() {
  // Create a storagePool.
  const storagePool = new compute.StoragePool({
    name: storagePoolName,
    poolProvisionedCapacityGb: provisionedCapacity,
    poolProvisionedIops: provisionedIops,
    poolProvisionedThroughput: provisionedThroughput,
    storagePoolType,
    performanceProvisioningType,
    capacityProvisioningType,
    zone,
  });

  const [response] = await storagePoolClient.insert({
    project: projectId,
    storagePoolResource: storagePool,
    zone,
  });

  let operation = response.latestResponse;

  // Wait for the create storage pool operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await zoneOperationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log(`Storage pool: ${storagePoolName} created.`);
}

await callCreateComputeHyperdiskPool();

O que se segue?