Implantar um proxy de armazenamento em cache NFS no espaço do kernel no Compute Engine

Neste tutorial, mostramos como implantar, configurar e testar um proxy de cache do Network File System (NFS) baseado em Linux e no Linux no Compute Engine. A arquitetura descrita neste tutorial foi projetada para um cenário em que os dados somente leitura são sincronizados em nível de byte de um servidor de arquivos de origem NFS (como um servidor de arquivos NFS local) ao Google Cloud ou sincronizadas sob demanda de uma fonte principal da verdade para várias réplicas somente leitura.

Para este tutorial, consideramos que você esteja familiarizado com o seguinte:

  • Criar versões personalizadas do sistema operacional Linux.
  • Instalar e configurar software com scripts de inicialização no Compute Engine.
  • Como configurar e gerenciar um sistema de arquivos NFS.

Esta arquitetura não é compatível com o bloqueio de arquivos. A arquitetura é mais adequada para pipelines que usam nomes de arquivos exclusivos para rastrear versões de arquivos.

Arquitetura

A arquitetura neste tutorial tem um Daemon NFS (KNFSD) de espaço no kernel que atua como um proxy e cache NFS. Essa configuração oferece aos nós de computação baseados na nuvem acesso ao armazenamento local rápido, com a migração de dados quando um cliente NFS os solicita. Os nós do cliente NFS gravam dados diretamente no servidor de arquivos de origem NFS usando o armazenamento em cache de gravação. O diagrama a seguir mostra essa arquitetura:

Arquitetura usando um proxy KNFSD no Google Cloud.

Neste tutorial, você implantará e testará o sistema de proxy KNFSD. Crie e configure um único servidor NFS, um único proxy KNFSD e um único cliente NFS no Google Cloud.

O sistema de proxy KNFSD monta um volume do servidor NFS e exporta esse volume novamente. O cliente NFS monta o volume exportado novamente do proxy. Quando um cliente NFS solicita dados, o proxy KNFSD verifica várias tabelas de cache para determinar se os dados estão no local. Se os dados já estiverem no cache, o proxy KNFSD os exibirá imediatamente. Se os dados solicitados não estiverem no cache, o proxy os migrará, atualizará as tabelas de cache e exibirá os dados. O proxy KNFSD armazena em cache os dados e os metadados do arquivo em nível de byte. Portanto, somente os bytes usados são transferidos conforme solicitados.

O proxy KNFSD tem duas camadas de cache: L1 e L2. L1 é o cache de bloco padrão do sistema operacional que reside na RAM. Quando o volume de dados excede a RAM disponível, o cache L2 é implementado usando o FS-Cache, um módulo do kernel do Linux que armazena dados em cache localmente no disco. Nesta implantação, você usa o SSD local como cache L2, embora seja possível configurar o sistema de várias maneiras.

Para implementar a arquitetura neste tutorial, você usa as ferramentas NFS padrão, que são compatíveis com as versões 2, 3 e 4 do NFS.

Implantação do KNFSD em uma arquitetura híbrida

Em uma arquitetura híbrida, os clientes NFS que estão sendo executados no Google Cloud solicitam dados quando necessário. Essas solicitações são feitas para o proxy KNFSD, que disponibiliza dados do cache local, se houver. Se os dados não estiverem no cache, o proxy gerenciará a comunicação de volta para os servidores locais. O sistema pode montar um ou vários servidores de origem NFS. O proxy gerencia toda a comunicação e a migração de dados necessárias por meio de uma VPN ou de Interconexão dedicada para os servidores de origem NFS locais. O diagrama a seguir mostra essa implantação do KNFSD em uma arquitetura híbrida:

Arquitetura híbrida que usa uma implantação KNFSD.

A conectividade híbrida está além do escopo deste tutorial. Para informações sobre tópicos avançados, como considerações sobre a implantação em uma arquitetura híbrida, escalonamento para alto desempenho e uso de métricas e painéis para solução de problemas e ajustes, consulte Tópicos avançados do fluxo de trabalho de dados.

