Esegui il deployment di un proxy di memorizzazione nella cache NFS dello spazio kernel in Compute Engine

Last reviewed 2023-10-03 UTC

Questo tutorial mostra come eseguire il deployment, configurare e testare un proxy di memorizzazione nella cache NFS (Network File System di rete) basato su Linux e in Compute Engine. L'architettura descritta in questo tutorial è progettata per uno scenario in cui i dati di sola lettura vengono sincronizzati a livello di byte da un file server di origine NFS (ad esempio un file server NFS on-premise) a Google Cloud o sincronizzati on demand da una fonte attendibile principale a più repliche di sola lettura.

Questo tutorial presuppone la conoscenza di quanto segue:

  • Creazione di versioni personalizzate del sistema operativo Linux.
  • Installazione e configurazione di software con script di avvio in Compute Engine.
  • Configurazione e gestione di un file system NFS.

Questa architettura non supporta il blocco dei file. L'architettura è più adatta per le pipeline che usano nomi file univoci per tenere traccia delle versioni.

Architettura

L'architettura di questo tutorial include un daemon NFS (KNFSD) dello spazio kernel che agisce come cache e proxy NFS. Questa configurazione consente ai nodi di computing basati su cloud di accedere all'archiviazione rapida locale migrando i dati quando un client NFS li richiede. I nodi client NFS scrivono i dati direttamente nel file server di origine NFS mediante la memorizzazione nella cache write-through. Il seguente diagramma mostra questa architettura:

Architettura che utilizza un proxy KNFSD in Google Cloud.

In questo tutorial, eseguirai il deployment e il test del sistema proxy KNFSD. Puoi creare e configurare un singolo server NFS, un singolo proxy KNFSD e un singolo client NFS, il tutto in Google Cloud.

Il sistema proxy KNFSD monta un volume dal server NFS ed esportalo nuovamente. Il client NFS monta il volume riesportato dal proxy. Quando un client NFS richiede i dati, il proxy KNFSD controlla le varie tabelle della cache per determinare se i dati risiedono localmente. Se i dati sono già nella cache, il proxy KNFSD li fornisce immediatamente. Se i dati richiesti non sono nella cache, il proxy esegue la migrazione dei dati, aggiorna le tabelle della cache e pubblica i dati. Il proxy KNFSD memorizza nella cache sia i dati dei file sia i metadati a livello di byte, quindi solo i byte utilizzati vengono trasferiti quando vengono richiesti.

Il proxy KNFSD ha due livelli di cache: L1 e L2. L1 è la cache a blocchi standard del sistema operativo che risiede nella RAM. Quando il volume di dati supera la RAM disponibile, la cache L2 viene implementata utilizzando FS-Cache, un modulo kernel Linux che memorizza i dati nella cache localmente sul disco. In questo deployment, utilizzerai SSD locale come cache L2, anche se puoi configurare il sistema in diversi modi.

Per implementare l'architettura in questo tutorial, utilizza strumenti NFS standard, compatibili con le versioni 2, 3 e 4 di NFS.

Deployment di KNFSD in un’architettura ibrida

In un'architettura ibrida, i client NFS in esecuzione in Google Cloud richiedono i dati quando sono necessari. Queste richieste vengono inviate al proxy KNFSD, che fornisce i dati dalla cache locale, se presente. Se i dati non sono nella cache, il proxy gestisce la comunicazione con i server on-premise. Il sistema può montare uno o più server di origine NFS. Il proxy gestisce tutte le comunicazioni e la migrazione dei dati necessarie tramite una VPN o Dedicated Interconnect ai server di origine NFS on-premise. Il seguente diagramma mostra questo deployment di KNFSD in un'architettura ibrida:

Architettura ibrida mediante deployment KNFSD.

La connettività ibrida non rientra nell'ambito di questo tutorial. Per informazioni su argomenti avanzati come le considerazioni sul deployment in un'architettura ibrida, la scalabilità per prestazioni elevate e l'utilizzo di metriche e dashboard per la risoluzione dei problemi e l'ottimizzazione, consulta Argomenti avanzati del flusso di lavoro.

Obiettivi

  • Implementazione e test di un sistema proxy KNFSD.
  • Crea e configura i seguenti componenti in Google Cloud:
    • Un'immagine disco personalizzata
    • Un proxy KNFSD
    • Un server NFS
    • Un client NFS
  • Monta un proxy NFS su un client NFS.
  • Copia un file dal server NFS tramite il proxy NFS al client NFS.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Per il tuo utilizzo, considera i costi del traffico in uscita dalla rete per i dati scritti da Google Cloud nell'archiviazione on-premise e i costi per la connettività ibrida.

Prima di iniziare

Per questa guida di riferimento è necessario un progetto Google Cloud. Puoi crearne uno nuovo o selezionare un progetto già creato:

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Attiva l'API Compute Engine.

    Abilita l'API

  4. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

  5. Autentica il tuo accesso nel terminale Cloud Shell:

    gcloud auth application-default login
    

    La riga di comando ti guida nel completamento della procedura di autorizzazione.

  6. Imposta le variabili di ambiente:

    export GOOGLE_CLOUD_PROJECT=PROJECT_NAME
    gcloud config set project $GOOGLE_CLOUD_PROJECT
    

    Sostituisci PROJECT_NAME con il nome del progetto che hai creato o selezionato in precedenza.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Scarica i file di configurazione del tutorial

  1. In Cloud Shell, clona il repository GitHub:

    cd ~/
    git clone https://github.com/GoogleCloudPlatform/knfsd-cache-utils.git
    
  2. Imposta il tag Git su una versione valida nota (in questo caso, v0.9.0):

    cd ~/knfsd-cache-utils
    git checkout tags/v0.9.0
    
  3. Vai alla directory image nel repository di codice:

     cd ~/knfsd-cache-utils/image
    

Configurare la rete

Per semplicità di deployment, questo tutorial utilizza la rete VPC predefinita. Per consentirti di utilizzare SSH per connetterti a varie risorse a scopo di configurazione e monitoraggio, questo tutorial esegue anche il deployment degli indirizzi IP esterni.

Le best practice e le architetture di riferimento per la progettazione di VPC non rientrano nell'ambito di questo tutorial. Tuttavia, quando integri queste risorse in un ambiente ibrido, ti consigliamo di seguire le best practice, tra cui:

Per configurare la rete, segui questi passaggi:

  • In Cloud Shell, imposta le seguenti variabili:

    export BUILD_MACHINE_NETWORK=default
    export BUILD_MACHINE_SUBNET=default
    

Crea la macchina di build del proxy NFS

In questa sezione creerai una VM che funge da build di proxy NFS e quindi potrai accedervi. Esegui quindi uno script di installazione fornito per aggiornare le versioni del kernel e installare tutto il software necessario per il sistema proxy KNFSD. L'esecuzione dello script di installazione del software può richiedere alcuni minuti, ma è sufficiente eseguirlo una sola volta.

  1. In Cloud Shell, imposta le seguenti variabili:

    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. Avvia l'istanza VM:

    gcloud compute instances create $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --machine-type=n1-standard-16 \
      --project=$GOOGLE_CLOUD_PROJECT \
      --image=ubuntu-2004-focal-v20220615 \
      --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
    

    Potresti ricevere un messaggio di avviso che indica una discrepanza di dimensioni del disco. Puoi ignorare questo messaggio.

  3. Crea un file tar del software richiesto da installare e copialo nella macchina di compilazione:

    tar -czf resources.tgz -C resources .
    gcloud compute scp resources.tgz build@$BUILD_MACHINE_NAME: \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  4. Dopo l'avvio della VM, apri un tunnel SSH:

    gcloud compute ssh build@$BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  5. Dopo aver stabilito il tunnel SSH e la riga di comando ha scelto come target l'istanza knfsd-build-machine, esegui lo script di installazione:

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

    Lo script clona il repository Ubuntu Kernel Code, aggiorna la versione del kernel e installa software aggiuntivo. Poiché è coinvolto un clone di repository, il completamento dello script può richiedere molto tempo.

  6. Dopo aver completato lo script di installazione e visualizzato il prompt SUCCESS, riavvia la macchina di compilazione:

    sudo reboot
    

    Al riavvio della macchina di compilazione, vengono visualizzati i seguenti messaggi:

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

    Questi errori si verificano durante il ripristino di Cloud Shell dalla macchina di creazione del proxy NFS alla macchina host. Puoi ignorare questi errori.

  7. Dopo il riavvio della VM, riapri un tunnel SSH:

    gcloud compute ssh $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE \
      --project=$GOOGLE_CLOUD_PROJECT
    
  8. Dopo aver stabilito il tunnel SSH e la riga di comando ha come target l'istanza nfs-proxy-build, passa a Root e controlla la versione del sistema operativo:

    uname -r
    

    L'output è simile al seguente, a indicare che gli aggiornamenti software sono stati eseguiti correttamente:

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

    Se l'output non è simile all'esempio precedente, completa questo processo per creare di nuovo la macchina della build proxy NFS.

  9. Pulisci il disco locale e arresta la macchina di compilazione:

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

    Verranno visualizzati i seguenti avvisi:

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

    Questi avvisi vengono visualizzati mentre Cloud Shell esegue il ripristino dalla macchina della creazione di proxy NFS alla macchina host. Puoi ignorare questi errori.

