Accelera le prestazioni del database utilizzando la cache del disco

Questa pagina descrive come eseguire il provisioning, configurare e utilizzare la cache del disco su AlloyDB Omni per aumentare il rendimento dell'installazione di AlloyDB Omni.

Oltre ai buffer condivisi in-memory PostgreSQL standard, la cache di disco AlloyDB Omni consente di archiviare i buffer su unità di archiviazione rapide come le unità a stato solido (SSD). La memorizzazione nella cache del disco accelera il recupero dei dati nelle installazioni di AlloyDB Omni con directory dei dati situate su unità di archiviazione più lente.

Come i buffer condivisi di PostgreSQL, la cache del disco di AlloyDB Omni non è permanente, il che significa che i dati memorizzati nella cache vengono persi al riavvio.

Per impostazione predefinita, la cache del disco di AlloyDB Omni utilizza tutto lo spazio di archiviazione segnalato dal file system. Puoi definire la quantità di spazio di archiviazione riservata alla memorizzazione nella cache dei dati utilizzando il parametro omni_disk_cache_file_size.

Attivare la cache del disco di AlloyDB Omni

I passaggi per attivare la cache del disco per AlloyDB Omni dipendono dal fatto che AlloyDB Omni venga eseguito in un contenitore o in un cluster Kubernetes.

Single-server

Esegui il provisioning dei dischi e crea un file system

Per la cache del disco AlloyDB Omni, crei un file system su un disco o più dischi e lo monti all'interno di un contenitore con AlloyDB Omni. Inoltre, puoi utilizzare utilità come mdadm o lvm per raggruppare la capacità utilizzando più dischi e qualsiasi file system.

I passaggi che seguono mostrano come utilizzare lvm e ext4 su un'istanza Ubuntu Compute Engine con unità SSD NVMe.

  1. Crea un gruppo di volumi da tutti i dispositivi fisici disponibili:

      nvme_prefix="STORAGE_PREFIX"
      nvme_list=$(ls "$nvme_prefix"*)
      sudo vgcreate VOLUME_GROUP ${nvme_list}

    Sostituisci quanto segue:

    • STORAGE_PREFIX: il prefisso del percorso dei dischi locali di destinazione collegati a una macchina virtuale utilizzando l'interfaccia NVMe (non-volatile memory express). Ad esempio, su Google Cloud, i percorsi dei dispositivi NVMe iniziano sempre con /dev/nvme0n.
    • VOLUME_GROUP: il nome di un gruppo di volumi in cui sono combinate le unità SSD, ad esempio omni-disk-cache-volume.
  2. Per creare un volume logico dalla capacità libera del gruppo di volumi del passaggio precedente, utilizza il seguente comando:

      sudo lvcreate -n LOGICAL_VOLUME -l 100%FREE VOLUME_GROUP

    Sostituisci LOGICAL_VOLUME con il nome di un volume logico trattato come partizione da LVM, ad esempio omni_disk_cache_device.

  3. Crea il file system ext4 sul volume logico. Se necessario, puoi specificare altre opzioni ext4 in base alla sicurezza dei dati.
      sudo mkfs.ext4 /dev/VOLUME_GROUP/LOGICAL_VOLUME
  4. Per creare una directory che funga da punto di montaggio sulla macchina host e montare il file system, utilizza il seguente comando:

      sudo mkdir /OMNI_DISK_CACHE_DIRECTORY
      sudo mount /dev/VOLUME_GROUP/LOGICAL_VOLUME /OMNI_DISK_CACHE_DIRECTORY

    Sostituisci OMNI_DISK_CACHE_DIRECTORY con il nome della directory o un percorso alla directory che funge da punto di montaggio, ad esempio omni_disk_cache_directory.

Monta la directory della cache all'interno di AlloyDB Omni

Prima di attivare la cache del disco per AlloyDB Omni in esecuzione in un contenitore, devi montare la directory della cache all'interno di AlloyDB Omni.

Per informazioni su come installare AlloyDB Omni da un'immagine Docker e personalizzarlo, consulta Personalizzare l'installazione di AlloyDB Omni.

Per montare OMNI_DISK_CACHE_DIRECTORY all'interno del container Docker che esegue AlloyDB Omni, utilizza il seguente comando:

Docker

      sudo docker run --name CONTAINER_NAME \
        -e POSTGRES_PASSWORD=PASSWORD \
        -e PGDATA=/var/lib/postgresql/data/pgdata \
        -v DATA_DIR:/var/lib/postgresql/data \
        -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \
        -d google/alloydbomni
      

Sostituisci quanto segue:

  • CONTAINER_NAME: il nome da assegnare al nuovo contenitore AlloyDB Omni, ad esempio my-omni.
  • PASSWORD: la password per l'amministratore principale del database PostgreSQL.
  • DATA_DIR: il percorso del file system che vuoi che AlloyDB Omni utilizzi per la sua directory di dati.
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: la directory della cache all'interno del contenitore AlloyDB Omni che si mappa al punto di montaggio sulla macchina host, ad esempio in base al valore della directory della cache all'interno del contenitore, /omni_disk_cache_directory, simile a OMNI_DISK_CACHE_DIRECTORY o /disk/cache/inside/container.

Podman

      podman run --name CONTAINER_NAME \
        -e POSTGRES_PASSWORD=PASSWORD \
        -e PGDATA=/var/lib/postgresql/data/pgdata \
        -v DATA_DIR:/var/lib/postgresql/data \
        -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \
        -d docker.io/google/alloydbomni
      

Sostituisci quanto segue:

  • CONTAINER_NAME: il nome da assegnare al nuovo contenitore AlloyDB Omni, ad esempio my-omni.
  • PASSWORD: la password per l'amministratore principale del database PostgreSQL.
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: la directory della cache all'interno del contenitore AlloyDB Omni che si mappa al punto di montaggio sulla macchina host, ad esempio in base al valore della directory della cache all'interno del contenitore, /omni_disk_cache_directory, simile a OMNI_DISK_CACHE_DIRECTORY o /disk/cache/inside/container.

Per concedere le autorizzazioni di accesso completo al OMNI_DISK_CACHE_DIRECTORY montato, utilizza i seguenti comandi:

Docker

      sudo docker exec -it CONTAINER_NAME chown postgres:postgres /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
      sudo docker exec -it CONTAINER_NAME chmod -R a+rw  /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
      

Podman

      sudo podman exec -it CONTAINER_NAME chown postgres:postgres /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
      sudo podman exec -it CONTAINER_NAME chmod -R a+rw  /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
      

Attivare la cache del disco di AlloyDB Omni per AlloyDB Omni in esecuzione in un contenitore

Per attivare la cache su disco AlloyDB Omni per il database, imposta i parametri GUC (Grand Unified Configuration) appropriati dopo aver verificato che la directory della cache montata sia accessibile dall'interno del contenitore Docker.

  1. Per connetterti al database AlloyDB Omni containerizzato come superutente, utilizza il seguente comando:

    Docker

          sudo docker exec -it CONTAINER_NAME psql -h localhost -U postgres
          

    Podman

          sudo podman exec -it CONTAINER_NAME psql -h localhost -U postgres
          
  2. Per impostare il valore dei parametri, utilizza i seguenti comandi all'interno del database AlloyDB Omni:

            alter system set omni_disk_cache_enabled=on;
            alter system set omni_disk_cache_directory='/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER';
          
  3. Per impostazione predefinita, AlloyDB Omni utilizza tutto lo spazio disponibile nel file system. Se necessario, puoi eseguire l'override del valore predefinito utilizzando il parametro omni_disk_cache_file_size.

          alter system set omni_disk_cache_file_size=SIZE_IN_MB;
          
  4. Affinché la modifica dei parametri di configurazione della cache venga applicata, riavvia il contenitore in esecuzione con AlloyDB Omni:

    Docker

          sudo docker restart CONTAINER_NAME
          

    Podman

          sudo podman restart CONTAINER_NAME
          

Kubernetes

Attivare la cache su disco su un volume generico

Puoi attivare la cache del disco utilizzando un volume generico.

Per attivare la cache del disco su un volume generico nell'operatore Kubernetes AlloyDB Omni, devi avere già preparato un volume permanente e un storageClass.

Ad esempio, se utilizzi GKE e non hai il volume permanente e storageClass pronti, assicurati di aver eseguito quanto segue prima di attivare la cache del disco su un volume generico:

  1. Hai creato un cluster con archiviazione locale basata su SSD.
  2. Hai formattato il volume con il file system ext4 utilizzando il passaggio 1 di Eseguire il provisioning statico del volume locale.
  3. Hai creato manualmente un volume permanente per ogni SSD del cluster con l'elemento storageClass che definisce lo spazio di archiviazione permanente su un dispositivo di archiviazione.

Per attivare la cache del disco su un volume generico per il database:

  1. Modifica il file manifest del cluster di database per aggiungere l'attributo ultraFastCache alla sezione features della sezione spec:

        apiVersion: alloydbomni.dbadmin.goog/v1
        kind: DBCluster
        metadata:
          name: CLUSTER_NAME
        spec:
          databaseVersion: "15.7.0"
          primarySpec:
            features:
              ultraFastCache:
                cacheSize: DISK_CACHE_SIZE
                genericVolume:
                  storageClass: "STORAGE_CLASS_NAME"
         ...
          

    Sostituisci quanto segue:

    • DB_CLUSTER_NAME: il nome del cluster di database. Si tratta dello stesso nome del cluster di database dichiarato al momento della creazione.
    • DISK_CACHE_SIZE: le dimensioni della cache, ad esempio 100Gi. Deve essere maggiore di shared_buffers. Questo campo è facoltativo. Se non specifichi il valore di questo campo, AlloyDB Omni utilizza tutto lo spazio rimanente sul disco, il che vale sia per AlloyDB Omni in un contenitore sia in un cluster Kubernetes.
    • STORAGE_CLASS_NAME: il nome del storage class del volume della cache ultraveloce, ad esempio local-storage.
  2. Applica di nuovo il manifest.

