Acelerar o desempenho do banco de dados usando o cache do disco

Esta página descreve como provisionar, configurar e usar o armazenamento em cache em disco no AlloyDB Omni para aumentar o desempenho da instalação.

Além dos buffers compartilhados em memória padrão do PostgreSQL, o cache de disco do AlloyDB Omni permite armazenar buffers em armazenamentos rápidos, como unidades de estado sólido (SSDs). O cache em disco acelera a recuperação de dados em instalações do AlloyDB Omni com diretórios de dados localizados em armazenamento mais lento.

Assim como os buffers compartilhados do PostgreSQL, o cache de disco do AlloyDB Omni não é persistente, o que significa que os dados em cache são perdidos na reinicialização.

Por padrão, o cache de disco do AlloyDB Omni usa todo o armazenamento informado pelo sistema de arquivos. É possível definir a quantidade de armazenamento reservada para armazenar dados em cache usando o parâmetro omni_disk_cache_file_size.

Ativar o cache de disco do AlloyDB Omni

As etapas usadas para ativar o cache de disco do AlloyDB Omni dependem se você executa o AlloyDB Omni em um contêiner ou em um cluster do Kubernetes.

Servidor único

Provisionar discos e criar um sistema de arquivos

Para o cache de disco do AlloyDB Omni, você cria um sistema de arquivos em um disco ou em vários discos e o monta em um contêiner com o AlloyDB Omni. Além disso, é possível usar utilitários como mdadm ou lvm para agrupar a capacidade usando vários discos e qualquer sistema de arquivos.

As etapas a seguir demonstram o uso de lvm e ext4 em uma instância do Ubuntu Compute Engine usando SSDs NVMe.

  1. Crie um grupo de volumes com todos os dispositivos físicos disponíveis:

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

    Substitua:

    • STORAGE_PREFIX: o prefixo do caminho dos discos locais de destino que são anexados a uma máquina virtual usando a interface NVMe (memória não volátil express). Por exemplo, em Google Cloud, os caminhos do dispositivo NVMe sempre começam com /dev/nvme0n.
    • VOLUME_GROUP: o nome de um grupo de volumes em que os SSDs são combinados, por exemplo, omni-disk-cache-volume.
  2. Para criar um volume lógico com a capacidade livre do grupo de volumes da etapa anterior, use o seguinte comando:

      sudo lvcreate -n LOGICAL_VOLUME -l 100%FREE VOLUME_GROUP

    Substitua LOGICAL_VOLUME pelo nome de um volume lógico que é tratado como uma partição pelo LVM, por exemplo, omni_disk_cache_device.

  3. Crie o sistema de arquivos ext4 no volume lógico. Se necessário, você pode especificar outras opções de ext4 sujeitas à segurança de dados.
      sudo mkfs.ext4 /dev/VOLUME_GROUP/LOGICAL_VOLUME
  4. Para criar um diretório que sirva como ponto de montagem na máquina host e montar o sistema de arquivos, use o seguinte comando:

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

    Substitua OMNI_DISK_CACHE_DIRECTORY pelo nome do diretório ou um caminho para o diretório que serve como ponto de montagem, por exemplo, omni_disk_cache_directory.

Montar o diretório de cache no AlloyDB Omni

Antes de ativar o cache do disco para o AlloyDB Omni em execução em um contêiner, monte o diretório de cache no AlloyDB Omni.

Para saber como instalar e personalizar o AlloyDB Omni usando uma imagem do Docker, consulte Personalizar a instalação do AlloyDB Omni.

Para montar o OMNI_DISK_CACHE_DIRECTORY no contêiner do Docker que executa o AlloyDB Omni, use o seguinte 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
      

Substitua:

  • CONTAINER_NAME: o nome para atribuir o novo contêiner do AlloyDB Omni, por exemplo, my-omni.
  • PASSWORD: a senha do administrador raiz do banco de dados do PostgreSQL.
  • DATA_DIR: o caminho do sistema de arquivos que você quer que o AlloyDB Omni use para o diretório de dados.
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: o diretório de cache dentro do contêiner do AlloyDB Omni que é associado ao ponto de montagem na máquina host. Por exemplo, com base no valor do diretório de cache dentro do contêiner, /omni_disk_cache_directory, semelhante a OMNI_DISK_CACHE_DIRECTORY ou /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
      

Substitua:

  • CONTAINER_NAME: o nome para atribuir o novo contêiner do AlloyDB Omni, por exemplo, my-omni.
  • PASSWORD: a senha do administrador raiz do banco de dados do PostgreSQL.
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: o diretório de cache dentro do contêiner do AlloyDB Omni que é associado ao ponto de montagem na máquina host. Por exemplo, com base no valor do diretório de cache dentro do contêiner, /omni_disk_cache_directory, semelhante a OMNI_DISK_CACHE_DIRECTORY ou /disk/cache/inside/container.

Para conceder permissões de acesso total ao OMNI_DISK_CACHE_DIRECTORY montado, use os seguintes comandos:

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
      

Ativar o cache de disco do AlloyDB Omni para o AlloyDB Omni em execução em um contêiner

