Comparte volúmenes de disco persistente entre VM


Puedes conectar un volumen de disco persistente SSD en modo de multiescritura hasta dos instancias de máquina virtual (VM) N2 simultáneamente para que ambas VM puedan leer y escribir en el disco. A fin de habilitar el modo de multiescritura para los volúmenes de disco persistente nuevos, crea un nuevo volumen de disco persistente y especifica la marca --multi-writer en la CLI de gcloud o la propiedad multiWriter en la API de Compute Engine.

Los volúmenes de disco persistente en modo de multiescritura proporcionan una capacidad de almacenamiento en bloque compartido y presentan una base de infraestructura para compilar sistemas de almacenamiento distribuido y servicios similares con alta disponibilidad. Cuando uses volúmenes de disco persistente en modo de multiescritura, usa un sistema de software de almacenamiento de escalamiento horizontal que tenga la capacidad de coordinar el acceso a los dispositivos de disco persistente en varias VM. Algunos ejemplos de estos sistemas de almacenamiento son Lustre e IBM Spectrum Scale. La mayoría de los sistemas de archivos de VM única, como EXT4, XFS y NTFS, no están diseñados para usarse con almacenamiento en bloque compartido. Para obtener más información, consulta las Prácticas recomendadas en este documento. Si necesitas almacenamiento de archivos completamente administrado, puedes activar un archivo compartido de Filestore en tus VM de Compute Engine.

Los volúmenes de disco persistente en modo de multiescritura admiten un subconjunto de comandos SCSI-3 de Reservas persistentes (SCSI PR). Las aplicaciones con alta disponibilidad pueden usar estos comandos para las configuraciones de protección de E/S y de conmutación por error.

Se admiten los siguientes comandos SCSI PR:

  • EN {INFORME DE CAPABILIDADES, LEE EL ESTADO COMPLETO, LEER SOBRE REFERENCIAS}
  • OUT {REGISTER, REGISTER AND IGNORE KEY, RESERVE, PREEMPT, CLEAR, RELEASE}

Antes de comenzar

  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    Selecciona la pestaña para saber cómo planeas usar las muestras en esta página:

    Consola

    Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud, no necesitas configurar la autenticación.

    gcloud

    1. Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init
    2. Configura una región y una zona predeterminadas.

    Java

    Para usar las muestras de Java de esta página desde un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Instala Google Cloud CLI.
    2. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

      gcloud init
    3. Crea credenciales de autenticación locales para tu Cuenta de Google:

      gcloud auth application-default login

    Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    Python

    Para usar las muestras de Python de esta página desde un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Instala Google Cloud CLI.
    2. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

      gcloud init
    3. Crea credenciales de autenticación locales para tu Cuenta de Google:

      gcloud auth application-default login

    Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init

Restricciones

  • Disponibles solo para volúmenes de disco persistente de tipo SSD.
  • Puedes crear un volumen de disco persistente en modo de multiescritura en cualquier zona, pero solo puedes conectar ese disco a las VM en las siguientes ubicaciones:
    • australia-southeast1
    • europe-west1
    • us-central1 (solo en las zonas us-central1-a y us-central1-c)
    • us-east1 (solo en la zona us-east1-d)
    • us-west1 (solo en las zonas us-west1-b y us-west1-c)
  • Las instancias conectadas deben tener un tipo de máquina N2.
  • Tamaño mínimo: 10 GB
  • Cantidad máxima de VM conectadas: 2
  • Los volúmenes de disco persistente en modo de multiescritura no admiten las métricas de disco persistente.
  • Los discos en modo de multiescritura no pueden cambiarse al modo de solo lectura.
  • No puedes usar imágenes o instantáneas de disco para crear volúmenes de disco persistente en modo de multiescritura.
  • No puedes crear instantáneas o imágenes desde volúmenes de disco persistente en modo de multiescritura.
  • Límites de IOPS más bajos. Consulta el rendimiento del disco para obtener más detalles.
  • No puedes cambiar el tamaño de un volumen de disco persistente de multiescritura.
  • Cuando creas una VM con Google Cloud CLI, no puedes crear un volumen de disco persistente de multiescritura con la marca --create-disk.

