יצירת מאגר Hyperdisk

במאמר הזה מוסבר איך ליצור מאגרי Hyperdisk. מאגרי Hyperdisk הם משאבים של אחסון בלוקים שעוזרים לנהל את משאבי אחסון הבלוקים של Hyperdisk באופן מצטבר. מאגרי Hyperdisk זמינים בגרסאות הבאות:

  • ‫Hyperdisk Storage Pools: מומלץ לרוב עומסי העבודה
  • ‫Hyperdisk Exapools: מומלץ לעומסי עבודה גדולים מאוד שדורשים ביצועים בו-זמניים של יותר מ-100GiB לשנייה

למידע נוסף על הסוגים השונים של מאגרי Hyperdisk, ראו סקירה כללית על מאגרי Hyperdisk.

לפני שמתחילים

תפקידים והרשאות נדרשים

כדי לקבל את ההרשאות שדרושות ליצירת מאגר Hyperdisk, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM בפרויקט:

  • אדמין מכונות של Compute ‏(v1) ‏(roles/compute.instanceAdmin.v1)
  • כדי להתחבר למכונה וירטואלית שיכולה לפעול כחשבון שירות: משתמש בחשבון שירות (גרסה 1) (התפקיד roles/iam.serviceAccountUser)

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות כדי ליצור מאגר Hyperdisk. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי ליצור מאגר Hyperdisk, צריך את ההרשאות הבאות:

  • ‫compute.storagePools.create בפרויקט
  • ‫compute.storagePools.setLabels בפרויקט

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

מגבלות

המגבלות הבאות חלות כשיוצרים מאגרי אחסון של Hyperdisk:

מגבלות על משאבים:

  • אפשר ליצור מאגר Hyperdisk Storage Pool עם קיבולת מוקצית של עד 5 PiB.
  • אפשר ליצור עד 5 מאגרי אחסון בשעה.
  • אפשר ליצור עד 10 Storage Pools ביום.
  • אפשר ליצור עד 20 Storage Pool לכל פרויקט, בכל אזור. המגבלה הזו משותפת למאגרי Hyperdisk Balanced Storage Pool ולמאגרי Hyperdisk Throughput Storage Pool של הפרויקט שנמצאים באותו אזור.
  • אי אפשר לשנות את מודל ההקצאה של מאגר. לדוגמה, אי אפשר לשנות מאגר Storage Pool בקיבולת Standard למאגר Storage Pool בקיבולת Advanced, או מאגר Storage Pool בביצועים Advanced למאגר Storage Pool בביצועים Standard.
  • מאגרים הם משאבים של תחום מוגדר.
  • אפשר ליצור עד 10,000 דיסקים ב-Storage Pool.
  • אפשר להשתמש במאגרי אחסון של Hyperdisk רק ב-Compute Engine. אי אפשר להשתמש במאגרי אחסון של Hyperdisk במכונות של Cloud SQL.
  • אפשר לשנות את הקיבולת או הביצועים שהוקצו ל-Storage Pool עד פעמיים בפרק זמן של 24 שעות.
  • אפשר ליצור רק דיסקים מסוג Hyperdisk Balanced במאגר Hyperdisk Balanced, ורק דיסקים מסוג Hyperdisk Throughput במאגר Hyperdisk Throughput.
  • כדי לשנות את הקיבולת, את ה-IOPS או את קצב הנתונים שהוקצו ל-Exapool, צריך לפנות לצוות ניהול החשבון.
  • כדי למחוק Exapool, צריך לפנות לצוות ניהול החשבון.

מגבלות על דיסקים במאגר:

טווחי קיבולת ומגבלות ביצועים שהוקצו

כשיוצרים Storage Pool, הקיבולת, ה-IOPS וקצב הנתונים שהוקצו לא יכולים לחרוג מהמגבלות שמתוארות בקטע מגבלות למאגרים.

יצירת Hyperdisk Storage Pool

כדי ליצור מאגר חדש של Hyperdisk Storage Pool, משתמשים במסוף Cloud de Confiance , ב-Google Cloud CLI או ב-REST. כשיוצרים Storage Pool, צריך לציין את המאפיינים הבאים:

  • תחום (zone)
  • סוג מאגר האחסון
  • מודל הקצאת קיבולת
  • קיבולת שהוקצתה למאגר
  • סוג הקצאת הביצועים
  • ‫IOPS וקצב העברת נתונים שהוקצו למאגר

