Use o recurso multi-attach para compartilhar um único disco em nuvem ESSD, ESSD AutoPL ou outro compatível com NVMe entre até 16 instâncias ECS na mesma zona simultaneamente. Alternativamente, compartilhe um ESSD com armazenamento redundante por zona entre nós na mesma região. Combinado ao NVMe Persistent Reservation (PR), o multi-attach oferece às cargas de trabalho acesso a armazenamento compartilhado com controle preciso de permissões de escrita, permitindo compartilhamento eficiente de dados e failover rápido em um cluster ACK.
Casos de uso
-
Compartilhamento de dados: Após um nó gravar dados em um disco NVMe compartilhado, todos os outros nós anexados podem lê-los imediatamente. Várias instâncias que executam o mesmo sistema operacional podem carregar uma única imagem de contêiner armazenada em um disco NVMe, o que reduz custos de armazenamento e melhora o desempenho de leitura e escrita.
-
Failover de alta disponibilidade: Bancos de dados clusterizados tradicionais — incluindo Oracle Real Application Clusters (RAC), SAP High-performance ANalytic Appliance (HANA) e bancos de dados nativos da nuvem com alta disponibilidade (HA) — são vulneráveis a pontos únicos de falha (SPOFs). Um disco NVMe compartilhado mantém o armazenamento acessível mesmo quando um nó de computação falha. Implante sua carga de trabalho no modo primário/secundário: quando a instância primária falhar, execute um comando NVMe PR para revogar as permissões de escrita dela e promova a instância secundária. Isso evita escritas do tipo split-brain e garante a consistência dos dados. A sequência de failover é:
A instância primária do banco de dados (Instância de Banco de Dados 1) falha e para de atender ao tráfego.
Execute um comando NVMe PR para bloquear escritas na Instância de Banco de Dados 1 e conceder acesso de escrita à Instância de Banco de Dados 2.
Restaure a Instância de Banco de Dados 2 para o mesmo estado da Instância de Banco de Dados 1 (por exemplo, reexecutando logs).
A Instância de Banco de Dados 2 assume como instância primária.
O PR faz parte da especificação NVMe. Ele controla as permissões de leitura e escrita no nível do disco para garantir que os nós de computação gravem os dados conforme esperado. Para mais detalhes, consulte NVM Express Base Specification .
-
Aceleração de cache de dados distribuído: Data lakes construídos sobre o Object Storage Service (OSS) oferecem alto throughput de escrita por adição, mas sofrem com alta latência e baixo desempenho de leitura/escrita aleatória. Anexe um disco em nuvem de alta velocidade com suporte a multi-attach como camada de cache compartilhada entre os nós de computação para melhorar significativamente o desempenho de acesso.
-
Machine learning: Após rotular e gravar os dados de amostra, distribua-os entre os nós para treinamento paralelo sem copiar dados pela rede. Cada nó de computação lê diretamente do disco compartilhado, o que reduz a latência de transferência e acelera o treinamento de modelos em grande escala.
Faturamento
O recurso multi-attach não gera taxas adicionais. Recursos compatíveis com o protocolo NVMe seguem seus métodos de faturamento originais. Para preços de discos em nuvem, consulte Volumes do Elastic Block Storage.
Limitações
Um único disco em nuvem NVMe pode ser anexado a no máximo 16 instâncias ECS na mesma zona simultaneamente.
Para ler e gravar em um disco em nuvem a partir de vários nós simultaneamente, monte o disco usando
volumeDevices. Essa ação monta o disco como dispositivo de bloco e não oferece suporte a acesso ao sistema de arquivos. UsevolumeMode: BlockeaccessModes: ReadWriteManyno PersistentVolumeClaim (PVC).Para a lista completa de limites, consulte Limites do recurso multi-attach.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster gerenciado ACK executando Kubernetes 1.20 ou posterior. Para criar um, consulte Criar um cluster gerenciado ACK.
csi-plugin e csi-provisioner na versão v1.24.10-7ae4421-aliyun ou posterior. Para atualizar, consulte Gerenciar os componentes csi-plugin e csi-provisioner.
Pelo menos dois nós na mesma zona compatíveis com o recurso multi-attach. Para famílias de instâncias compatíveis, consulte Limites do recurso multi-attach.
-
Uma aplicação conteinerizada que atenda aos dois requisitos seguintes:
Ofereça suporte a acesso simultâneo ao mesmo disco em nuvem por múltiplas réplicas.
Garanta a consistência dos dados usando NVMe Reservation ou mecanismo equivalente.
Para informações de contexto, consulte:
Exemplo de aplicação
O exemplo de aplicação a seguir demonstra uma eleição de líder baseada em concessão (lease) sobre um dispositivo de bloco NVMe compartilhado. Várias réplicas competem por uma concessão gravada diretamente no disco. Apenas uma réplica detém a concessão por vez. Se ela parar de renová-la, outra réplica a preemptará usando comandos NVMe Reservation.
Notas importantes de design:
O_DIRECTabre o dispositivo de bloco, ignora o cache de páginas e garante que as leituras reflitam o que foi realmente gravado no disco.-
O exemplo utiliza a interface simplificada de Reservation do kernel Linux (ioctls de
<linux/pr.h>). Alternativas que exigem privilégios elevados:C:
ioctl(fd, NVME_IOCTL_IO_CMD, &cmd);CLI:
nvme-cli
Para a especificação completa do NVMe Reservation, consulte NVMe Specification.
Etapa 1: Implantar a aplicação e configure o multi-attach
crie uma StorageClass que habilite o multi-attach, um PVC configurado como dispositivo de bloco e um StatefulSet que utilize a imagem da aplicação de concessão (lease).
-
crie um arquivo chamado
lease.yamlcom o conteúdo a seguir. Substitua o endereço da imagem do contêiner pelo endereço real da sua imagem.ImportanteO NVMe Reservation entra em vigor no nível do nó. Se vários pods forem executados no mesmo nó, eles poderão interferir uns nos outros. Este exemplo usa
podAntiAffinitypara evitar isso.Se o seu cluster tiver nós que não utilizam o protocolo NVMe, configure a afinidade de nó para restringir o agendamento apenas a nós compatíveis com NVMe.
A tabela a seguir resume as principais diferenças entre as configurações de multi-attach e montagem padrão:
Recurso
Campo
Multi-attach
Montagem padrão
StorageClass
parameters.multiAttach"true"Não necessário
PVC
accessModesReadWriteManyReadWriteOncePVC
volumeModeBlockFilesystemMontagem de volume
Método
volumeDevices— acesso direto ao dispositivo de blocovolumeMounts— montagem de sistema de arquivos -
Implante a aplicação:
kubectl apply -f lease.yaml
Etapa 2: verifique o multi-attach e o Reservation
verifique se vários nós podem ler e gravar no mesmo disco
execute o comando a seguir para visualize os logs dos pods:
kubectl logs -l app=lease-test --prefix -f
Saída 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
O pod lease-test-1 lê imediatamente os dados gravados pelo lease-test-0, o que confirme o funcionamento do multi-attach.
verifique se o NVMe Reservation está ativo
-
Obtenha o ID do disco em nuvem:
kubectl get pvc data-disk -ojsonpath='{.spec.volumeName}' -
Faça login em qualquer um dos dois nós e execute o comando a seguir. Substitua
2zxxxxxxxxxxxpela parte apósd-no ID do disco obtido na etapa anterior.nvme resv-report -c 1 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_2zxxxxxxxxxxxSaída esperada:
NVME Reservation status: gen : 3 rtype : 1 regctl : 1 ptpls : 1 regctlext[0] : cntlid : ffff rcsts : 1 rkey : 4745d0c5cd9a2fa4 hostid : 4297c540000daf4a4*****Os valores
rtype: 1(escrita exclusiva) eregctl: 1confirme que o NVMe Reservation está ativo.
verifique se o Reservation bloqueia escritas de um nó com falha
-
Faça login no nó que executa o
lease-test-0e pause o processo para simular uma falha:pkill -STOP -f /usr/local/bin/lease -
Aguarde 30 segundos e verifique os logs:
kubectl logs -l app=lease-test --prefix -fSaída 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 leaseO pod
lease-test-1preemptou a concessão e assumiu como primário. -
Retome o processo pausado no nó
lease-test-0:pkill -CONT -f /usr/local/bin/lease -
verifique os logs novamente:
kubectl logs -l app=lease-test --prefix -fSaída esperada:
[pod/lease-test-0/lease] failed to write lease: Invalid exchangeO pod
lease-test-0não consegue mais gravar no disco. O erroInvalid exchangeconfirme que o Reservation bloqueou com sucesso a E/S de escrita do nó anteriormente primário, e o contêiner de concessão reinicia automaticamente.
Próximos passos
Se o seu disco em nuvem NVMe ficar sem espaço, consulte Expandir um volume de disco em nuvem.