Objetivos

  • Implante e teste um sistema de proxy KNFSD.
  • Crie e configure os seguintes componentes no Google Cloud:
    • Uma imagem de disco personalizada
    • Um proxy KNFSD
    • Um servidor NFS
    • Um cliente NFS
  • Montar um proxy NFS em um cliente NFS.
  • Copie um arquivo do servidor NFS pelo proxy NFS para o cliente NFS.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Considere o seguinte: Custos de saída de rede para dados gravados no Google Cloud de volta ao armazenamento local, e os custos de conectividade híbrida de dados.

Antes de começar

Para este guia de referência, você precisa de um projeto do Google Cloud. É possível criar um novo projeto ou selecionar um que já foi criado:

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  2. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

  3. Ative a API Compute Engine.

    Ative a API

  4. No console, ative o Cloud Shell.

    Ativar o Cloud Shell

  5. Autentique seu login no terminal do Cloud Shell:

    gcloud auth application-default login
    

    A linha de comando guia você pelas etapas de autorização.

  6. Defina as variáveis de ambiente:

    export GOOGLE_CLOUD_PROJECT=PROJECT_NAME
    gcloud config set project $GOOGLE_CLOUD_PROJECT
    

    Substitua PROJECT_NAME pelo nome do projeto que você criou ou selecionou anteriormente.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Limpeza.

Fazer o download dos arquivos de configuração do tutorial

  1. No Cloud Shell, clone o repositório do GitHub.

    cd ~/
    git clone https://github.com/GoogleCloudPlatform/knfsd-cache-utils.git
    
  2. Defina a tag do Git como uma versão válida conhecida (neste caso, v0.6.4):

    cd ~/knfsd-cache-utils
    git checkout tags/v0.6.4
    
  3. Navegue até o diretório image no seu repositório de código:

     cd ~/knfsd-cache-utils/image
    

Configurar a rede

Para simplificar a implantação, este tutorial usa a rede VPC padrão. Para permitir que você use o SSH para se conectar a vários recursos para fins de configuração e monitoramento, este tutorial também implanta endereços IP externos.

Práticas recomendadas e arquiteturas de referência para o design da VPC foram do escopo deste tutorial. No entanto, ao integrar esses recursos a um ambiente híbrido, recomendamos que você siga as práticas recomendadas, incluindo as seguintes:

Para configurar a rede, faça o seguinte:

  • No Cloud Shell, defina as seguintes variáveis:

    export BUILD_MACHINE_NETWORK=default
    export BUILD_MACHINE_SUBNET=default
    

Criar a máquina de build do proxy NFS