Crea l'immagine disco personalizzata

In questa sezione creerai un'immagine personalizzata dall'istanza. L'immagine personalizzata è archiviata in un bucket Cloud Storage a più regioni che si trova negli Stati Uniti.

  1. In Cloud Shell, imposta le seguenti variabili:

    export IMAGE_NAME=knfsd-image
    export IMAGE_DESCRIPTION="first knfsd image from tutorial"
    export IMAGE_LOCATION=us
    
  2. Crea l'immagine 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. Dopo aver creato l'immagine disco, elimina l'istanza:

    gcloud compute instances delete $BUILD_MACHINE_NAME \
      --zone=$BUILD_MACHINE_ZONE
    
  4. Quando ti viene chiesto di continuare, inserisci Y.

    Quando elimini l'istanza $BUILD_MACHINE_NAME, viene visualizzato un messaggio che indica che i dischi collegati alla VM verranno eliminati. Poiché hai appena salvato un'immagine personalizzata, non hai più bisogno di questo disco temporaneo e puoi eliminarlo in sicurezza.

Crea il server di origine NFS

Come accennato in precedenza, questa architettura è progettata per connettere le risorse basate su cloud a un file server on-premise. Per semplificare il processo in questo tutorial, creerai una risorsa sostitutiva che viene eseguita nel tuo progetto Google Cloud per simulare questa connessione. La risorsa secondaria deve essere nfs-server. L'installazione e la configurazione del software sono contenute in uno script di avvio. Per saperne di più, esamina lo script ~/knfsd-cache-utils/tutorial/nfs-server/1_build_nfs-server.sh.

  1. In Cloud Shell, vai alla directory degli script nfs-server scaricati:

    cd ~/knfsd-cache-utils/tutorial
    
  2. Crea il tuo server NFS autonomo:

    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
    

    Il completamento dello script può richiedere alcuni minuti. Potresti visualizzare un messaggio di avviso che indica che le dimensioni del disco sono inferiori a 200 GB. Puoi ignorare questo avviso.

Crea il proxy NFS

In questa sezione creerai il proxy NFS. Quando il proxy viene avviato, configura l'archiviazione locale, prepara le opzioni di montaggio per il server NFS ed esporta i risultati memorizzati nella cache. Uno script di avvio fornito orchestra gran parte di questo flusso di lavoro.

  1. In Cloud Shell, imposta la variabile seguente:

    export PROXY_NAME=nfs-proxy
    
  2. Crea la 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
    

    È possibile che venga visualizzato un messaggio di avviso che indica che le dimensioni del disco sono inferiori a 200 GB. Puoi ignorare questo avviso.

    Lo script di avvio configura i comandi di montaggio NFS e ti consente di ottimizzare il sistema. Le impostazioni per la versione NFS, la sincronizzazione o l'asinc, nocto e actimeo sono alcune delle variabili che potresti voler ottimizzare tramite lo script di avvio. Per maggiori informazioni su queste impostazioni, consulta la pagina relativa all'ottimizzazione del file system NFS.

    Il comando in questo passaggio definisce il flag --metadata-from-file, che inserisce lo script di avvio nel modello di immagine. In questo tutorial userai un semplice script proxy-startup.sh. Lo script include alcune variabili preimpostate e non include molte opzioni che potresti voler utilizzare se esegui l'integrazione nella pipeline. Per casi d'uso più avanzati, consulta il repository GitHub di knfsd-cache-utils.

Crea il client NFS

In questo passaggio, creerai un singolo client NFS (denominato nfs-client) per sostituire quello che probabilmente sarebbe un gruppo di istanze gestite più grande su larga scala.

  • In Cloud Shell, crea il tuo client 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
    

    È possibile che venga visualizzato un messaggio di avviso che indica che le dimensioni del disco sono inferiori a 200 GB. Puoi ignorare questo avviso.

