Partager des volumes de disques persistants entre des VM


Vous pouvez associer un volume de disque persistant SSD en mode écriture simultanée avec deux instances de machines virtuelles (VM) N2 simultanément au maximum, afin que les deux VM puissent lire et écrire sur le disque. Pour activer le mode écriture simultanée pour les nouveaux volumes Persistent Disk, créez un volume de disque persistant et spécifiez l'option --multi-writer dans gcloud CLI ou la propriété multiWriter dans l'API Compute Engine.

Les volumes de disques persistants en mode écriture simultanée offrent une fonctionnalité de stockage de blocs partagé et présentent une base d'infrastructure pour la création d'un système de stockage distribué et de services à disponibilité élevée similaires. Lorsque vous utilisez des volumes de disques persistants en mode écriture simultanée, utilisez un système logiciel de stockage à évolutivité horizontale capable de coordonner l'accès aux disques persistants sur plusieurs VM. Lustre et IBM Spectrum Scale sont des exemples de ces systèmes de stockage. La plupart des systèmes de fichiers de VM uniques, tels que EXT4, XFS et NTFS, ne sont pas conçus pour être utilisés avec le stockage de blocs partagé. Pour en savoir plus, consultez la section Bonnes pratiques de ce document. Si vous avez besoin d'un stockage de fichiers entièrement géré, vous pouvez installer un partage de fichiers Filestore sur vos VM Compute Engine.

Les volumes de disque persistant en mode écriture simultanée sont compatibles avec un sous-ensemble de commandes de réservations persistantes (SCSI PR) SCSI-3. Les applications à haute disponibilité peuvent utiliser ces commandes pour les paramètres de cloisonnement et de basculement E/S.

Les commandes SCSI PR suivantes sont acceptées :

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

Avant de commencer

  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Console

    Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.

    gcloud

    1. Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init
    2. Définissez une région et une zone par défaut.

    Java

    Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init

Restrictions

  • Disponible uniquement pour les volumes de disque persistant de type SSD.
  • Vous pouvez créer un volume de disque persistant en mode écriture simultanée dans n'importe quelle zone, mais vous ne pouvez installer ce disque qu'aux VM des emplacements suivants :
    • australia-southeast1
    • europe-west1
    • us-central1 (zones us-central1-a et us-central1-c uniquement)
    • us-east1 (zone us-east1-d uniquement)
    • us-west1 (zones us-west1-b et us-west1-c uniquement)
  • Les VM installées doivent être du type de machine N2.
  • Taille minimale : 10 Go
  • Nombre maximal de VM associées: 2
  • Les volumes de disque persistant en mode écriture simultanée ne sont pas compatibles avec les métriques de disque persistant.
  • Les disques en mode écriture simultanée ne peuvent pas passer en mode lecture seule.
  • Vous ne pouvez pas utiliser des images disque ou des instantanés pour créer des volumes de disques persistants en mode écriture simultanée.
  • Vous ne pouvez pas créer d'instantanés ou d'images à partir de volumes de disque persistant en mode écriture simultanée.
  • Limites IOPS réduites. Pour en savoir plus, consultez la section Performances des disques.
  • Vous ne pouvez pas redimensionner un volume de disque persistant à écriture simultanée.
  • Lors de la création d'une VM à l'aide de Google Cloud CLI, vous ne pouvez pas créer un volume de disque persistant à écriture simultanée à l'aide de l'option --create-disk.

Bonnes pratiques

  • Le cloisonnement E/S à l'aide des commandes de type SCSI PR permet de créer un état tolérant aux plantages des données sur le disque persistant. Certains systèmes de fichiers n'ont pas de cohérence de plantage et peuvent donc être corrompus si vous utilisez des commandes SCSI PR.
  • De nombreux systèmes de fichiers, tels que EXT4, XFS et NTFS, ne sont pas conçus pour être utilisés avec un stockage de blocs partagé et ne possèdent pas de mécanisme pour synchroniser ou effectuer des opérations provenant de plusieurs instances de VM.
  • Avant d'utiliser des volumes de disques persistants en mode écriture simultanée, assurez-vous de bien comprendre votre système de fichiers et comment il peut être utilisé en toute sécurité avec un stockage de blocs partagé et un accès simultané à partir de plusieurs VM.