Nesta seção, você cria e faz login em uma VM que atua como máquina de criação de proxy NFS. Em seguida, execute um script de instalação fornecido para atualizar as versões do Kernel e instalar todo o software necessário para o sistema de proxy KNFSD. O script de instalação do software pode levar alguns minutos para ser executado, mas você só precisa executá-lo uma vez.

  1. No Cloud Shell, defina as seguintes variáveis:

    export BUILD_MACHINE_NAME=knfsd-build-machine
    export BUILD_MACHINE_ZONE=us-central1-a
    export IMAGE_FAMILY=knfsd-proxy
    export IMAGE_NAME=knfsd-proxy-image
    
  2. Inicie a instância de VM:

    gcloud compute instances create $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --machine-type=n1-standard-16 \
      --project=$GOOGLE_CLOUD_PROJECT \
      --image-family=ubuntu-2004-lts \
      --image-project=ubuntu-os-cloud \
      --network=$BUILD_MACHINE_NETWORK \
      --subnet=$BUILD_MACHINE_SUBNET \
      --boot-disk-size=20GB \
      --boot-disk-type=pd-ssd \
      --metadata=serial-port-enable=TRUE
    

    Talvez você receba uma mensagem de aviso indicando uma discrepância no tamanho do disco. Você pode ignorar esta mensagem.

  3. Crie um arquivo .tar do software necessário para instalação e, em seguida, copie-o para a máquina de criação:

    tar -czf resources.tgz -C resources .
    gcloud compute scp resources.tgz build@$BUILD_MACHINE_NAME: \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  4. Depois que a VM for iniciada, abra um túnel SSH para ela:

    gcloud compute ssh build@$BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  5. Depois que o túnel SSH for estabelecido e a linha de comando segmentar a instância knfsd-build-machine, execute o script de instalação:

    tar -zxf resources.tgz
    sudo bash scripts/1_build_image.sh
    

    O script clona o repositório Ubuntu Kernel Code, atualiza a versão do kernel e instala softwares adicionais. Como há um clone do repositório envolvido, o script pode levar muito tempo para ser concluído.

  6. Depois que o script de instalação for concluído e exibir um prompt SUCCESS, reinicie a máquina de criação:

    sudo reboot
    

    Quando a máquina de criação for reinicializada, as seguintes mensagens serão exibidas:

    WARNING: Failed to send all data from [stdin]
    ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255]
    

    Esses erros ocorrem enquanto o Cloud Shell reverte da máquina de criação do proxy NFS para a máquina host. Você pode ignorar esses erros.

  7. Depois que a VM for reinicializada, abra novamente um túnel SSH para ela:

    gcloud compute ssh $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  8. Após estabelecer o túnel SSH e acessar a instância nfs-proxy-build na linha de comando, alterne para Root e verifique a versão do SO:

    uname -r
    

    A saída vai ser semelhante a esta, indicando que as atualizações do software foram concluídas:

    linux <$BUILD_MACHINE_NAME> 5.13.*-gcp ...
    

    Se a saída não for semelhante ao exemplo anterior, conclua esse processo para criar a máquina de compilação do proxy NFS novamente.

  9. Limpe o disco local e desligue a máquina de criação:

    sudo bash /home/build/scripts/9_finalize.sh
    

    Os seguintes avisos vão ser exibidos:

    userdel: user build is currently used by process 1431
    userdel: build mail spool (/var/mail/build) not found
    

    Esses avisos acontecem enquanto o Cloud Shell reverte a máquina de criação do proxy NFS para a máquina host. Você pode ignorar esses erros.

Criar a imagem de disco personalizada

Nesta seção, você cria uma imagem personalizada a partir da instância. A imagem personalizada é armazenada em um bucket multirregional do Cloud Storage localizado nos Estados Unidos.

  1. No Cloud Shell, defina as seguintes variáveis:

    export IMAGE_NAME=knfsd-image
    export IMAGE_DESCRIPTION="first knfsd image from tutorial"
    export IMAGE_LOCATION=us
    
  2. Criar a imagem de disco

    gcloud compute images create $IMAGE_NAME \
      --project=$GOOGLE_CLOUD_PROJECT \
      --description="$IMAGE_DESCRIPTION" \
      --source-disk=$BUILD_MACHINE_NAME \
      --source-disk-zone=$BUILD_MACHINE_ZONE \
      --storage-location=$IMAGE_LOCATION
    
  3. Depois que a imagem do disco for criada, exclua a instância:

    gcloud compute instances delete $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE
    
  4. Quando solicitado para continuar, digite Y.

    Ao excluir a instância do $BUILD_MACHINE_NAME, vai ser exibida uma solicitação indicando que os discos anexados na VM serão excluídos. Como você acabou de salvar uma imagem personalizada, não precisa mais desse disco temporário e é seguro excluí-lo.

Criar o servidor de origem NFS

Como mencionado anteriormente, essa arquitetura foi projetada para conectar recursos baseados na nuvem a um servidor de arquivos no local. Para simplificar o processo neste tutorial, crie um recurso padrão que será executado no projeto do Cloud para simular essa conexão. Você nomeia o recurso independente nfs-server. A instalação e a configuração do software estão contidas em um script de inicialização. Para mais informações, examine o script ~/knfsd-cache-utils/tutorial/nfs-server/1_build_nfs-server.sh.

  1. No Cloud Shell, acesse o diretório de scripts nfs-server transferidos por download:

    cd ~/knfsd-cache-utils/tutorial
    
  2. Crie o servidor NFS secundário:

    gcloud compute \
      --project=$GOOGLE_CLOUD_PROJECT instances create nfs-server \
      --zone=$BUILD_MACHINE_ZONE \
      --machine-type=n1-highcpu-2 \
      --maintenance-policy=MIGRATE \
      --image-family=ubuntu-2004-lts \
      --image-project=ubuntu-os-cloud \
      --boot-disk-size=100GB \
      --boot-disk-type=pd-standard \
      --boot-disk-device-name=nfs-server \
      --metadata-from-file startup-script=nfs-server-startup.sh
    

    Est script leva alguns minutos para ser concluído. Talvez você veja uma mensagem de aviso indicando que o tamanho do disco está abaixo de 200 GB. Você pode ignorar esse aviso.