Para ativar o cache de disco do AlloyDB Omni no seu banco de dados, defina os parâmetros de configuração unificada (GUC, na sigla em inglês) apropriados depois de garantir que o diretório de cache montado seja acessível dentro do contêiner do Docker.

  1. Para se conectar ao banco de dados AlloyDB Omni contêinerizado como superusuário, use o seguinte 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. Para definir o valor dos parâmetros, use os seguintes comandos no banco de dados AlloyDB Omni:

            alter system set omni_disk_cache_enabled=on;
            alter system set omni_disk_cache_directory='/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER';
          
  3. Por padrão, o AlloyDB Omni usa todo o espaço disponível no sistema de arquivos. É possível substituir o valor padrão usando o parâmetro omni_disk_cache_file_size, se necessário.

          alter system set omni_disk_cache_file_size=SIZE_IN_MB;
          
  4. Para que a mudança nos parâmetros de configuração do cache entre em vigor, reinicie o contêiner em execução com o AlloyDB Omni:

    Docker

          sudo docker restart CONTAINER_NAME
          

    Podman

          sudo podman restart CONTAINER_NAME
          

Kubernetes

Ativar o cache de disco em um volume genérico

É possível ativar o cache em disco usando um volume genérico.

Para ativar o cache de disco em um volume genérico no operador AlloyDB Omni Kubernetes, você precisa de um volume persistente pronto com antecedência e um storageClass.

Por exemplo, se você usa o GKE e não tem o volume persistente e o storageClass prontos, verifique se fez o seguinte antes de ativar o cache de disco em um volume genérico:

  1. Crie um cluster com armazenamento local baseado em SSD.
  2. Formatar o volume para o sistema de arquivos ext4 usando a etapa 1 de Executar o provisionador estático do volume local.
  3. Crie manualmente um volume permanente para cada SSD no cluster com o storageClass que define o armazenamento permanente em um dispositivo de armazenamento.

Para ativar o cache de disco em um volume genérico para seu banco de dados, siga estas etapas:

  1. Modifique o manifesto do cluster do banco de dados para adicionar o atributo ultraFastCache à seção features da seção 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"
         ...
          

    Substitua:

    • DB_CLUSTER_NAME: o nome do cluster do banco de dados. É o mesmo nome do cluster de banco de dados que você declarou ao criar.
    • DISK_CACHE_SIZE: o tamanho do cache, por exemplo, 100Gi. Deve ser maior do que shared_buffers. Este campo é opcional. Se você não especificar o valor desse campo, o AlloyDB Omni vai usar todo o espaço disponível no disco, o que se aplica ao AlloyDB Omni em um contêiner e em um cluster do Kubernetes.
    • STORAGE_CLASS_NAME: o nome do storage class do volume de cache ultrarrápido. Por exemplo, local-storage.
  2. Reaplique o manifesto.

Ativar o cache de disco em um volume local

Se você quiser usar um volume local, não é necessário criar um volume permanente. Use a otimização abaixo.

Por exemplo, se você usa o GKE e não tem o volume persistente e o storageClass prontos, verifique se fez o seguinte antes de ativar o cache de disco em um volume local:

  1. Criou um cluster com armazenamento local baseado em SSD.
  2. Formatar o volume para o sistema de arquivos ext4 usando a etapa 1 de Executar o provisionador estático do volume local.

Para ativar o cache de disco em um volume local para seu banco de dados, faça o seguinte:

  1. Modifique o manifesto do cluster do banco de dados para adicionar o atributo ultraFastCache à seção features da seção 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"
        ...
          

    Substitua:

    • CLUSTER_NAME: o nome do cluster do banco de dados. É o mesmo nome do cluster de banco de dados que você declarou ao criar.
    • DISK_CACHE_SIZE: o tamanho do cache, por exemplo, 100Gi. Deve ser maior do que shared_buffers. Este campo é opcional. Se você não especificar o valor desse campo, o AlloyDB Omni vai usar todo o espaço disponível no disco, o que se aplica ao AlloyDB Omni em um contêiner e em um cluster do Kubernetes.
    • STORAGE_CLASS_NAME: o nome da classe de armazenamento.
    • LOCAL_VOLUME_PATH: o caminho para o volume local, por exemplo, /mnt/disks/raid/0.
    • LABEL_KEY: o rótulo do nó para a chave que serve como um indicador de local e facilita a distribuição uniforme de pods no cluster, por exemplo, cloud.google.com/gke-local-nvme-ssd.
    • OPERATOR_VALUE: a relação da chave com um conjunto de valores, por exemplo, In. Defina o parâmetro como um dos seguintes:
      • In: o array de valores não pode estar vazio.
      • NotIn: o array de valores não pode estar vazio.
      • Exists: a matriz de valores precisa estar vazia.
      • DoesNotExist: a matriz de valores precisa estar vazia.
      • Gt: a matriz de valores precisa ter um único elemento, que é interpretado como um número inteiro.
      • Lt: a matriz de valores precisa ter um único elemento, que é interpretado como um número inteiro.
    • LABEL_KEY_VALUE: o valor da chave do rótulo, por exemplo, true. Defina o parâmetro como uma matriz de valores de string da seguinte maneira:
      • Se o operador for In ou NotIn, a matriz de valores precisa estar preenchida.
      • Se o operador for Exists ou DoesNotExist, a matriz de valores precisa estar vazia.
      • Se o operador for Gt ou Lt, a matriz de valores precisará ter um único elemento, que será interpretado como um número inteiro.
  2. Reaplique o manifesto.

Verificar a configuração do cache do disco

Depois de ativar o cache de disco do AlloyDB Omni, verifique se ele é acessado monitorando a atividade de leitura e gravação nos discos usando os utilitários disponíveis, como iotop ou iostat.

Além disso, é possível verificar se o cache de disco do AlloyDB Omni está aberto.

As etapas usadas para verificar a configuração do cache em disco do AlloyDB Omni dependem se você executa o AlloyDB Omni em um contêiner ou em um cluster do Kubernetes.

Servidor único

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 o armazenamento em cache do disco estiver configurado corretamente, a mensagem Successfully opened omni disk cache ... vai aparecer nos registros.

A seguir