Monta il proxy NFS sul client NFS

In questo passaggio, aprirai una sessione SSH separata sul client NFS, quindi installerai il proxy NFS. Userai la stessa shell per testare il sistema nella sezione successiva.

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Per connetterti a nfs-client, nella colonna Connetti fai clic su SSH.

  3. Nella finestra SSH di nfs-client, installa gli strumenti NFS necessari su nfs-client:

    sudo apt-get install nfs-common -y
    
  4. Crea un punto di montaggio e monta il proxy NFS:

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

Testa il sistema

Tutte le risorse sono state create. In questa sezione, eseguirai un test copiando un file dal server NFS tramite il proxy NFS al client NFS. La prima volta che esegui questo test, i dati provengono dal server di origine. L'operazione può richiedere più di un minuto.

La seconda volta che esegui il test, i dati vengono forniti da una cache archiviata negli SSD locali del proxy NFS. In questo trasferimento, la copia dei dati richiede molto meno tempo, il che dimostra che la memorizzazione nella cache accelera il trasferimento dei dati.

  1. Nella finestra SSH di nfs-client aperta nella sezione precedente, copia il file test e visualizza l'output corrispondente:

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

    L'output è simile al seguente, che contiene una riga che mostra le dimensioni del file, la durata e la velocità di trasferimento:

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

    In questo trasferimento, il file viene pubblicato dal disco permanente del server NFS, quindi è limitato dalla velocità del disco del server NFS.

  2. Esegui lo stesso comando una seconda volta:

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

    L'output è simile al seguente, che contiene una riga che mostra le dimensioni del file, la durata e la velocità di trasferimento:

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

    In questo trasferimento, il file viene fornito dalla cache nel proxy NFS, in modo che venga completato più velocemente.

Hai completato l'implementazione e il test del proxy di memorizzazione nella cache KNFSD.

Argomenti avanzati del flusso di lavoro

Questa sezione include informazioni sul deployment in un'architettura ibrida, sulla scalabilità per alte prestazioni e sull'utilizzo di metriche e dashboard per la risoluzione dei problemi e l'ottimizzazione.

Caratteristiche delle prestazioni e dimensionamento delle risorse

Come indicato in precedenza, questo tutorial utilizza un singolo proxy KNFSD. Pertanto, la scalabilità del sistema comporta la modifica delle singole risorse proxy in modo da ottimizzare per CPU, RAM, networking, capacità di archiviazione o prestazioni. In questo tutorial hai eseguito il deployment di KNFSD su una singola VM di Compute Engine con le seguenti opzioni:

  • 16 vCPU, 104 GB di RAM (n1-highmem-16).
    • Con 16 vCPU e un'architettura Sandy Bridge o successiva, consenti una velocità di rete massima di 32 Gbps.
  • un disco permanente da 10 GB come disco di avvio.
  • 4 dischi SSD locali. Questa configurazione fornisce un file system ad alta velocità da 1, 5 TB.

Sebbene non rientri nell'ambito di questo tutorial, puoi scalare questa architettura creando più proxy KNFSD in un gruppo di istanze gestite e utilizzando un bilanciatore del carico TCP per gestire le connessioni tra i client NFS e i proxy NFS. Per ulteriori informazioni, consulta il repository GitHub di knfsd-cache-utils contenente gli script Terraform, il codice di esempio per il deployment e varie domande frequenti relative alla scalabilità dei carichi di lavoro.

Considerazioni per un deployment ibrido

In molti deployment, la larghezza di banda della connessione da on-premise al cloud è un fattore importante da considerare durante la configurazione del sistema. La connettività ibrida non rientra nell'ambito di questo tutorial. Per una panoramica delle opzioni disponibili, consulta la documentazione sulla connettività ibrida. Per indicazioni sulle best practice e sui pattern di progettazione, consulta la serie Creazione di architetture ibride e multi-cloud utilizzando Google Cloud.

Esplorare le metriche

Le dashboard possono essere utili per fornire feedback sulle metriche da utilizzare nell'ottimizzazione delle prestazioni e nella risoluzione dei problemi generali. L'esplorazione delle metriche non rientra nell'ambito di questo tutorial, tuttavia, viene resa disponibile una dashboard delle metriche quando esegui il deployment del sistema multinodo definito nel repository GitHub di knfsd-cache-utils.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi