Uso de volumes de armazenamento em bloco com serviços

O Snowflake oferece suporte a estes tipos de volume de armazenamento para seus aplicativos em contêineres: estágio interno do Snowflake, armazenamento local, volumes de armazenamento de memória e volumes de armazenamento em bloco.

Especificação do armazenamento em bloco na especificação de serviço

Para criar um serviço (incluindo o serviço de trabalho) que usa armazenamento em bloco, você fornece a configuração necessária na especificação do serviço da seguinte forma:

  1. Especifique o campo spec.volumes para definir os volumes de armazenamento em bloco a serem criados.

    volumes:
      - name: <name>
        source: block
        size: <size-in-Gi>
        blockConfig:                             # optional
          initialContents:
            fromSnapshot: <snapshot-name>
          iops: <number-of-operations>
          throughput: <MiB-per-second>
          encryption: SNOWFLAKE_SSE | SNOWFLAKE_FULL
    
    Copy

    Os seguintes campos são obrigatórios:

    • name: nome do volume.

    • source: tipo do volume. Para volume de armazenamento em bloco, o valor é block.

    • size: capacidade de armazenamento do volume de armazenamento em bloco medida em bytes. O valor deve ser sempre um inteiro, especificado usando o sufixo da unidade Gi. Por exemplo, 5Gi significa 5*1024*1024*1024 bytes. O valor do tamanho varia de acordo com os provedores de nuvem:

      • 1Gi a 16384Gi para o AWS e o Azure.

      • 4Gi a 16384Gi para o Google Cloud.

    Os seguintes são campos opcionais:

    • blockConfig.initialContents.fromSnapshot: especifica um instantâneo tirado anteriormente de outro volume para inicializar o volume do bloco. O nome do instantâneo pode ser um identificador de objeto totalmente qualificado, como TUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOT. Além disso, o nome do instantâneo é resolvido em relação ao banco de dados e ao esquema do serviço. Por exemplo, se você criou seu serviço em TUTORIAL_DB.DATA_SCHEMA, então fromSnapshot: MY_SNAPSHOT é equivalente a fromSnapshot: TUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOT.

      Observe o seguinte:

      • O instantâneo deve estar no estado CREATED antes de poder ser usado para criar um volume, caso contrário, a criação do serviço falhará.

      • O tipo de criptografia do instantâneo deve corresponder ao do volume que está sendo criado.

      Use o comando DESCRIBE SNAPSHOT para obter o status e o tipo de criptografia do instantâneo.

    • blockConfig.iops: especifica o número máximo permitido de operações de entrada/saída por segundo. Observe que o tamanho dos dados por operação é limitado a 256 KiB.

      • Para o AWS: o intervalo permitido é de 3000 a 16000, com um padrão de 3000.

      • Para o Azure: o intervalo permitido é de 3000-80000, com um padrão de 3000.

      • Para o Google Cloud:

        • Instâncias de CPU do Google Cloud: o intervalo permitido é de 2000 a 160000 com os seguintes padrões:

          • 2000 IOPS para um tamanho de disco de 4 Gi

          • 2500 IOPS para um tamanho de disco de 5 Gi

          • 3000 IOPS para todos os outros tamanhos de disco

        • Instâncias de GPU do Google Cloud: o Snowflake recomenda especificar apenas a taxa de transferência. blockConfig.iops deve ser 16 * blockConfig.throughput para instâncias de GPU no Google Cloud.

    • blockConfig.throughput: Especifica o pico da taxa de transferência, em MiB/segundo, a ser provisionado para o volume.

      • Para o AWS: o intervalo permitido é de 125 a 1000, com um padrão de 125.

      • Para o Azure: o intervalo permitido é de 125 a 1200, com um padrão de 125.

      • Para o Google Cloud:

        • Instâncias de CPU do Google Cloud: o intervalo permitido é de 140 a 2400, com um padrão de 140.

        • Instâncias de GPU do Google Cloud: o intervalo permitido é de 400 a 1.200.000, com um padrão de 400, mas não inferior a 0,12 por GB do tamanho de volume.

    • blockConfig.encryption: especifique o tipo de criptografia do volume: SNOWFLAKE_SSE ou SNOWFLAKE_FULL. Para obter mais informações, consulte Compatibilidade com criptografia.

    Por exemplo:

    volumes:
      - name: vol-1
        source: block
        size: 200Gi
        blockConfig:
          initialContents:
            fromSnapshot: snapshot1
          iops: 3000
          throughput: 125
    
    Copy
  2. Especifique o campo spec.containers.volumeMount para descrever onde nos contêineres do seu aplicativo montar os volumes de armazenamento em bloco. As informações fornecidas neste campo são as mesmas para todos os volumes de armazenamento suportados.

Sobre IOPS e taxa de transferência

Se o desempenho de IO do serviço não estiver atendendo às suas expectativas e o serviço for afetado pela IO do volume em bloco ou pela taxa de transferência, você pode considerar aumentar o valor de IOPS ou a taxa de transferência. Na implementação atual, quaisquer alterações desse tipo exigem que você recrie o serviço.

É possível revisar essas métricas de plataforma disponíveis para identificar se seu serviço tem gargalos no armazenamento em bloco:

  • container.cpu.usage

  • volume.read.iops

  • volume.write.iops

  • volume.read.throughput

  • volume.write.throughput

Dependendo do provedor de nuvem, aplicam-se as seguintes considerações:

  • Configuração de iops e taxa de transferência para o AWS:

    • Os valore máximos de IOPS que podem ser configurados é de 500 IOPS por GiB de tamanho de volume, até um máximo de 16.000 IOPS. Por exemplo, o IOPS máximo de um volume de 10 GiB pode ser 500 * 10 = 5.000. Portanto, observe que o valor máximo de IOPS de 16.000 só pode ser configurado se seu volume for de 32 GiB ou maior.

    • O rendimento máximo que pode ser configurado é de 1 MiB/segundo para cada 4 IOPS, até um máximo de 1000 MiBs/segundo. Por exemplo, com o padrão de 3.000 IOPS, é possível configurar uma taxa de transferência de até 750 MiB/segundo (3.000/4=750).

  • Configuração de iops e taxa de transferência para o Azure:

    • Após um tamanho de volume de 6 GB, o número permitido de IOPS aumenta em 500 para cada GB além de 6 GB (tipos de discos). O IOPS máximo de um volume de 10GB pode ser 500 * 4 + 3000 = 5000. Portanto, observe que o valor máximo de IOPS de 80.000 só pode ser configurado se o seu volume for 160 GiB ou maior.

    • Após 6 GB, a taxa de transferência máxima que pode ser configurada é de 0,25 MiB/segundo para cada valor de IOPS, até um máximo de 1.200 MiBs/segundo. Por exemplo, com o valor padrão de IOPS 3.000, é possível configurar uma taxa de transferência de até 750 MiB/segundo (3.000 * 0,25 = 750).

  • Configuração de iops e taxa de transferência para o Google Cloud:

    • Para as instâncias de CPU:

      • IOPS são configuráveis até 500 IOPS por Gi do tamanho de volume, com um máximo de 160.000 IOPS. Por exemplo, um volume de 10 Gi pode atingir um máximo de 5.000 IOPS (500 IOPS * 10 Gi). Para atingir o máximo de 160.000 IOPS, é necessário um tamanho de volume de 320 Gi ou maior.

      • É possível configurar uma taxa de transferência máxima de 2400 MiB/segundo, com uma taxa de 1 MiB/segundo para cada 4 IOPS. Por exemplo, 3000 IOPS permite uma taxa de transferência de até 750 MiB/segundo (3000 / 4 = 750).

    • Para as instâncias de GPU:

      • O IOPS não pode ser definido independentemente da taxa de transferência; o IOPS é calculado como 16 multiplicado pelo valor da taxa de transferência. Portanto, especificar a taxa de transferência determina automaticamente o IOPS. A configuração de IOPS não é recomendada para discos usados com instâncias de GPU.

      • Você deve configurar uma taxa de transferência mínima. Deve ser de pelo menos 400 MiB/s, ou 0,12 MiB/s para cada GiB de tamanho de volume, o que for maior.

      • A taxa de transferência configurável é de 1.600 MiB/s por GiB do tamanho de volume, sujeita a um máximo de 1.200.000 MiB/s. Por exemplo, um volume de 10 GiB pode atingir uma taxa de transferência máxima de 16.000 MiB/s (1600 * 10). Observe que o limite superior de 1.200.000 MiB/s só pode ser atingido com volumes de 750 GiB ou mais.

Requisitos de controle de acesso

Se você quiser usar um instantâneo existente (fromSnapshot está na especificação) para inicializar o volume, a função de proprietário do serviço deve ter o privilégio USAGE no instantâneo.

A função de proprietário do serviço também deve ter o privilégio USAGE no banco de dados e no esquema que contêm o instantâneo.

Gerenciamento de instantâneos

Você pode tirar instantâneos do seu volume de armazenamento em bloco e depois usar o backup da seguinte maneira:

  • Use o backup de instantâneo para restaurar um volume de armazenamento em bloco existente.

  • Use o backup de instantâneo como dados iniciais para inicializar um novo volume de armazenamento em bloco ao criar um novo serviço.

Você deve garantir que todas as suas atualizações sejam liberadas para o disco antes de tirar o instantâneo.

O Snowflake fornece os seguintes comandos para criar e gerenciar instantâneos:

Além disso, para restaurar um instantâneo em um volume de armazenamento em bloco existente, você pode executar o comando ALTER SERVICE … RESTORE VOLUME. Observe que você precisa suspender o serviço antes de restaurar um snapshot. Após restaurar um volume, o serviço é retomado automaticamente.

Custos de armazenamento em bloco

Para obter mais informações, consulte a Tabela de consumo do serviço Snowflake.

Quando um volume de armazenamento em bloco é usado com um serviço de trabalho, o Snowflake para de cobrar os custos de armazenamento em bloco depois que o serviço de trabalho é abandonado pelo usuário ou limpo pelo Snowflake após a conclusão.

Compatibilidade com criptografia

Os volumes de armazenamento em bloco e os instantâneos aceitam os mesmos dois modos de criptografia que também são usados para outros armazenamentos gerenciados pelo Snowflake:

  • SNOWFLAKE_SSE: somente criptografia do lado do servidor. Essa é a configuração padrão para clientes que não têm o Tri-Secret-Secure ativado em suas contas do Snowflake.

    O Snowflake usa a criptografia do provedor de serviços de nuvem (CSP) para volumes de armazenamento em bloco e instantâneos.

  • SNOWFLAKE_FULL: criptografia do lado do cliente e do lado do servidor. Essa é a configuração padrão para clientes que têm o Tri-Secret-Secure ativado em suas contas do Snowflake.

    Os dados são criptografados primeiro no cliente (host Snowpark Container Services) antes de serem enviados para um CSP para armazenamento. Cada volume é criptografado com uma chave de volume exclusiva. A mesma chave é usada para criptografar os instantâneos que você cria a partir desse volume.

    Como o Snowflake realiza a criptografia adicional dos dados, há um impacto no desempenho e no uso de recursos associado ao uso de volumes SNOWFLAKE_FULL. O Snowflake usa os mecanismos de criptografia fornecidos pelo kernel do Linux, portanto, o efeito não deve ser significativo. Qualquer impacto no desempenho é provavelmente específico da carga de trabalho, portanto, recomendamos que você identifique gargalos de serviço ou trabalho, aumente a taxa de transferência de volume ou forneça um servidor mais potente.

    Atualmente, não há suporte para rotação de chaves ou rechaveamento para volumes de armazenamento em bloco e instantâneos no Snowflake. Para alterar a chave de criptografia de um volume, crie um novo volume e copie os dados do volume original.

    Para os clientes que têm o Tri-Secret Secure ativado em suas contas, observe que, quando o acesso a uma chave gerenciada pelo cliente é revogado, os dados do volume permanecem disponíveis para os serviços em execução no momento que usam o volume. Recomendamos que você encerre esses serviços quando revogar o acesso à chave gerenciada pelo cliente para que os dados não fiquem disponíveis. Além disso, depois que você revogar a chave, os serviços com volumes criptografados não poderão ser iniciados.

Os instantâneos de volume mantêm o tipo de criptografia do volume de origem. Por exemplo, um instantâneo de um volume SNOWFLAKE_SSE também usa a criptografia SNOWFLAKE_SSE. Quando um instantâneo é usado como conteúdo inicial de um volume ou com o comando ALTER SERVICE … RESTORE VOLUME, o tipo de criptografia deve corresponder ao tipo de criptografia do volume. Caso contrário, o comando falha.

Exemplo

Para obter um exemplo, consulte tutorial. O tutorial fornece instruções passo a passo para criar um serviço com um volume de armazenamento em bloco montado.

Diretrizes e limitações

As seguintes restrições se aplicam a serviços que usam volumes de armazenamento em bloco:

  • Limitações gerais. Se você encontrar algum problema com essas limitações, entre em contato com seu representante de conta.

    • O número máximo de volumes de armazenamento em bloco por serviço é 3.

    • O número máximo de volumes de armazenamento em bloco por conta Snowflake é 100.

    • A tabela a seguir lista o número máximo de volumes de armazenamento em bloco que podem ser montados por nó do pool de computação, dependendo do tipo de instância do nó. O Snowflake garante que as instâncias de serviço que usam volumes de armazenamento em bloco sejam posicionadas de acordo com esses limites. Isso pode resultar em serviços no estado PENDING aguardando recursos adicionais.

      Família de instâncias

      Limite do AWS

      Limite do Azure

      CPU_X64_XS

      22

      3

      CPU_X64_S

      22

      8

      CPU_X64_M

      22

      16

      CPU_X64_L

      22

      32

      HIGHMEM_X64_S

      22

      16

      HIGHMEM_X64_M

      22

      32

      HIGHMEM_X64_L

      22

      32

      GPU_NV_XS (somente Azure)

      n/a

      8

      GPU_NV_S (AWS somente)

      22

      n/a

      GPU_NV_SM (somente Azure)

      n/a

      32

      GPU_NV_M (AWS somente)

      21

      n/a

      GPU_NV_2M (somente Azure)

      n/a

      32

      GPU_NV_3M (somente Azure)

      n/a

      16

      GPU_NV_SL (somente Azure)

      n/a

      32

      GPU_NV_L (AWS somente)

      14

      n/a

    • O número máximo de instantâneos permitido por conta Snowflake é 100.

  • O serviço que usa volumes de armazenamento em bloco deve ter o mesmo número mínimo e máximo de instâncias.

  • Após a criação do serviço, aplica-se o seguinte:

    • Não é possível alterar o número de instâncias de serviço usando o comando ALTER SERVICE … SET … quando um serviço estiver usando volumes de armazenamento em bloco.

    • Não é possível alterar os campos size, iops, throughput ou encryption dos volumes de armazenamento em bloco.

    • Nenhum novo volume de armazenamento em bloco pode ser adicionado, e nenhum volume de armazenamento em bloco existente pode ser removido.

    • Os volumes de armazenamento em bloco são preservados se um serviço for atualizado ou suspenso e retomado. Quando um serviço é suspenso, você continua pagando pelo volume porque ele é preservado. Depois de atualizar ou retomar um serviço, o Snowflake anexa cada volume de armazenamento em bloco ao mesmo ID da instância de serviço de antes.

    • Os volumes de armazenamento em bloco serão excluídos se o serviço for interrompido. Para preservar os dados nos volumes, tire instantâneos dos volumes. Você pode usar os instantâneos mais tarde para inicializar novos volumes.

    • Os volumes de armazenamento em bloco não oferecem suporte a Tri-Secret Secure e Periodic Rekeying. Isso significa que, se a sua conta tiver ativado o Tri-Secret Secure ou o Periodic Rekeying, embora todos os outros dados do Snowflake continuem a ter segurança adicional, as imagens armazenadas nos volumes de armazenamento em bloco do Snowpark Container Services não se beneficiarão dessa segurança adicional.

      Para criar um repositório de imagens em uma conta com Tri-Secret Secure ou Periodic Rekeying, você deve primeiro confirmar que entende e concorda em continuar sem o benefício dessa segurança adicional para seus volumes de armazenamento em bloco. Para confirmar o acordo, um administrador da conta (usuário com a função ACCOUNTADMIN) precisará definir o parâmetro no nível da conta ENABLE_TRI_SECRET_AND_REKEY_OPT_OUT_FOR_SPCS_BLOCK_STORAGE como TRUE.