Attivare la cache del disco su un volume locale

Se vuoi utilizzare un volume locale, non devi creare un volume permanente. In alternativa, puoi utilizzare la seguente ottimizzazione.

Ad esempio, se utilizzi GKE e non hai il volume persistente e storageClass pronti, assicurati di aver eseguito quanto segue prima di attivare la cache del disco su un volume locale:

  1. Hai creato un cluster con archiviazione locale basata su SSD.
  2. Hai formattato il volume con il file system ext4 utilizzando il passaggio 1 di Eseguire il provisioning statico del volume locale.

Per attivare la cache del disco su un volume locale per il database:

  1. Modifica il file manifest del cluster di database per aggiungere l'attributo ultraFastCache alla sezione features della sezione spec:

        apiVersion: alloydbomni.dbadmin.goog/v1
        kind: DBCluster
        metadata:
          name: CLUSTER_NAME
        spec:
          databaseVersion: "15.7.0"
          primarySpec:
            features:
              ultraFastCache:
                cacheSize: DISK_CACHE_SIZE
                localVolume:
                  path: "LOCAL_VOLUME_PATH"
                  nodeAffinity:
                    required:
                      nodeSelectorTerms:
                      - matchExpressions:
                        - key: "LABEL_KEY"
                          operator: "OPERATOR_VALUE"
                          values:
                          - "LABEL_KEY_VALUE"
        ...
          

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster di database. Si tratta dello stesso nome del cluster di database dichiarato al momento della creazione.
    • DISK_CACHE_SIZE: le dimensioni della cache, ad esempio 100Gi. Deve essere maggiore di shared_buffers. Questo campo è facoltativo. Se non specifichi il valore di questo campo, AlloyDB Omni utilizza tutto lo spazio rimanente sul disco, il che vale sia per AlloyDB Omni in un contenitore sia in un cluster Kubernetes.
    • STORAGE_CLASS_NAME: il nome della classe di archiviazione.
    • LOCAL_VOLUME_PATH: il percorso del volume locale, ad esempio /mnt/disks/raid/0.
    • LABEL_KEY: l'etichetta del nodo per la chiave che funge da indicatore di posizione e facilita la distribuzione uniforme dei pod nel cluster, ad esempio cloud.google.com/gke-local-nvme-ssd.
    • OPERATOR_VALUE: la relazione della chiave con un insieme di valori, ad esempio In. Imposta il parametro su uno dei seguenti valori:
      • In: l'array di valori non deve essere vuoto.
      • NotIn: l'array di valori non deve essere vuoto.
      • Exists: l'array di valori deve essere vuoto.
      • DoesNotExist: l'array di valori deve essere vuoto.
      • Gt: l'array di valori deve avere un singolo elemento, che viene interpretato come un numero intero.
      • Lt: l'array di valori deve avere un singolo elemento, che viene interpretato come un numero intero.
    • LABEL_KEY_VALUE: il valore della chiave dell'etichetta, ad esempio true. Imposta il parametro su un array di valori di stringa come segue:
      • Se l'operatore è In o NotIn, l'array di valori non deve essere vuoto.
      • Se l'operatore è Exists o DoesNotExist, l'array di valori deve essere vuoto.
      • Se l'operatore è Gt o Lt, l'array di valori deve avere un singolo elemento, che viene interpretato come un numero intero.
  2. Applica di nuovo il manifest.

Verifica la configurazione della cache su disco

Dopo aver attivato la cache del disco di AlloyDB Omni, verifica che venga eseguito l'accesso alla cache del disco monitorando le attività di lettura e scrittura sui dischi utilizzando le utilità disponibili come iotop o iostat.

Inoltre, puoi controllare se la cache del disco di AlloyDB Omni è aperta.

I passaggi da seguire per verificare la configurazione della cache del disco per AlloyDB Omni dipendono dal fatto che AlloyDB Omni venga eseguito in un contenitore o in un cluster Kubernetes.

Single-server

Docker

sudo docker logs CONTAINER_NAME 2>&1 | grep "opened omni disk cache"

Podman

sudo podman logs CONTAINER_NAME 2>&1 | grep "opened omni disk cache"

Kubernetes

  kubectl exec -i $DATABASE_POD -c database -n $DBCLUSTER_NAMESPACE -- cat /obs/diagnostic/postgresql.log | grep "opened omni disk cache"

Se la cache del disco è configurata correttamente, nei log viene visualizzato il messaggio Successfully opened omni disk cache ....

Passaggi successivi