Berbagi volume Persistent Disk antar-VM


Anda dapat memasang volume Persistent Disk SSD dalam mode multi-penulis ke hingga dua instance virtual machine (VM) N2 secara bersamaan, sehingga kedua VM dapat membaca dan menulis ke disk. Guna mengaktifkan mode multi-penulis untuk volume Persistent Disk baru, buat volume Persistent Disk baru dan tentukan flag --multi-writer di gcloud CLI atau properti multiWriter di Compute Engine API.

Volume Persistent Disk dalam mode multi-penulis menyediakan kemampuan block storage bersama dan memberikan fondasi infrastruktur untuk mem-build sistem penyimpanan terdistribusi dan layanan serupa yang memiliki ketersediaan tinggi. Saat menggunakan volume Persistent Disk dalam mode multi-penulis, gunakan sistem software penyimpanan dengan penyebaran skala yang memiliki kemampuan untuk mengoordinasikan akses ke perangkat Persistent Disk di beberapa VM. Contoh sistem penyimpanan ini meliputi Lustre dan IBM Spectrum Scale. Sebagian besar sistem file VM tunggal seperti EXT4, XFS, dan NTFS tidak dirancang untuk digunakan dengan block storage bersama. Untuk informasi selengkapnya, lihat Praktik terbaik dalam dokumen ini. Jika memerlukan penyimpanan file yang terkelola sepenuhnya, Anda dapat memasang fitur berbagi file Filestore di VM Compute Engine.

Volume Persistent Disk dalam mode multi-penulis mendukung subset perintah Reservasi Persisten SCSI-3 (SCSI PR). Aplikasi ketersediaan tinggi dapat menggunakan perintah ini untuk konfigurasi failover dan pagar I/O.

Perintah PR SCSI berikut didukung:

  • IN {REPORT CAPABILITIES, READ FULL STATUS, READ RESERVATION, READ KEYS}
  • OUT {REGISTER, REGISTER AND IGNORE EXISTING KEY, RESERVE, PREEMPT, CLEAR, RELEASE}

Sebelum memulai

  • Siapkan autentikasi, jika Anda belum melakukannya. Autentikasi adalah proses verifikasi identitas Anda untuk akses ke layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine sebagai berikut.

    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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Java

      Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Python

      Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      REST

      Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Untuk informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud.

Pembatasan

  • Hanya tersedia untuk volume Persistent Disk jenis SSD.
  • Anda dapat membuat volume Persistent Disk dalam mode multi-penulis di zona mana pun, tetapi Anda hanya dapat memasang disk tersebut ke VM di lokasi berikut:
    • australia-southeast1
    • europe-west1
    • us-central1 (khusus zona us-central1-a dan us-central1-c)
    • us-east1 (khusus zona us-east1-d)
    • us-west1 (khusus zona us-west1-b dan us-west1-c)
  • VM yang terpasang harus memiliki jenis mesin N2.
  • Ukuran minimum: 10 GB
  • VM terpasang: 2
  • Volume Persistent Disk mode multi-penulis tidak mendukung metrik Persistent Disk.
  • Disk dalam mode multi-penulis tidak dapat diubah ke mode hanya baca.
  • Anda tidak dapat menggunakan disk image atau snapshot untuk membuat volume Persistent Disk dalam mode multi-penulis.
  • Anda tidak dapat membuat snapshot atau image dari volume Persistent Disk dalam mode multi-penulis.
  • Batas IOPS yang lebih rendah. Lihat performa disk untuk mengetahui detailnya.
  • Anda tidak dapat mengubah ukuran volume Persistent Disk multi-writer.
  • Saat membuat VM menggunakan Google Cloud CLI, Anda tidak dapat membuat volume Persistent Disk multi-penulis menggunakan flag --create-disk.