Criar o proxy NFS

Nesta seção, você criará o proxy NFS. Quando o proxy é iniciado, ele configura o armazenamento local, prepara opções de ativação para o servidor NFS e exporta os resultados armazenados em cache. Um script de inicialização fornecido orquestra grande parte desse fluxo de trabalho.

  1. No Cloud Shell, defina as seguintes variáveis:

    export PROXY_NAME=nfs-proxy
    
  2. Crie a VM nfs-proxy:

    gcloud compute instances create $PROXY_NAME \
      --machine-type=n1-highmem-16 \
      --project=$GOOGLE_CLOUD_PROJECT \
      --maintenance-policy=MIGRATE \
      --zone=$BUILD_MACHINE_ZONE \
      --min-cpu-platform="Intel Skylake" \
      --image=$IMAGE_NAME \
      --image-project=$GOOGLE_CLOUD_PROJECT \
      --boot-disk-size=20GB \
      --boot-disk-type=pd-standard \
      --boot-disk-device-name=$PROXY_NAME \
      --local-ssd=interface=NVME \
      --local-ssd=interface=NVME \
      --local-ssd=interface=NVME \
      --local-ssd=interface=NVME \
      --metadata-from-file startup-script=proxy-startup.sh
    

    Talvez você veja uma mensagem de aviso informando que o tamanho do disco está abaixo de 200 GB. Você pode ignorar esse aviso.

    O script de inicialização configura os comandos de ativação do NFS e permite ajustar o sistema. As configurações de versão do NFS, de sincronização ou assíncrona, nocto e actimeo, são algumas das variáveis que podem ser otimizadas por meio do script de inicialização. Para ver mais informações sobre essas configurações, consulte Como otimizar o sistema de arquivos NFS.

    O comando nesta etapa define a sinalização --metadata-from-file, que injeta o script de inicialização no modelo de imagem. Neste tutorial, você usa um script proxy-startup.sh simples. O script inclui algumas variáveis predefinidas e não inclui muitas opções que você pode usar caso se integre ao pipeline. Para casos de uso mais avançados, consulte o repositório knfsd-cache-utils do GitHub.

Criar o cliente NFS

Nesta etapa, você cria um único cliente NFS (chamado nfs-client) para representar o que provavelmente seria um grupo de instâncias gerenciadas (MIG, na sigla em inglês) maior em escala.

  • No Cloud Shell, crie o cliente NFS:

    gcloud compute \
      --project=$GOOGLE_CLOUD_PROJECT instances create nfs-client \
      --zone=$BUILD_MACHINE_ZONE \
      --machine-type=n1-highcpu-8 \
      --network-tier=PREMIUM \
      --maintenance-policy=MIGRATE \
      --image-family=ubuntu-2004-lts \
      --image-project=ubuntu-os-cloud \
      --boot-disk-size=10GB \
      --boot-disk-type=pd-standard \
      --boot-disk-device-name=nfs-client
    

    Talvez você veja uma mensagem de aviso informando que o tamanho do disco está abaixo de 200 GB. Você pode ignorar esse aviso.

Montar o proxy NFS no cliente NFS

Nesta etapa, você abre uma sessão SSH separada no cliente NFS e, em seguida, ativa o proxy NFS. Você vai usar esse mesmo shell para testar o sistema na próxima seção.

  1. No console, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Para se conectar a nfs-client, clique em SSH na coluna Conectar.

  3. Na janela SSH de nfs-client, instale as ferramentas NFS necessárias no nfs-client:

    sudo apt-get install nfs-common -y
    
  4. Crie um ponto de montagem e ative o proxy NFS:

    sudo mkdir /data
    sudo mount -t nfs -o vers=3 nfs-proxy:/data /data
    

Testar o sistema

