建立 Hyperdisk 儲存空間集區


Hyperdisk 儲存空間集區是新的區塊儲存空間資源,可協助您匯總管理 Hyperdisk 區塊儲存空間。Hyperdisk 儲存空間集區提供 Hyperdisk Throughput 儲存空間集區和 Hyperdisk Balanced 儲存空間集區變體。

建立儲存空間集區時,必須指定下列屬性:

  • 可用區
  • 儲存空間集區類型
  • 容量佈建類型
  • 已佈建的集區容量
  • 效能佈建類型
  • 已佈建集區的 IOPS 和處理量

您可以在 Hyperdisk 儲存空間集區中使用標準容量、進階容量、標準效能或進階效能佈建類型:

  • 標準容量:系統會從儲存空間集區的已佈建總容量中,扣除為儲存空間集區中建立的每個磁碟佈建的容量。
  • 進階容量:儲存空間集區可享有自動精簡配置和資料縮減功能。系統只會從儲存空間集區的總佈建容量中,扣除實際寫入的資料量。
  • 標準效能:系統會從儲存空間集區的已佈建總效能,扣除儲存空間集區中建立的每個磁碟所佈建的效能。
  • 進階效能:每個磁碟的佈建效能都受益於精簡佈建。系統只會從儲存空間集區的已佈建總效能中,扣除磁碟使用的效能。

事前準備

必要角色和權限

如要取得建立儲存集區所需的權限,請要求管理員授予您專案的下列 IAM 角色:

  • Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1)
  • 如要連線至可當做服務帳戶執行的 VM 執行個體: 服務帳戶使用者 (v1) (roles/iam.serviceAccountUser 角色)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色具備建立儲存空間集區所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要建立儲存空間集區,必須具備下列權限:

  • 專案的 compute.storagePools.create
  • 專案的 compute.storagePools.setLabels

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

限制

建立 Hyperdisk 儲存空間集區時,請注意下列限制:

資源限制

  • 您最多可以建立 5 PiB 佈建容量的 Hyperdisk 儲存空間集區。
  • 每小時最多可建立 5 個儲存集區。
  • 每天最多可建立 10 個儲存集區。
  • 每個專案最多可建立 10 個儲存集區。
  • 您無法變更集區的佈建模式,也無法將標準容量儲存空間集區變更為進階容量儲存空間集區,或將進階效能儲存空間集區變更為標準效能儲存空間集區。
  • 儲存空間集區是區域性資源。
  • 一個儲存集區最多可建立 1,000 個磁碟。
  • Hyperdisk 儲存空間集區只能與 Compute Engine 搭配使用。Cloud SQL 執行個體無法使用 Hyperdisk 儲存空間集區。
  • 在 24 小時內,您最多可以變更儲存空間集區的佈建容量或效能兩次。

儲存空間集區中的磁碟限制

  • 只有位於相同專案和可用區的新磁碟,才能在儲存空間集區中建立。
  • 不允許在儲存空間集區中移動磁碟。如要將磁碟移入或移出儲存集區,必須從快照重新建立磁碟。詳情請參閱「變更磁碟類型」。
  • 如要在儲存空間集區中建立開機磁碟,必須使用 Hyperdisk Balanced 儲存空間集區。
  • 儲存空間集區不支援區域磁碟
  • 您無法複製建立即時快照,或設定儲存集區中磁碟的非同步複製

容量範圍和佈建效能限制

建立儲存空間集區時,佈建容量、IOPS 和處理量會受到「儲存空間集區限制」一文所述的限制。

建立 Hyperdisk 儲存空間集區

如要建立新的 Hyperdisk 儲存集區,請使用 Google Cloud 控制台、Google Cloud CLI 或 REST。

主控台

  1. 前往 Google Cloud 控制台的「建立儲存集區」頁面。
    前往「建立儲存集區」頁面
  2. 在「名稱」欄位中,輸入儲存集區的專屬名稱。
  3. 選用:在「Description」(說明) 欄位中,輸入儲存集區的說明。
  4. 選取要建立儲存空間集區的「Region」(區域) 和「Zone」(可用區)
  5. 選擇「儲存空間集區類型」的值。
  6. 在「容量類型」欄位中選擇佈建類型,並在「儲存空間集區容量」欄位中指定要為儲存空間集區佈建的容量。大小範圍為 10 TiB 至 1 PiB。

    如要建立大容量儲存空間集區,您可能需要申請調整配額

  7. 在「效能類型」欄位中選擇佈建類型。

  8. 如果是 Hyperdisk Balanced 儲存空間集區,請在「已佈建 IOPS」欄位中,輸入要為儲存空間集區佈建的 IOPS。

  9. 如果是 Hyperdisk Throughput 儲存空間集區或 Hyperdisk Balanced 儲存空間集區,請在「佈建輸送量」欄位中,輸入要為儲存空間集區佈建的輸送量。

  10. 按一下「提交」即可建立儲存集區。

gcloud

如要建立 Hyperdisk 儲存空間集區,請使用 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

更改下列內容:

  • NAME:不重複的儲存空間集區名稱。
  • ZONE:要建立儲存空間集區的區域,例如 us-central1-a
  • STORAGE_POOL_TYPE:儲存集區中儲存的磁碟類型。允許的值為 hyperdisk-throughputhyperdisk-balanced
  • CAPACITY_TYPE:選用:儲存空間集區的容量佈建類型。允許的值為 advancedstandard。如未指定,則會使用 advanced 值。
  • POOL_CAPACITY:為新儲存空間集區佈建的總容量,預設以 GiB 為單位。
  • PERFORMANCE_TYPE:選用:儲存空間集區的效能佈建類型。允許的值為 advancedstandard。如未指定,則會使用 advanced 值。
  • IOPS:為儲存集區佈建的 IOPS。這個旗標只能與 Hyperdisk Balanced 儲存空間集區搭配使用。
  • THROUGHPUT:為儲存空間集區佈建的處理量 (MB/秒)。
  • DESCRIPTION:(選用) 描述儲存集區的文字字串。

REST

使用 storagePools.insert 方法建構 POST 要求,以建立 Hyperdisk 儲存空間集區。

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"
}

更改下列內容:

  • PROJECT_ID:專案 ID
  • ZONE:要建立儲存空間集區的區域,例如 us-central1-a
  • NAME:儲存空間集區的專屬名稱。
  • DESCRIPTION:(選用) 描述儲存集區的文字字串。
  • POOL_CAPACITY:新儲存空間集區的總容量,預設以 GiB 為單位。
  • STORAGE_POOL_TYPE:儲存集區中儲存的磁碟類型。允許的值為 hyperdisk-throughputhyperdisk-balanced
  • IOPS:(選填) 為儲存空間集區佈建的 IOPS。這個旗標只能與 Hyperdisk Balanced 儲存空間集區搭配使用。
  • THROUGHPUT:(選用) 為儲存空間集區佈建的處理量 (以 MBps 為單位)。
  • CAPACITY_TYPE:選用:儲存空間集區的容量佈建類型。允許的值為 advancedstandard。如未指定,則會使用 advanced 值。
  • PERFORMANCE_TYPE:選用:儲存空間集區的效能佈建類型。允許的值為 advancedstandard。如未指定,則會使用 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();

後續步驟