Utilice multi-attach para compartir un único disco en la nube ESSD, ESSD AutoPL u otro compatible con NVMe entre un máximo de 16 instancias ECS dentro de la misma zona de forma simultánea. También puede compartir un disco ESSD con almacenamiento redundante por zona entre nodos de la misma región. Al combinar esta función con NVMe Persistent Reservation (PR), multi-attach proporciona a sus cargas de trabajo acceso a almacenamiento compartido con un control preciso de los permisos de escritura, lo que permite compartir datos de manera eficiente y realizar conmutaciones por error rápidas en un clúster ACK.
Casos de uso
-
Compartición de datos: Cuando un nodo escribe datos en un disco NVMe compartido, todos los demás nodos conectados pueden leerlos de inmediato. Varias instancias que ejecutan el mismo sistema operativo pueden cargar una sola imagen de contenedor almacenada en un disco NVMe, lo que reduce los costos de almacenamiento y mejora el rendimiento de lectura y escritura.
-
Conmutación por error de alta disponibilidad: Las bases de datos en clúster tradicionales, como Oracle Real Application Clusters (RAC), SAP High-performance ANalytic Appliance (HANA) y las bases de datos nativas de la nube de alta disponibilidad (HA), son vulnerables a puntos únicos de fallo (SPOF). Un disco NVMe compartido mantiene el almacenamiento accesible incluso si falla un nodo de cómputo. Despliegue su carga de trabajo en modo principal/secundario: cuando la instancia principal falle, ejecute un comando NVMe PR para revocar sus permisos de escritura y luego promueva la instancia secundaria. Esto evita escrituras tipo split-brain y garantiza la consistencia de los datos. La secuencia de conmutación por error es la siguiente:
La instancia de base de datos principal (Database Instance 1) falla y deja de atender tráfico.
Ejecute un comando NVMe PR para bloquear las escrituras en Database Instance 1 y otorgar acceso de escritura a Database Instance 2.
Restaure Database Instance 2 al mismo estado que tenía Database Instance 1 (por ejemplo, mediante la reproducción de registros).
Database Instance 2 asume el rol de instancia principal.
PR forma parte de la especificación NVMe. Controla los permisos de lectura y escritura a nivel de disco para asegurar que los nodos de cómputo escriban los datos según lo esperado. Para más detalles, consulte NVM Express Base Specification .
-
Aceleración de caché de datos distribuidos: Los lagos de datos construidos sobre Object Storage Service (OSS) ofrecen un alto rendimiento de escritura por anexión, pero presentan alta latencia y bajo rendimiento en lecturas y escrituras aleatorias. Conecte un disco en la nube de alta velocidad con multi-attach habilitado como capa de caché compartida entre los nodos de cómputo para mejorar significativamente el rendimiento de acceso.
-
Aprendizaje automático: Una vez etiquetados y escritos los datos de muestra, distribúyalos entre los nodos para entrenamiento paralelo sin necesidad de copiar datos a través de la red. Cada nodo de cómputo lee directamente del disco compartido, lo que reduce la latencia de transferencia y acelera el entrenamiento de modelos a gran escala.
Facturación
La función multi-attach no genera cargos adicionales. Los recursos compatibles con el protocolo NVMe se facturan según sus métodos de facturación originales. Para consultar los precios de los discos en la nube, véase Elastic Block Storage volumes.
Límites
Un solo disco en la nube NVMe se puede conectar a un máximo de 16 instancias ECS en la misma zona simultáneamente.
Para leer y escribir en un disco en la nube desde varios nodos de forma concurrente, monte el disco mediante
volumeDevices. Esto monta el disco como dispositivo de bloque y no admite acceso al sistema de archivos. UtilicevolumeMode: BlockyaccessModes: ReadWriteManyen su PersistentVolumeClaim (PVC).Para consultar la lista completa de límites, véase Limits of the multi-attach feature.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster administrado ACK que ejecute Kubernetes 1.20 o posterior. Para crear uno, consulte Create an ACK managed cluster.
csi-plugin y csi-provisioner en la versión v1.24.10-7ae4421-aliyun o posterior. Para actualizarlos, consulte Manage the csi-plugin and csi-provisioner components.
Como mínimo dos nodos en la misma zona que admitan la función multi-attach. Para consultar las familias de instancias compatibles, véase Limits of the multi-attach feature.
-
Una aplicación contenerizada que cumpla con los dos requisitos siguientes:
Admite acceso concurrente al mismo disco en la nube desde varias réplicas.
Garantiza la consistencia de los datos mediante NVMe Reservation o un mecanismo equivalente.
Para obtener información de contexto, consulte:
Ejemplo de aplicación
El siguiente ejemplo de aplicación demuestra una elección de líder basada en concesiones (lease) sobre un dispositivo de bloque NVMe compartido. Varias réplicas compiten por una concesión escrita directamente en el disco. Solo una réplica posee la concesión en un momento dado; si deja de renovarla, otra réplica la reemplaza mediante comandos NVMe Reservation.
Notas clave de diseño:
Se utiliza
O_DIRECTpara abrir el dispositivo de bloque, omitiendo la caché de páginas y asegurando que las lecturas reflejen exactamente lo escrito en el disco.-
El ejemplo utiliza la interfaz simplificada de Reservation del kernel de Linux (ioctls de
<linux/pr.h>). Alternativas que requieren privilegios elevados:C:
ioctl(fd, NVME_IOCTL_IO_CMD, &cmd);CLI:
nvme-cli
Para consultar la especificación completa de NVMe Reservation, véase NVMe Specification.
Paso 1: Desplegar la aplicación y configurar multi-attach
Cree una StorageClass que habilite multi-attach, una PVC configurada como dispositivo de bloque y un StatefulSet que utilice la imagen de la aplicación de concesión.
-
Cree un archivo llamado
lease.yamlcon el siguiente contenido. Reemplace la dirección de la imagen del contenedor por la dirección real de su imagen.ImportanteNVMe Reservation surte efecto a nivel de nodo. Si varios pods se ejecutan en el mismo nodo, pueden interferir entre sí. Este ejemplo utiliza
podAntiAffinitypara evitarlo.Si su clúster tiene nodos que no utilizan el protocolo NVMe, configure la afinidad de nodos para restringir la programación a nodos compatibles con NVMe.
La siguiente tabla resume las diferencias clave entre las configuraciones de multi-attach y el montaje estándar:
Recurso
Campo
Multi-attach
Montaje estándar
StorageClass
parameters.multiAttach"true"No obligatorio
PVC
accessModesReadWriteManyReadWriteOncePVC
volumeModeBlockFilesystemMontaje de volumen
Método
volumeDevices— acceso directo a dispositivo de bloquevolumeMounts— montaje de sistema de archivos -
Despliegue la aplicación:
kubectl apply -f lease.yaml
Paso 2: Comprobar multi-attach y Reservation
Comprobar que varios nodos pueden leer y escribir en el mismo disco
Ejecute el siguiente comando para consultar los registros del pod:
kubectl logs -l app=lease-test --prefix -f
Salida esperada:
[pod/lease-test-0/lease] Register as key 4745d0c5cd9a2fa4
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
lease-test-1 lee inmediatamente los datos escritos por lease-test-0, lo que confirma que multi-attach funciona correctamente.
Comprobar que NVMe Reservation está activo
-
Obtenga el ID del disco en la nube:
kubectl get pvc data-disk -ojsonpath='{.spec.volumeName}' -
Inicie sesión en cualquiera de los dos nodos y ejecute el siguiente comando. Reemplace
2zxxxxxxxxxxxcon la parte posterior ad-en el ID del disco obtenido en el paso anterior.nvme resv-report -c 1 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_2zxxxxxxxxxxxSalida esperada:
NVME Reservation status: gen : 3 rtype : 1 regctl : 1 ptpls : 1 regctlext[0] : cntlid : ffff rcsts : 1 rkey : 4745d0c5cd9a2fa4 hostid : 4297c540000daf4a4*****rtype: 1(escritura exclusiva) yregctl: 1confirman que NVMe Reservation está activo.
Comprobar que Reservation bloquea las escrituras desde un nodo fallido
-
Inicie sesión en el nodo que ejecuta
lease-test-0y pause el proceso para simular un fallo:pkill -STOP -f /usr/local/bin/lease -
Espere 30 segundos y luego revise los registros:
kubectl logs -l app=lease-test --prefix -fSalida esperada:
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease [pod/lease-test-1/lease] Remote is dead, preempting [pod/lease-test-1/lease] Register as key 4745d0c5cd9a2fa4 [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed leaselease-test-1ha reemplazado la concesión y asumido el rol de principal. -
Reanude el proceso pausado en el nodo
lease-test-0:pkill -CONT -f /usr/local/bin/lease -
Revise nuevamente los registros:
kubectl logs -l app=lease-test --prefix -fSalida esperada:
[pod/lease-test-0/lease] failed to write lease: Invalid exchangelease-test-0ya no puede escribir en el disco. El errorInvalid exchangeconfirma que Reservation ha bloqueado correctamente la E/S de escritura del nodo anteriormente principal, y el contenedor de concesión se reinicia automáticamente.
Pasos siguientes
Si su disco en la nube NVMe se queda sin espacio, consulte Expand a cloud disk volume.