יצירת מאגר Hyperdisk

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

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

מידע על הסוגים השונים של מאגרי Hyperdisk זמין במאמר סקירה כללית על מאגרי Hyperdisk.

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

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

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

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

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

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

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

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

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

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

מגבלות

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

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

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

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

  • אפשר ליצור מאגר רק מדיסקים חדשים שנמצאים באותו פרויקט ואותו אזור.
  • אי אפשר להעביר דיסקים אל מאגר או ממאגר. כדי להעביר דיסק אל מאגר או ממאגר, צריך ליצור מחדש את הדיסק מתמונת מצב. מידע נוסף זמין במאמר בנושא שינוי סוג הדיסק.
  • כדי ליצור דיסקים לאתחול במאגר, צריך להשתמש ב-Hyperdisk Balanced Storage Pool או ב-Hyperdisk Balanced Exapool.
  • מאגרי משאבים לא תומכים בדיסקים אזוריים.
  • אי אפשר לשכפל, ליצור תמונות מצב מיידיות או להגדיר שכפול אסינכרוני לדיסקים במאגר.

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

כשיוצרים מאגר אחסון, הקיבולת, ה-IOPS והתפוקה שהוקצו לא יכולים לחרוג מהמגבלות שמתוארות במאמר מגבלות למאגרים.

יצירת Hyperdisk Storage Pool

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

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

המסוף

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

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

  7. בוחרים סוג הקצאת הרשאות בשדה סוג הביצועים. אפשר להשתמש בסוגי ההקצאה הבאים עם Hyperdisk Storage Pools:

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

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

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

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

מה השלב הבא?