prácticas recomendadas

  • La protección de E/S mediante comandos de SCSI da como resultado un estado coherente frente a fallas de datos de discos persistentes. Algunos sistemas de archivos no tienen coherencia frente a fallas y, por lo tanto, pueden dañarse si usas comandos SCSI PR.
  • Muchos sistemas de archivos como EXT4, XFS y NTFS no están diseñados para usarse con el almacenamiento en bloque compartido y no tienen mecanismos para sincronizar o realizar operaciones que se originan en varias instancias de VM.
  • Antes de usar volúmenes de disco persistente en modo de multiescritura, asegúrate de comprender tu sistema de archivos y cómo se puede usar de manera segura con el almacenamiento en bloque compartido y el acceso simultáneo desde varias VM.

Rendimiento

Los volúmenes de disco persistente creados en modo de multiescritura tienen límites específicos de IOPS y capacidad de procesamiento.

Modo de multiescritura en el disco persistente SSD zonal
IOPS máximas sostenidas
IOPS de lectura por GB 30
IOPS de escritura por GB 30
IOPS de lectura por instancia 15,000–100,000*
IOPS de escritura por instancia 15,000–100,000*
Capacidad de procesamiento máxima sostenida (MB/s)
Capacidad de procesamiento de lectura por GB 0.48
Capacidad de procesamiento de escritura por GB 0.48
Capacidad de procesamiento de lectura por instancia 240–1,200*
Capacidad de procesamiento de escritura por instancia 240–1,200*
* Las IOPS y el rendimiento de la capacidad de procesamiento de un disco persistente dependen de la cantidad de CPU virtuales de la instancia, del tamaño del bloque de E/S y del tamaño del disco, entre otros factores.
Conectar un disco de varios escritores a varias instancias de máquina virtual no afecta el rendimiento ni el costo agregado. Cada máquina recibe una parte del límite de rendimiento por disco.

Si deseas obtener información para compartir discos persistentes entre varias VM, consulta Comparte discos persistentes entre VM.

Comparte un volumen de disco persistente zonal entre instancias de VM

En esta sección, se explican los diferentes métodos para compartir volúmenes zonales de discos persistentes entre varias VMs.

Comparte un disco en modo de solo lectura entre varias VM

Puedes conectar un volumen de disco persistente que no sea de inicio a más de una VM en modo de solo lectura, lo que te permite compartir datos estáticos entre varias VMs. Compartir estos datos entre varias VM desde un volumen de disco persistente es menos costoso que replicar los datos en discos únicos para VM individuales.

Si necesitas compartir espacio de almacenamiento dinámico entre varias VMs, puedes usar una de las siguientes opciones:

Consola

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. En la lista de VMs de tu proyecto, haz clic en el nombre de la VM a la que deseas conectar el disco. Se abrirá la página Detalles de instancia de VM.

  3. En la página de detalles de la instancia, haz clic en Editar.

  4. En la sección Discos adicionales, haz clic en una de las siguientes opciones:

    1. Selecciona Agregar un disco para agregar un disco en modo de solo lectura a la VM.
    2. Selecciona Adjuntar un disco existente si quieres seleccionar un disco existente y conectarlo en modo de solo lectura a tu VM.
  5. Especifica otras opciones para tu disco.

  6. Haz clic en Listo para aplicar los cambios.

  7. Haz clic en Guardar para aplicar los cambios a la VM.

  8. Conéctate a la VM y activa el disco.

  9. Repite este proceso para agregar el disco a otras VMs en modo de solo lectura.

gcloud

En la CLI de gcloud, usa el comando compute instances attach-disk y especifica la marca --mode con la opción ro.

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

Reemplaza lo siguiente:

  • INSTANCE_NAME: Es el nombre de la VM a la que deseas conectar el volumen de disco persistente zonal.
  • DISK_NAME: Es el nombre del disco que deseas conectar.

Una vez conectado el disco, conéctate a la VM y activa el disco.

Repite este comando para cada VM en la que quieras agregar este disco en modo de solo lectura.

Java

Java

Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Java de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Python de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

En la API, realiza una solicitud POST al método compute.instances.attachDisk. En el cuerpo de la solicitud, especifica el parámetro mode como 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"
}

Reemplaza lo siguiente:

  • INSTANCE_NAME: Es el nombre de la VM a la que deseas conectar el volumen de disco persistente zonal.
  • PROJECT_ID: el ID de tu proyecto
  • ZONE: Es la zona en la que se encuentra el disco.
  • DISK_NAME: Es el nombre del disco que deseas conectar.

Una vez conectado el disco, conéctate a la VM y activa el disco.

Repite esta solicitud para cada VM donde deseas agregar este disco en modo de solo lectura.

Comparte un volumen de disco persistente SSD en modo de multiescritura entre VM

Puedes compartir un volumen de disco persistente SSD en modo de multiescritura entre las VM N2 en la misma zona. Consulta Modo de multiescritura de disco persistente para obtener detalles sobre cómo funciona este modo. Puedes crear y adjuntar volúmenes de disco persistente de multiescritura mediante el siguiente proceso:

gcloud

Crea y conecta un volumen de disco persistente zonal con la CLI de gcloud:

  1. Usa el comando gcloud beta compute disks create para crear un volumen de disco persistente zonal. Incluye la marca --multi-writer para indicar que el disco debe compartirse entre las VM en modo de multiescritura.

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

    Reemplaza lo siguiente:

    • DISK_NAME: Es el nombre del disco nuevo.
    • DISK_SIZE: El tamaño, en GB, del disco nuevo. Los tamaños aceptables varían de 1 GB a 65,536 GB para volúmenes de disco persistente SSD o de 200 GB a 65,536 GB para volúmenes de disco persistente estándar en modo de multiescritura.
  2. Después de crear el disco, conéctalo a cualquier VM en ejecución o detenida que tenga un tipo de máquina N2. Usa el comando gcloud compute instances attach-disk:

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

    Reemplaza lo siguiente:

    • INSTANCE_NAME: Es el nombre de la VM N2 en la que deseas agregar el volumen de disco persistente zonal nuevo.
    • DISK_NAME: el nombre del disco nuevo que deseas conectar a la VM.
  3. Repite el comando gcloud compute instances attach-disk, pero reemplaza INSTANCE_NAME por el nombre de la segunda VM.

Una vez creado y conectado el disco nuevo a una VM, da formato al disco y actívalo mediante un sistema de archivos de disco compartido. La mayoría de los sistemas de archivos no pueden usar el almacenamiento compartido. Confirma que tu sistema de archivos admita estas capacidades antes de usarlo con el disco persistente de multiescritura. No puedes activar el disco en varias VM con el mismo proceso que usas normalmente para activarlo en una sola VM.

REST

Usa la API de Compute Engine para crear un volumen de disco persistente SSD y conectarlo a VMs N2 en modo de multiescritura.

  1. En la API, realiza una solicitud POST para crear un volumen de disco persistente zonal mediante el método disks.insert. Incluye las propiedades name, sizeGb y type. Si quieres crear este disco nuevo como un disco vacío que no sea de arranque y sin formato, no especifiques una imagen ni una instantánea de origen. Incluye la propiedad multiWriter con un valor de True para indicar que el disco debe compartirse entre las VMs en modo de multiescritura.

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • ZONE: la zona en la que se encuentran la VM y el disco nuevo
    • DISK_NAME: Es el nombre del disco nuevo.
    • DISK_SIZE: El tamaño, en GB, del disco nuevo. Los tamaños aceptables varían de 1 GB a 65,536 GB para volúmenes de disco persistente SSD o de 200 GB a 65,536 GB para volúmenes de disco persistente estándar en modo de multiescritura.
  2. Crea una solicitud POST para el método compute.instances.attachDisk y, luego, incluye la URL en el volumen de disco persistente zonal que acabas de crear:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • ZONE: la zona en la que se encuentran la VM y el disco nuevo
    • INSTANCE_NAME: Es el nombre de la VM en la que deseas agregar el nuevo volumen de disco persistente.
    • DISK_NAME: Es el nombre del disco nuevo.
  3. Repite el comando disks.insert, pero especifica la segunda VM.

Una vez creado y conectado el disco nuevo a una VM, da formato al disco y actívalo mediante un sistema de archivos de disco compartido. La mayoría de los sistemas de archivos no pueden usar el almacenamiento compartido. Confirma que tu sistema de archivos admita estas capacidades antes de usarlo con el disco persistente de multiescritura.

¿Qué sigue?