Condividi volumi di dischi permanenti tra VM

Puoi collegare un volume di disco permanente SSD in modalità multi-writer a un massimo di due istanze di macchine virtuali (VM) N2 contemporaneamente, in modo che entrambe le VM possano eseguire operazioni di lettura e scrittura sul disco. Per abilitare la modalità multi-writer per i nuovi volumi di Persistent Disk, crea un nuovo volume di Persistent Disk e specifica il flag --multi-writer nell'interfaccia alla gcloud CLI o nella proprietà multiWriter nell'API Compute Engine.

I volumi di Persistent Disk in modalità multi-writer forniscono una funzionalità di archiviazione a blocchi condivisa e rappresentano una base infrastrutturale per la creazione di sistemi di archiviazione distribuiti e di servizi simili ad alta disponibilità. Quando utilizzi volumi di dischi permanenti in modalità multi-writer, scegli un sistema software di archiviazione con scale out in grado di coordinare l'accesso ai dispositivi Persistent Disk su più VM. Esempi di questi sistemi di archiviazione includono Lustre e IBM Spectrum Scale. La maggior parte dei file system a VM singole, come EXT4, XFS e NTFS, non è progettata per essere utilizzata con l'archiviazione a blocchi condivisa. Per maggiori informazioni, consulta le best practice in questo documento. Se hai bisogno di uno spazio di archiviazione file completamente gestito, puoi montare una condivisione file Filestore sulle VM di Compute Engine.

I volumi di Persistent Disk in modalità multi-writer supportano un sottoinsieme di comandi SCSI-3 Persistent Reservations (SCSI PR). Le applicazioni ad alta disponibilità possono utilizzare questi comandi per le configurazioni di recinzione I/O e failover.

Sono supportati i seguenti comandi SCSI PR:

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

Prima di iniziare

  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità per l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine nel seguente modo.

    Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:

    Console

    Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.

    gcloud

    1. Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init
    2. Imposta una regione e una zona predefinite.

    Java

    Per utilizzare gli esempi Java in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.
    2. Per initialize gcloud CLI, esegui questo comando:

      gcloud init
    3. Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login

    Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

    Python

    Per utilizzare gli esempi Python in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.
    2. Per initialize gcloud CLI, esegui questo comando:

      gcloud init
    3. Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login

    Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

    REST

    Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, devi utilizzare le credenziali che fornisci a gcloud CLI.

      Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init

Limitazioni

  • Disponibile solo per i volumi di Persistent Disk di tipo SSD.
  • Puoi creare un volume di Persistent Disk in modalità multi-writer in qualsiasi zona, ma puoi collegarlo solo alle VM nelle seguenti località:
    • australia-southeast1
    • europe-west1
    • us-central1 (solo us-central1-a e us-central1-c zone)
    • us-east1 (solo us-east1-d zona)
    • us-west1 (solo us-west1-b e us-west1-c zone)
  • Le VM collegate devono avere un tipo di macchina N2.
  • Dimensione minima: 10 GB
  • Numero massimo di VM collegate: 2
  • I volumi di Persistent Disk in modalità multi-writer non supportano le metriche del disco permanente.
  • I dischi in modalità multi-writer non possono passare alla modalità di sola lettura.
  • Non puoi utilizzare immagini disco o snapshot per creare volumi di Persistent Disk in modalità multi-writer.
  • Non puoi creare snapshot o immagini da volumi di Persistent Disk in modalità multi-writer.
  • Limiti di IOPS inferiori. Per i dettagli, consulta Prestazioni del disco.
  • Non puoi ridimensionare un volume di Persistent Disk multi-writer.
  • Quando crei una VM con Google Cloud CLI, non puoi creare un volume di Persistent Disk multi-writer utilizzando il flag --create-disk.

best practice

  • Il fencing di I/O mediante comandi PR SCSI comporta uno stato coerente con l'arresto anomalo dei dati del Persistent Disk. Alcuni file system non hanno coerenza in termini di arresto anomalo e possono quindi danneggiarsi se si utilizzano comandi SCSI PR.
  • Molti file system come EXT4, XFS e NTFS non sono progettati per essere utilizzati con l'archiviazione a blocchi condivisa e non dispongono di meccanismi per sincronizzare o eseguire operazioni che hanno origine da più istanze VM.
  • Prima di utilizzare i volumi di Persistent Disk in modalità multi-writer, assicurati di aver compreso il tuo file system e come può essere utilizzato in modo sicuro con l'archiviazione a blocchi condivisa e l'accesso simultaneo da più VM.

Prestazioni

I volumi di Persistent Disk creati in modalità multi-writer hanno limiti di velocità effettiva e IOPS specifici.

Modalità multi-writer su disco permanente SSD di zona
Numero massimo di IOPS sostenute
IOPS di lettura per GB 30
IOPS di scrittura per GB 30
IOPS di lettura per istanza 15.000-100.000*
IOPS di scrittura per istanza 15.000-100.000*
Velocità effettiva massima sostenuta (MB/s)
Velocità effettiva di lettura per GB 0,48
Velocità effettiva di scrittura per GB 0,48
Velocità effettiva di lettura per istanza 240-1200*
Velocità effettiva di scrittura per istanza 240-1200*
* Le prestazioni relative a IOPS e velocità effettiva del disco permanente dipendono, oltre ad altri fattori, dalle dimensioni del disco, dal numero di vCPU delle istanze e dalla dimensione del blocco I/O.
Il collegamento di un disco multi-writer a più istanze di macchine virtuali non influisce sulle prestazioni o sui costi complessivi. Ogni macchina riceve una quota del limite di prestazioni per disco.

Per scoprire come condividere i dischi permanenti tra più VM, consulta Condividere dischi permanenti tra le VM.

Condividi un volume di Persistent Disk a livello di zona tra istanze VM

Questa sezione illustra i diversi metodi per condividere volumi di Persistent Disk a livello di zona tra più VM.

Condividi un disco in modalità di sola lettura tra più VM

Puoi collegare un volume di Persistent Disk non di avvio a più di una VM in modalità di sola lettura, in modo da condividere i dati statici tra più VM. La condivisione di dati statici tra più VM da un volume di Persistent Disk è meno costosa rispetto alla replica dei dati su dischi unici per le singole VM.

Se hai bisogno di condividere lo spazio di archiviazione dinamico tra più VM, puoi utilizzare una delle seguenti opzioni:

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Nell'elenco delle VM nel progetto, fai clic sul nome della VM a cui vuoi collegare il disco. Si apre la pagina Dettagli istanza VM.

  3. Nella pagina dei dettagli dell'istanza, fai clic su Modifica.

  4. Nella sezione Dischi aggiuntivi, fai clic su una delle seguenti opzioni:

    1. Aggiungi un disco per aggiungere un disco in modalità di sola lettura alla VM.
    2. Collega un disco esistente per selezionare un disco esistente e collegarlo alla VM in modalità di sola lettura.
  5. Specifica altre opzioni per il tuo disco.

  6. Fai clic su Fine per applicare le modifiche.

  7. Fai clic su Salva per applicare le modifiche alla VM.

  8. Connettiti alla VM e monta il disco.

  9. Ripeti questa procedura per aggiungere il disco ad altre VM in modalità di sola lettura.

gcloud

Nell'interfaccia alla gcloud CLI, utilizza il comando compute instances attach-disk e specifica il flag --mode con l'opzione ro.

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

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome della VM a cui vuoi collegare il volume Persistent Disk a livello di zona
  • DISK_NAME: il nome del disco che vuoi collegare

Dopo aver collegato il disco, connettiti alla VM e monta il disco.

Ripeti questo comando per ogni VM in cui vuoi aggiungere questo disco in modalità di sola lettura.

Java

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java disponibili nella guida rapida di Compute Engine sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Compute Engine.

Per eseguire l'autenticazione in Compute Engine, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


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

Prima di provare questo esempio, segui le istruzioni di configurazione di Python disponibili nella guida rapida di Compute Engine sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python di Compute Engine.

Per eseguire l'autenticazione in Compute Engine, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

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

Nell'API, crea una richiesta POST per il metodo compute.instances.attachDisk. Nel corpo della richiesta, specifica il parametro mode come 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"
}

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome della VM a cui vuoi collegare il volume Persistent Disk a livello di zona
  • PROJECT_ID: il tuo ID progetto
  • ZONE: la zona in cui si trova il disco
  • DISK_NAME: il nome del disco che stai collegando

Dopo aver collegato il disco, connettiti alla VM e monta il disco.

Ripeti questa richiesta per ogni VM in cui vuoi aggiungere questo disco in modalità di sola lettura.

Condividere un volume di un disco permanente SSD in modalità multi-writer tra le VM

Puoi condividere un volume di un disco permanente SSD in modalità multi-writer tra VM N2 nella stessa zona. Per i dettagli sul funzionamento di questa modalità, consulta Modalità multi-writer su disco permanente. Puoi creare e collegare volumi di Persistent Disk multi-writer utilizzando la seguente procedura:

gcloud

Crea e collega un volume di Persistent Disk a livello di zona utilizzando gcloud CLI:

  1. Utilizza il comando comando gcloud beta compute disks create per creare un volume di Persistent Disk a livello di zona. Includi il flag --multi-writer per indicare che il disco deve essere condivisibile tra le VM in modalità multi-writer.

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

    Sostituisci quanto segue:

    • DISK_NAME: il nome del nuovo disco
    • DISK_SIZE: la dimensione, in GB, del nuovo disco.
  2. Dopo aver creato il disco, collegalo a qualsiasi VM in esecuzione o arrestata con un tipo di macchina N2. Utilizza il comando gcloud compute instances attach-disk:

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

    Sostituisci quanto segue:

    • INSTANCE_NAME: il nome della VM N2 a cui stai aggiungendo il nuovo volume di Persistent Disk a livello di zona
    • DISK_NAME: il nome del nuovo disco che stai collegando alla VM
  3. Ripeti il comando gcloud compute instances attach-disk, ma sostituisci INSTANCE_NAME con il nome della seconda VM.

Dopo aver creato e collegato un nuovo disco a una VM, formatta e monta il disco utilizzando un file system di disco condiviso. La maggior parte dei file system non è in grado di utilizzare lo spazio di archiviazione condiviso. Verifica che il tuo file system supporti queste funzionalità prima di utilizzarlo con Persistent Disk multi-writer. Non puoi montare il disco su più VM utilizzando lo stesso processo normalmente utilizzato per montare il disco su una singola VM.

REST

Utilizza l'API Compute Engine per creare e collegare un volume di disco permanente SSD alle VM N2 in modalità multi-writer.

  1. Nell'API, costruisci una richiesta POST per creare un volume di Persistent Disk a livello di zona utilizzando il metodo disks.insert. Includi le proprietà name, sizeGb e type. Per creare questo nuovo disco come disco non di avvio vuoto e non formattato, non specificare un'immagine di origine o uno snapshot di origine per questo disco. Includi la proprietà multiWriter con un valore di True per indicare che il disco deve essere condivisibile tra le VM in modalità multi-writer.

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • ZONE: la zona in cui si trovano la VM e il nuovo disco
    • DISK_NAME: il nome del nuovo disco
    • DISK_SIZE: la dimensione, in GB, del nuovo disco.
  2. Crea una richiesta POST per il metodo compute.instances.attachDisk e includi l'URL del volume Persistent Disk a livello di zona appena creato:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • ZONE: la zona in cui si trovano la VM e il nuovo disco
    • INSTANCE_NAME: il nome della VM a cui stai aggiungendo il nuovo volume di Persistent Disk.
    • DISK_NAME: il nome del nuovo disco
  3. Ripeti il comando disks.insert, ma specifica la seconda VM.

Dopo aver creato e collegato un nuovo disco a una VM, formatta e monta il disco utilizzando un file system di disco condiviso. La maggior parte dei file system non è in grado di utilizzare lo spazio di archiviazione condiviso. Verifica che il tuo file system supporti queste funzionalità prima di utilizzarlo con Persistent Disk multi-writer.

Passaggi successivi