Performances

Les volumes Persistent Disk créés en mode écriture simultanée imposent des limites d'IOPS et de débit spécifiques.

Mode écriture simultanée de disques persistants SSD zonaux
Nombre maximal d'IOPS soutenues
IOPS par Go en lecture 30
IOPS par Go en écriture 30
IOPS par instance en lecture 15 000–100 000*
IOPS par instance en écriture 15 000–100 000*
Débit soutenu maximal (Mo/s)
Débit par Go en lecture 0,48
Débit par Go en écriture 0,48
Débit par instance en lecture 240–1 200*
Débit par instance en écriture 240–1 200*
* Les performances d'IOPS et de débit des disques persistants dépendent de facteurs tels que la taille des disques, le nombre de processeurs virtuels de l'instance et la taille des blocs d'E/S.
Associer un disque à écriture simultanée à plusieurs instances de machine virtuelle n'a aucune incidence sur les performances globales ou le coût. En effet, chaque machine se voit attribuer une partie des limites de performance par disque.

Pour savoir comment partager des disques persistants entre plusieurs VM, consultez la page Partager des disques persistants entre des VM.

Partager un volume de disque persistant zonal entre des instances de VM

Cette section explique les différentes méthodes permettant de partager des volumes de disques persistants zonaux entre plusieurs VM.

Partager un disque en mode lecture seule entre plusieurs VM

Vous pouvez associer un volume de disque persistant non amorçable à plusieurs VM en mode lecture seule, ce qui vous permet de partager des données statiques entre plusieurs VM. Le partage de données statiques entre plusieurs VM à partir d'un seul volume de disque persistant est plus économique que de répliquer vos données sur des disques dédiés à chaque VM.

Si vous devez partager un espace de stockage dynamique entre plusieurs VM, vous pouvez procéder selon l'une des méthodes suivantes :

Console

  1. Dans la console Google Cloud, accédez à la page Instances de VM.

    Accéder à la page "Instances de VM"

  2. Dans la liste des VM de votre projet, cliquez sur le nom de la VM à laquelle vous souhaitez associer le disque. La page Détails de l'instance de VM s'affiche.

  3. Sur la page "Détails de l'instance", cliquez sur Modifier.

  4. Dans la section Disques supplémentaires, cliquez sur l'une des options suivantes :

    1. Ajouter un disque pour ajouter un disque en mode lecture seule à la VM.
    2. Associer un disque existant pour sélectionner un disque existant et l'associer en mode lecture seule à votre VM.
  5. Spécifiez d'autres options pour votre disque.

  6. Cliquez sur Terminé pour appliquer les modifications.

  7. Cliquez sur Enregistrer pour appliquer vos modifications à la VM.

  8. Connectez-vous à la VM et installez le disque.

  9. Répétez cette opération pour ajouter le disque à d'autres VM en mode lecture seule.

gcloud

Dans gcloud CLI, utilisez la commande compute instances attach-disk et spécifiez l'option --mode avec l'argument ro.

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

Remplacez les éléments suivants :

  • INSTANCE_NAME: nom de la VM à laquelle vous souhaitez associer le volume de disque persistant zonal.
  • DISK_NAME : le nom du disque que vous souhaitez associer.

Après avoir associé le disque, connectez-vous à la VM et installez le disque.

Répétez cette commande pour chaque VM sur laquelle vous souhaitez ajouter ce disque en mode lecture seule.

Java

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Java Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Python Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Dans l'API, envoyez une requête POST à la méthode compute.instances.attachDisk. Dans le corps de la requête, définissez le paramètre mode en tant que 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"
}

Remplacez les éléments suivants :

  • INSTANCE_NAME: nom de la VM à laquelle vous souhaitez associer le volume de disque persistant zonal.
  • PROJECT_ID : ID de votre projet.
  • ZONE : la zone où se trouve le disque.
  • DISK_NAME : le nom du disque que vous associez.

Après avoir associé le disque, connectez-vous à la VM et installez le disque.

Répétez cette requête pour chaque VM sur laquelle vous souhaitez ajouter ce disque en mode lecture seule.

Partager un volume de disque persistant SSD en mode écriture simultanée entre les VM

Vous pouvez partager un volume de disque persistant SSD en mode écriture simultanée entre des VM N2 de la même zone. Pour plus d'informations sur le fonctionnement de ce mode, consultez la section Mode écriture simultanée de disques persistants. Pour créer et associer des volumes de disques persistants à écriture simultanée, procédez comme suit:

gcloud

Créez et associez un volume de disque persistant zonal avec gcloud CLI :

  1. Utilisez la commande gcloud beta compute disks create pour créer un volume de disque persistant zonal. Incluez l'option --multi-writer pour indiquer que le disque doit être partageable entre les VM en mode écriture simultanée.

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

    Remplacez les éléments suivants :

    • DISK_NAME : le nom du nouveau disque
    • DISK_SIZETaille du nouveau disque, en Go. Les tailles acceptées sont comprises entre 1 Go et 65 536 Go pour les volumes de disques persistants SSD, ou entre 200 Go et 65 536 Go pour les volumes de disque persistant standards en écriture simultanée.
  2. Après avoir créé le disque, associez-le à toutes les VM en cours d'exécution ou arrêtées avec un type de machine N2. Exécutez la commande gcloud compute instances attach-disk :

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

    Remplacez les éléments suivants :

    • INSTANCE_NAME: le nom de la VM N2 à laquelle vous ajoutez le nouveau volume de disque persistant zonal.
    • DISK_NAME : le nom du nouveau disque que vous associez à la VM.
  3. Répétez la commande gcloud compute instances attach-disk, mais remplacez INSTANCE_NAME par le nom de votre deuxième VM.

Après avoir créé et associé un nouveau disque à une VM, formatez et installez le disque à l'aide d'un système de fichiers à disque partagé. La plupart des systèmes de fichiers ne peuvent pas utiliser le stockage partagé. Vérifiez que votre système de fichiers est compatible avec ces fonctionnalités avant de l'utiliser avec un disque persistant en écriture simultanée. Vous ne pouvez pas installer le disque sur plusieurs VM en utilisant le processus que vous auriez en principe utilisé pour installer le disque sur une seule VM.

REST

Utilisez l'API Compute Engine pour créer et associer un volume de disque persistant SSD aux VM N2 en mode écriture simultanée.

  1. Dans l'API, envoyez une requête POST pour créer un volume de disque persistant zonal à l'aide de la méthode disks.insert. Incluez les propriétés name, sizeGb et type. Pour créer un disque non amorçable vide et non formaté, ne spécifiez pas d'image source ni d'instantané source pour ce disque. Incluez la propriété multiWriter ayant la valeur True pour indiquer que le disque doit être partageable entre les VM en mode écriture simultanée.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • ZONE : la zone dans laquelle se trouvent l'instance et le disque.
    • DISK_NAME : le nom du nouveau disque
    • DISK_SIZETaille du nouveau disque, en Go. Les tailles acceptées sont comprises entre 1 Go et 65 536 Go pour les volumes de disques persistants SSD, ou entre 200 Go et 65 536 Go pour les volumes de disque persistant standards en écriture simultanée.
  2. Envoyez une requête POST à la méthode compute.instances.attachDisk et incluez l'URL du volume de disque persistant que vous venez de créer :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • ZONE : la zone dans laquelle se trouvent l'instance et le disque.
    • INSTANCE_NAME : le nom de la VM à laquelle vous ajoutez le nouveau volume de disque persistant.
    • DISK_NAME : le nom du nouveau disque
  3. Répétez la commande disks.insert, mais spécifiez la deuxième VM à la place.

Après avoir créé et associé un nouveau disque à une VM, formatez et installez le disque à l'aide d'un système de fichiers à disque partagé. La plupart des systèmes de fichiers ne peuvent pas utiliser le stockage partagé. Vérifiez que votre système de fichiers est compatible avec ces fonctionnalités avant de l'utiliser avec un disque persistant en écriture simultanée.

Étapes suivantes