Praktik terbaik

  • Pemagaran I/O yang menggunakan perintah PR SCSI akan menghasilkan status konsisten error pada data Persistent Disk. Beberapa sistem file tidak memiliki konsistensi error dan oleh karena itu dapat rusak jika Anda menggunakan perintah PR SCSI.
  • Banyak sistem file seperti EXT4, XFS, dan NTFS tidak dirancang untuk digunakan dengan block storage bersama dan tidak memiliki mekanisme untuk menyinkronkan atau melakukan operasi yang berasal dari beberapa instance VM.
  • Sebelum menggunakan volume Persistent Disk dalam mode multi-penulis, pastikan Anda memahami sistem file dan cara sistem file tersebut dapat digunakan secara aman dengan block storage bersama dan akses simultan dari beberapa VM.

Performa

Volume Persistent Disk yang dibuat dalam mode multi-penulis memiliki batas IOPS dan throughput tertentu.

Mode multi-penulis persistent disk SSD zona
IOPS berkelanjutan maksimum
IOPS baca per GB 30
IOPS tulis per GB 30
IOPS baca per instance 15.000–100.000*
IOPS tulis per instance 15.000–100.000*
Throughput berkelanjutan maksimum (MB/dtk)
Throughput baca per GB 0,48
Throughput tulis per GB 0,48
Throughput baca per instance 240–1.200*
Throughput tulis per instance 240–1.200*
* IOPS persistent disk dan performa throughput bergantung pada ukuran disk, jumlah vCPU instance, dan ukuran blok I/O, di antara faktor lainnya.
Memasang disk multi-penulis ke beberapa instance virtual machine tidak memengaruhi performa atau biaya agregat. Setiap mesin memiliki batas performa per disk yang sama.

Untuk mempelajari cara berbagi persistent disk di antara beberapa VM, baca artikel Berbagi persistent disk antar-VM.

Berbagi volume Persistent Disk zona antara instance VM

Bagian ini menjelaskan berbagai metode untuk berbagi volume Persistent Disk zona antara beberapa VM.

Membagikan disk dalam mode hanya baca antara beberapa VM

Anda dapat memasang volume Persistent Disk non-boot ke lebih dari satu VM dalam mode hanya baca, sehingga Anda dapat berbagi data statis antara beberapa VM. Berbagi data statis antara beberapa VM dari satu volume Persistent Disk lebih murah daripada mereplikasi data Anda ke disk unik untuk setiap VM.

Jika Anda perlu berbagi ruang penyimpanan dinamis antar beberapa VM, Anda dapat menggunakan salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud, buka halaman Instance VM.

    Buka instance VM

  2. Dalam daftar VM di project Anda, klik nama VM tempat Anda ingin memasang disk. Halaman detail VM instance akan terbuka.

  3. Di halaman detail instance, klik Edit.

  4. Di bagian Additional disks, klik salah satu opsi berikut:

    1. Tambahkan disk untuk menambahkan disk dalam mode hanya baca ke VM.
    2. Pasang disk yang ada untuk memilih disk yang ada dan pasang dalam mode hanya baca ke VM Anda.
  5. Tentukan opsi lain untuk disk Anda.

  6. Klik Done untuk menerapkan perubahan.

  7. Klik Save untuk menerapkan perubahan ke VM.

  8. Menghubungkan ke VM dan memasang disk.

  9. Ulangi proses ini untuk menambahkan disk ke VM lain dalam mode hanya baca.

gcloud

Di gcloud CLI, gunakan perintah compute instances attach-disk dan tentukan flag --mode dengan opsi ro.

gcloud compute instances attach-disk INSTANCE_NAME \
  --disk DISK_NAME \
  --mode ro

Ganti kode berikut:

  • INSTANCE_NAME: nama VM tempat Anda ingin memasang volume Persistent Disk zona
  • DISK_NAME: nama disk yang ingin dipasang

Setelah Anda memasang disk, hubungkan ke VM dan pasang disk.

Ulangi perintah ini untuk setiap VM tempat Anda ingin menambahkan disk ini dalam mode hanya baca.

Java

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Java Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


import com.google.cloud.compute.v1.AttachDiskInstanceRequest;
import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class AttachDisk {

  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 Cloud project you want to use.
    String projectId = "your-project-id";

    // Name of the zone in which the instance you want to use resides.
    String zone = "zone-name";

    // Name of the compute instance you want to attach a disk to.
    String instanceName = "instance-name";

    // Full or partial URL of a persistent disk that you want to attach. This can be either
    // be a regional or zonal disk.
    // Valid formats:
    //     * https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/disks/{disk_name}
    //     * /projects/{project}/zones/{zone}/disks/{disk_name}
    //     * /projects/{project}/regions/{region}/disks/{disk_name}
    String diskLink = String.format("/projects/%s/zones/%s/disks/%s",
        "project", "zone", "disk_name");

    // Specifies in what mode the disk will be attached to the instance. Available options are
    // `READ_ONLY` and `READ_WRITE`. Disk in `READ_ONLY` mode can be attached to
    // multiple instances at once.
    String mode = "READ_ONLY";

    attachDisk(projectId, zone, instanceName, diskLink, mode);
  }

  // Attaches a non-boot persistent disk to a specified compute instance.
  // The disk might be zonal or regional.
  // You need following permissions to execute this action:
  // https://cloud.google.com/compute/docs/disks/regional-persistent-disk#expandable-1
  public static void attachDisk(String projectId, String zone, String instanceName, String diskLink,
      String mode)
      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. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      AttachDiskInstanceRequest attachDiskInstanceRequest = AttachDiskInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstance(instanceName)
          .setAttachedDiskResource(AttachedDisk.newBuilder()
              .setSource(diskLink)
              .setMode(mode)
              .build())
          .build();

      Operation response = instancesClient.attachDiskAsync(attachDiskInstanceRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Attach disk failed! " + response);
        return;
      }
      System.out.println("Attach disk - operation status: " + response.getStatus());
    }
  }
}

Python

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Python Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

def attach_disk(
    project_id: str, zone: str, instance_name: str, disk_link: str, mode: str
) -> None:
    """
    Attaches a non-boot persistent disk to a specified compute instance. The disk might be zonal or regional.

    You need following permissions to execute this action:
    https://cloud.google.com/compute/docs/disks/regional-persistent-disk#expandable-1

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone:name of the zone in which the instance you want to use resides.
        instance_name: name of the compute instance you want to attach a disk to.
        disk_link: full or partial URL to a persistent disk that you want to attach. This can be either
            regional or zonal disk.
            Expected formats:
                * https://www.googleapis.com/compute/v1/projects/[project]/zones/[zone]/disks/[disk_name]
                * /projects/[project]/zones/[zone]/disks/[disk_name]
                * /projects/[project]/regions/[region]/disks/[disk_name]
        mode: Specifies in what mode the disk will be attached to the instance. Available options are `READ_ONLY`
            and `READ_WRITE`. Disk in `READ_ONLY` mode can be attached to multiple instances at once.
    """
    instances_client = compute_v1.InstancesClient()

    request = compute_v1.AttachDiskInstanceRequest()
    request.project = project_id
    request.zone = zone
    request.instance = instance_name
    request.attached_disk_resource = compute_v1.AttachedDisk()
    request.attached_disk_resource.source = disk_link
    request.attached_disk_resource.mode = mode

    operation = instances_client.attach_disk(request)

    wait_for_extended_operation(operation, "disk attachement")

REST

Di API, buat permintaan POST ke metode metode compute.instances.attachDisk. Dalam isi permintaan, tentukan parameter mode sebagai READ_ONLY.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/attachDisk

{
 "source": "zones/ZONE/disks/DISK_NAME",
 "mode": "READ_ONLY"
}

Ganti kode berikut:

  • INSTANCE_NAME: nama VM tempat Anda ingin memasang volume Persistent Disk zona
  • PROJECT_ID: project ID Anda
  • ZONE: zona tempat disk Anda berada
  • DISK_NAME: nama disk yang Anda pasang

Setelah Anda memasang disk, hubungkan ke VM dan pasang disk.

Ulangi permintaan ini untuk setiap VM tempat Anda ingin menambahkan disk ini dalam mode hanya baca.

Berbagi volume Persistent Disk SSD dalam mode multi-penulis antara VM

Anda dapat berbagi volume Persistent Disk SSD dalam mode multi-penulis antara VM N2 di zona yang sama. Lihat mode multi-penulis Persistent Disk untuk mengetahui detail tentang cara kerja mode ini. Anda dapat membuat dan memasang volume Persistent Disk multi-penulis menggunakan proses berikut:

gcloud

Buat dan tambahkan volume Persistent Disk zona menggunakan gcloud CLI:

  1. Gunakan perintah perintah gcloud beta compute disks create untuk membuat volume Persistent Disk zona. Sertakan tanda --multi-writer untuk menunjukkan bahwa disk harus dapat dibagikan di antara VM dalam mode multi-penulis.

    gcloud beta compute disks create DISK_NAME \
       --size DISK_SIZE \
       --type pd-ssd \
       --multi-writer
    

    Ganti kode berikut:

    • DISK_NAME: nama disk baru
    • DISK_SIZE: ukuran disk baru dalam GB Ukuran yang dapat diterima berkisar dari 1 GB hingga 65.536 GB untuk volume Persistent Disk SS, atau 200 GB hingga 65.536 GB untuk volume Persistent Disk standar dalam mode multi-penulis.
  2. Setelah membuat disk, pasang ke VM yang berjalan atau dihentikan dengan jenis mesin N2. Gunakan perintah gcloud compute instances attach-disk:

    gcloud compute instances attach-disk INSTANCE_NAME \
       --disk DISK_NAME
    

    Ganti kode berikut:

    • INSTANCE_NAME: nama VM N2 tempat Anda menambahkan volume Persistent Disk zona baru
    • DISK_NAME: nama disk baru yang Anda pasang ke VM
  3. Ulangi perintah gcloud compute instances attach-disk, tetapi ganti INSTANCE_NAME` dengan nama VM kedua Anda.

Setelah Anda membuat dan memasang disk baru ke VM, format dan pasang disk menggunakan sistem file disk bersama. Sebagian besar sistem file tidak mampu menggunakan penyimpanan bersama. Pastikan sistem file Anda mendukung kemampuan ini sebelum menggunakannya dengan Persistent Disk multi-penulis. Anda tidak dapat memasang disk ke beberapa VM menggunakan proses yang sama seperti yang biasa Anda gunakan untuk memasang disk ke satu VM.

REST

Gunakan Compute Engine API untuk membuat dan memasang volume Persistent Disk SSD ke VM N2 dalam mode multi-penulis.

  1. Di API, buat permintaan POST untuk membuat volume Persistent Disk zona menggunakan metode disks.insert. Sertakan properti name, sizeGb, dan type. Untuk membuat disk baru ini sebagai disk non-booting kosong dan tidak berformat, jangan tentukan gambar sumber atau snapshot sumber untuk disk ini. Sertakan properti multiWriter dengan nilai True untuk menunjukkan bahwa disk harus dapat dibagikan di antara VM dalam mode multi-penulis.

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/disks
    
    {
    "name": "DISK_NAME",
    "sizeGb": "DISK_SIZE",
    "type": "zones/ZONE/diskTypes/pd-ssd",
    "multiWriter": "True"
    }
    

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • ZONE: zona tempat VM dan disk baru Anda berada
    • DISK_NAME: nama disk baru
    • DISK_SIZE: ukuran disk baru dalam GB Ukuran yang dapat diterima berkisar dari 1 GB hingga 65.536 GB untuk volume Persistent Disk SS, atau 200 GB hingga 65.536 GB untuk volume Persistent Disk standar dalam mode multi-penulis.
  2. Buat permintaan POST ke metode compute.instances.attachDisk, dan sertakan URL ke volume Persistent Disk zona yang baru saja Anda buat:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/attachDisk
    
    {
    "source": "/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME"
    }
    

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • ZONE: zona tempat VM dan disk baru Anda berada
    • INSTANCE_NAME: nama VM tempat Anda menambahkan volume Persistent Disk baru.
    • DISK_NAME: nama disk baru
  3. Ulangi perintah disks.insert, tetapi tentukan VM kedua.

Setelah Anda membuat dan memasang disk baru ke VM, format dan pasang disk menggunakan sistem file disk bersama. Sebagian besar sistem file tidak mampu menggunakan penyimpanan bersama. Pastikan sistem file Anda mendukung kemampuan ini sebelum menggunakannya dengan Persistent Disk multi-penulis.

Langkah selanjutnya