Todos os seus recursos foram criados. Nesta seção, você vai executar um teste copiando um arquivo do servidor NFS pelo proxy NFS para o cliente NFS. Na primeira vez que você executa esse teste, os dados são provenientes do servidor de origem. Isso pode levar mais de um minuto.

Na segunda vez que você executa esse teste, os dados são exibidos a partir de um cache armazenado nos SSDs locais do proxy NFS. Nessa transferência, leva muito menos tempo para copiar dados, o que valida que o armazenamento em cache está acelerando a transferência de dados.

  1. Na janela SSH de nfs-client que você abriu na seção anterior, copie o arquivo test e visualize a saída correspondente:

    time dd if=/data/test.data of=/dev/null iflag=direct bs=1M status=progress
    

    A saída é semelhante à seguinte, que contém uma linha que mostra o tamanho do arquivo, o tempo de transferência e as velocidades de transferência:

    10737418240 bytes (11 GB, 10 GiB) copied, 88.5224 s, 121 MB/s
    real    1m28.533s
    

    Nessa transferência, o arquivo é veiculado do disco permanente do servidor NFS, o que é limitado pela velocidade do disco do servidor NFS.

  2. Execute o mesmo comando uma segunda vez:

    time dd if=/data/test.data of=/dev/null iflag=direct bs=1M status=progress
    

    A saída é semelhante à seguinte, que contém uma linha que mostra o tamanho do arquivo, o tempo de transferência e as velocidades de transferência:

    10737418240 bytes (11 GB, 10 GiB) copied, 9.41952 s, 948 MB/s
    real    0m9.423s
    

    Nessa transferência, o arquivo é exibido do cache no proxy NFS, para que seja concluído mais rapidamente.

Você concluiu a implantação e os testes do proxy de armazenamento em cache KNFSD.

Tópicos avançados do fluxo de trabalho

Esta seção inclui informações sobre como implantar em uma arquitetura híbrida, escalonar para alto desempenho e usar métricas e painéis para solução de problemas e ajustes.

Características do desempenho e dimensionamento de recursos

Como observado anteriormente, este tutorial usa um único proxy KNFSD. Portanto, o escalonamento do sistema envolve a modificação dos recursos de proxy individuais para otimizar para CPU, RAM, rede, capacidade de armazenamento ou desempenho. Neste tutorial, você implantou o KNFSD em uma única VM do Compute Engine com as seguintes opções:

  • 16 vCPUs, 104 GB de RAM (n1-highmem-16).
    • Com 16 vCPUs e uma arquitetura de Sandy Bridge ou mais recente, você permite uma velocidade máxima de rede de 32 Gbps.
  • Disco permanente de 10 GB como um disco de inicialização
  • 4 discos SSD locais Essa configuração fornece um sistema de arquivos de alta velocidade e 1, 5 TB.

Embora esteja além do escopo deste tutorial, você pode dimensionar essa arquitetura criando vários proxies KNFSD em um MIG e usando um balanceador de carga TCP para gerenciar conexões entre os clientes NFS e os proxies NFS. Para mais informações, consulte o repositório knfsd-cache-utils do GitHub (em inglês), que contém scripts do Terraform, código de exemplo para implantação e várias perguntas frequentes que abrangem o escalonamento de cargas de trabalho.

Considerações sobre uma implantação híbrida

Em muitas implantações, a largura de banda da conexão do local para a nuvem é um fator importante a ser considerado ao configurar o sistema. A conectividade híbrida está além do escopo deste tutorial. Para uma visão geral das opções disponíveis, consulte a documentação de conectividade híbrida. Para ver orientações sobre práticas recomendadas e padrões de design, consulte a série Práticas e padrões híbridos e de várias nuvens.

Como explorar métricas

Os painéis podem ser úteis para fornecer feedback sobre as métricas a serem usadas no ajuste de desempenho e na solução de problemas gerais. A exploração de métricas está além do escopo deste tutorial. No entanto, um painel de métricas é disponibilizado quando você implanta o sistema de vários nós definido no repositório knfsd-cache-utils do GitHub (em inglês).

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Exclua o projeto

A maneira mais fácil de eliminar o faturamento é excluir o projeto que você criou para o tutorial.

  1. No console, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir