Condividi volumi di dischi permanenti tra le 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 leggere e scrivere 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 in gcloud CLI o nella proprietà multiWriter nell'API Compute Engine.

I volumi di Persistent Disk in modalità multi-writer offrono una funzionalità di archiviazione a blocchi condivisa e costituiscono una base infrastrutturale per la creazione di sistemi di archiviazione distribuiti e servizi simili ad alta disponibilità. Se utilizzi volumi di dischi permanenti in modalità multi-writer, utilizza 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 per VM singole, come EXT4, XFS e NTFS, non sono progettati per essere utilizzati con l'archiviazione a blocchi condivisa. Per ulteriori informazioni, consulta le best practice in questo documento. Se hai bisogno di un'archiviazione file completamente gestita, puoi montare una condivisione file di 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 fencing I/O e failover.

Sono supportati i seguenti comandi SCSI PR:

  • IN {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 già fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità dell'utente per ottenere l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi eseguire l'autenticazione in Compute Engine come segue.

    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. Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

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

      Per utilizzare gli Java esempi in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le 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 maggiori informazioni, consulta Set up authentication for a local development environment.

      Python

      Per utilizzare gli Python esempi in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le 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 maggiori informazioni, consulta Set up authentication for a local development environment.

      REST

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

        Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

        gcloud init

      Per maggiori informazioni, consulta Autenticazione per l'utilizzo di REST nella documentazione sull'autenticazione di Google Cloud.

Limitazioni

Le VM devono trovarsi nella stessa zona per condividere un volume di Persistent Disk a livello di zona. Allo stesso modo, i dischi a livello di regione possono essere condivisi solo con VM nelle stesse zone delle repliche del disco.

Limitazioni per la condivisione dei dischi in modalità di sola lettura

  • Per la modalità di sola lettura, il numero massimo di VM che puoi collegare a un disco dipende dal tipo di disco:

    • I volumi di dischi permanenti bilanciati a livello di zona o di regione in modalità di sola lettura supportano solo 10 VM.
    • Per i dischi permanenti SSD, Google consiglia di collegare non più di 100 VM a un singolo volume. Per volumi di dischi permanenti standard, il massimo consigliato è 10 VM.

Limitazioni per la modalità multi-writer

  • La modalità multi-writer è supportata 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 collegare il disco solo alle VM nelle seguenti località:
    • australia-southeast1
    • europe-west1
    • us-central1 (solo zone us-central1-a e us-central1-c)
    • us-east1 (solo zona us-east1-d)
    • us-west1 (solo zone us-west1-b e us-west1-c)
  • Le VM collegate devono avere un tipo di macchina N2.
  • La dimensione minima del disco è 10 GiB.
  • I dischi in modalità multi-writer non supportano il collegamento di più di due VM alla volta. I volumi 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 Persistent Disk in modalità multi-writer.
  • Limiti inferiori di IOPS. Vedi le prestazioni del disco per i dettagli.
  • Non puoi ridimensionare un volume di un Persistent Disk multi-writer.
  • Quando crei una VM utilizzando Google Cloud CLI, non puoi creare un volume di Persistent Disk con multi-writer utilizzando il flag --create-disk.

Best practice

  • La fencing I/O mediante comandi SCSI PR determina uno stato coerente con l'arresto anomalo dei dati del Persistent Disk. Alcuni file system non hanno coerenza in caso di arresto anomalo e potrebbero quindi danneggiarsi se utilizzi 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 comprendere il tuo file system e come può essere utilizzato in sicurezza 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 specifici di IOPS e velocità effettiva.

Modalità multi-writer per il 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*
* Il numero di IOPS dei dischi permanenti e le prestazioni della velocità effettiva dipendono, tra gli altri fattori, dalle dimensioni del disco, dal numero di vCPU dell'istanza e dalle dimensioni del blocco I/O.
Il collegamento di un disco multi-writer a più istanze di macchine virtuali non influisce sulle prestazioni o sui costi aggregati. Ogni macchina riceve una quota del limite delle prestazioni per disco.

Per informazioni su come condividere dischi permanenti tra più VM, consulta Condividere dischi permanenti tra VM.

Condividi un volume di Persistent Disk a livello di zona tra le 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, consentendo di condividere 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 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 alla VM un disco in modalità di sola lettura.
    2. Collega un disco esistente per selezionarne uno esistente e collegarlo in modalità di sola lettura alla tua VM.
  5. Specifica altre opzioni per il 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 questo processo 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 in 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 per la configurazione di Java nella guida rapida di Compute Engine mediante l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Compute Engine.

Per eseguire l'autenticazione su 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 per la configurazione di Python nella guida rapida di Compute Engine mediante l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python di Compute Engine.

Per eseguire l'autenticazione su 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 in 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.

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

Puoi condividere un volume di 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 di 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 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 Le dimensioni accettabili vanno da 1 GB a 65.536 GB per volumi di dischi permanenti SSD o da 200 GB a 65.536 GB per volumi di Persistent Disk standard in modalità multi-writer.
  2. Dopo aver creato il disco, collegalo a qualsiasi VM in esecuzione o arrestata con un tipo di macchina N2. Usa 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 aggiungi 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 tua seconda VM.

Dopo aver creato e collegato un nuovo disco a una VM, formatta e monta il disco utilizzando un file system di dischi condivisi. 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 che utilizzi normalmente 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, crea 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 il valore 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 Le dimensioni accettabili vanno da 1 GB a 65.536 GB per volumi di dischi permanenti SSD o da 200 GB a 65.536 GB per volumi di Persistent Disk standard in modalità multi-writer.
  2. Crea una richiesta POST per il metodo compute.instances.attachDisk e includi l'URL del volume del Persistent Disk a livello di zona che hai 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 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 dischi condivisi. 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