המסוף

  1. נכנסים לדף Create a storage pool במסוף Cloud de Confiance .
    כניסה לדף Create Storage Pool
  2. בשדה Name, מזינים שם ייחודי ל-Storage Pool.
  3. אופציונלי: בשדה Description, מזינים תיאור ל-Storage Pool.
  4. בוחרים את האזור (Region) ואת התחום (Zone) שבהם רוצים ליצור את מאגר האחסון.
  5. בוחרים ערך ל-Storage pool type.
  6. בשדה Capacity type בוחרים את סוג ההקצאה, ובשדה Storage pool capacity מציינים את הקיבולת שרוצים להקצות למאגר האחסון. אפשר לציין גודל מ-10 TiB עד 1 PiB.

    כדי ליצור Storage Pool עם קיבולת גדולה, יכול להיות שתצטרכו לבקש שינוי במכסה.

  7. בשדה Performance type, בוחרים סוג הקצאה. אפשר להשתמש בסוגי ההקצאות הבאים עם מאגרי אחסון של Hyperdisk:

    • קיבולת רגילה: הקיבולת שהוקצתה לכל דיסק שנוצר במאגר הדיסקים מנוכה מהקיבולת הכוללת שהוקצתה למאגר הדיסקים.
    • קיבולת מתקדמת: מאגר האחסון נהנה מהקצאת אחסון לפי צורך (Thin Provisioning) וצמצום נתונים. רק כמות הנתונים שנכתבו בפועל מנוכה מהקיבולת הכוללת שהוקצתה ל-Storage Pool.
    • ביצועים רגילים: הביצועים שהוקצו לכל דיסק שנוצר במאגר הדיסקים מנוכים מסך הביצועים שהוקצו למאגר הדיסקים.
    • ביצועים מתקדמים: הביצועים שמוקצים לכל דיסק נהנים מהקצאת אחסון לפי צורך (Thin Provisioning). רק כמות הביצועים שבהם משתמש הדיסק מנוכה מסך הביצועים שהוקצו ל-Storage Pool.
  8. במאגרי Hyperdisk Balanced Storage Pool, בשדה Provisioned IOPS מזינים את מספר ה-IOPS שרוצים להקצות למאגר.

  9. בשדה Provisioned throughput של Hyperdisk Throughput Storage Pool או Hyperdisk Balanced Storage Pool, מזינים את נפח העיבוד שרוצים להקצות למאגר האחסון.

  10. לוחצים על Submit כדי ליצור את מאגר האחסון.

gcloud

כדי ליצור Hyperdisk Storage Pool, משתמשים בפקודה 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: סוג הדיסק לאחסון ב-Storage Pool. הערכים המותרים הם hyperdisk-throughput ו-hyperdisk-balanced.
  • ‫CAPACITY_TYPE: אופציונלי: סוג הקצאת הקיבולת של Storage Pool. הערכים המותרים הם advanced ו-standard. אם לא מציינים ערך, המערכת משתמשת בערך advanced.
  • ‫POOL_CAPACITY: הקיבולת הכוללת להקצאה ל-Storage Pool החדש, שצוינה ב-GiB כברירת מחדל.
  • ‫PERFORMANCE_TYPE: אופציונלי: סוג הקצאת הביצועים של Storage Pool. הערכים המותרים הם advanced ו-standard. אם לא מציינים ערך, המערכת משתמשת בערך advanced.
  • ‫IOPS: מספר פעולות ה-IOPS שיוקצו ל-Storage Pool. אפשר להשתמש בדגל הזה רק עם מאגרי אחסון של Hyperdisk Balanced.
  • ‫THROUGHPUT: קצב העברת הנתונים ב-MBps שרוצים להקצות למאגר האחסון.
  • ‫DESCRIPTION: אופציונלי: מחרוזת טקסט שמתארת את מאגר האחסון.

REST

יוצרים בקשת POST כדי ליצור מאגר Hyperdisk Storage Pool באמצעות ה-method‏ 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"
}

מחליפים את מה שכתוב בשדות הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫ZONE: האזור שבו יוצרים את מאגר האחסון, לדוגמה us-central1-a.
  • ‫NAME: שם ייחודי ל-Storage Pool .
  • ‫DESCRIPTION: אופציונלי: מחרוזת טקסט שמתארת את מאגר האחסון.
  • ‫POOL_CAPACITY: הקיבולת הכוללת להקצאה ל-Storage Pool החדש, שצוינה ב-GiB כברירת מחדל.
  • ‫STORAGE_POOL_TYPE: סוג הדיסק לאחסון במאגר האחסון. הערכים המותרים הם hyperdisk-throughput ו-hyperdisk-balanced.
  • ‫IOPS: אופציונלי: מספר פעולות ה-IOPS שרוצים להקצות ל-Storage Pool. אפשר להשתמש בדגל הזה רק עם מאגרי אחסון של Hyperdisk Balanced.
  • ‫THROUGHPUT: אופציונלי: קצב העברת הנתונים ב-MiB/s שרוצים להקצות ל-Storage Pool.
  • ‫CAPACITY_TYPE: אופציונלי: סוג הקצאת הקיבולת של Storage Pool. הערכים המותרים הם advanced ו-standard. אם לא מציינים ערך, המערכת משתמשת בערך advanced.
  • ‫PERFORMANCE_TYPE: אופציונלי: סוג הקצאת הביצועים של Storage Pool. הערכים המותרים הם advanced ו-standard. אם לא מציינים ערך, המערכת משתמשת בערך advanced.

המשך


// 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();

יצירת Hyperdisk Exapool

‫Hyperdisk Exapools זמינים לכלל המשתמשים (GA) עם רשימת היתרים. כדי ליצור Hyperdisk Exapool, פנו לצוות ניהול החשבון.

מה השלב הבא?