使用磁盘缓存加快数据库性能

本页介绍了如何在 AlloyDB Omni 上预配、设置和使用磁盘缓存,以提高 AlloyDB Omni 安装的性能。

除了标准的 PostgreSQL 内存共享缓冲区之外,AlloyDB Omni 磁盘缓存还支持将缓冲区存储在固态硬盘 (SSD) 等高速存储设备上。磁盘缓存可加快 AlloyDB Omni 安装中的数据检索速度,前提是数据目录位于速度较慢的存储空间上。

与 PostgreSQL 共享缓冲区一样,AlloyDB Omni 磁盘缓存是非永久性的,这意味着缓存的数据会在重启时丢失。

默认情况下,AlloyDB Omni 磁盘缓存会使用文件系统报告的所有存储空间。您可以使用 omni_disk_cache_file_size 参数定义为缓存数据预留的存储空间量。

启用 AlloyDB Omni 磁盘缓存

为 AlloyDB Omni 启用磁盘缓存的步骤取决于您是在容器中还是在 Kubernetes 集群上运行 AlloyDB Omni。

单服务器

预配磁盘并创建文件系统

对于 AlloyDB Omni 磁盘缓存,您可以在一个或多个磁盘上创建文件系统,并使用 AlloyDB Omni 将其挂载在容器内。此外,您还可以使用 mdadmlvm 等实用程序,使用多个磁盘共享容量,并使用任何文件系统。

以下步骤演示了如何在使用 NVMe SSD 的 Ubuntu Compute Engine 实例上使用 lvmext4

  1. 使用所有可用的实体设备创建卷组:

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

    替换以下内容:

    • STORAGE_PREFIX:使用非易失性存储器 Express (NVMe) 接口挂接到虚拟机的目标本地磁盘路径的前缀。例如,在 Google Cloud上,NVMe 设备路径始终以 /dev/nvme0n 开头。
    • VOLUME_GROUP:用于组合 SSD 的卷组的名称,例如 omni-disk-cache-volume
  2. 如需使用上一步中卷组的空闲容量创建逻辑卷,请使用以下命令:

      sudo lvcreate -n LOGICAL_VOLUME -l 100%FREE VOLUME_GROUP

    LOGICAL_VOLUME 替换为 LVM 视为分区的逻辑卷的名称,例如 omni_disk_cache_device

  3. 在逻辑卷上创建 ext4 文件系统。如果需要,您可以指定其他受数据安全影响的 ext4 选项。
      sudo mkfs.ext4 /dev/VOLUME_GROUP/LOGICAL_VOLUME
  4. 如需创建一个目录,并将其作为宿主机上的装载点来装载文件系统,请使用以下命令:

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

    OMNI_DISK_CACHE_DIRECTORY 替换为目录名称或用作装载点的目录的路径,例如 omni_disk_cache_directory

在 AlloyDB Omni 中挂载缓存目录

在为在容器中运行的 AlloyDB Omni 启用磁盘缓存之前,您必须在 AlloyDB Omni 中挂载缓存目录。

如需了解如何从 Docker 映像安装 AlloyDB Omni 并对其进行自定义,请参阅自定义 AlloyDB Omni 安装

如需在运行 AlloyDB Omni 的 Docker 容器中挂载 OMNI_DISK_CACHE_DIRECTORY,请使用以下命令:

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
      

替换以下内容:

  • CONTAINER_NAME:要为新的 AlloyDB Omni 容器分配的名称,例如 my-omni
  • PASSWORD:PostgreSQL 数据库根目录管理员的密码。
  • DATA_DIR:您希望 AlloyDB Omni 用于其数据目录的文件系统路径。
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER:AlloyDB Omni 容器内的缓存目录,该目录会映射到宿主机上的挂载点;例如,基于容器内缓存目录的值,可以是 /omni_disk_cache_directory(类似于 OMNI_DISK_CACHE_DIRECTORY)或 /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
      

替换以下内容:

  • CONTAINER_NAME:要为新的 AlloyDB Omni 容器分配的名称,例如 my-omni
  • PASSWORD:PostgreSQL 数据库根目录管理员的密码。
  • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER:AlloyDB Omni 容器内的缓存目录,该目录会映射到宿主机上的挂载点;例如,基于容器内缓存目录的值,可以是 /omni_disk_cache_directory(类似于 OMNI_DISK_CACHE_DIRECTORY)或 /disk/cache/inside/container

如需向已挂载的 OMNI_DISK_CACHE_DIRECTORY 授予完全访问权限,请使用以下命令:

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
      

为在容器中运行的 AlloyDB Omni 启用 AlloyDB Omni 磁盘缓存

如需为数据库启用 AlloyDB Omni 磁盘缓存,请确保可以从 Docker 容器内访问已挂载的缓存目录,然后设置适当的 Grand Unified Configuration (GUC) 参数。

  1. 如需以超级用户身份连接到容器化 AlloyDB Omni 数据库,请使用以下命令:

    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. 如需设置参数的值,请在 AlloyDB Omni 数据库中使用以下命令:

            alter system set omni_disk_cache_enabled=on;
            alter system set omni_disk_cache_directory='/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER';
          
  3. 默认情况下,AlloyDB Omni 会使用文件系统中的所有可用空间。如果需要,您可以使用 omni_disk_cache_file_size 参数替换默认值。

          alter system set omni_disk_cache_file_size=SIZE_IN_MB;
          
  4. 如需使缓存配置参数更改生效,请使用 AlloyDB Omni 重启正在运行的容器:

    Docker

          sudo docker restart CONTAINER_NAME
          

    Podman

          sudo podman restart CONTAINER_NAME
          

Kubernetes

在通用卷上启用磁盘缓存

您可以使用通用卷启用磁盘缓存。

如需在 AlloyDB Omni Kubernetes 操作器上为通用卷启用磁盘缓存,您需要预先准备好永久性卷storageClass

例如,如果您使用 GKE 且尚未准备好永久性卷和 storageClass,请确保您已执行以下操作,然后再在通用卷上启用磁盘缓存:

  1. 创建了使用基于本地 SSD 的存储空间的集群
  2. 使用运行本地卷静态预配工具的第 1 步将卷格式化为 ext4 文件系统。
  3. 使用用于定义存储设备上持久性存储的 storageClass 为集群中的每个 SSD 手动创建了永久性卷

如需为数据库的通用卷启用磁盘缓存,请完成以下步骤:

  1. 修改数据库集群清单,将 ultraFastCache 属性添加到 spec 部分的 features 部分:

        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"
         ...
          

    替换以下内容:

    • DB_CLUSTER_NAME:您的数据库集群的名称。该名称与您在创建数据库集群时声明的名称相同。
    • DISK_CACHE_SIZE:缓存的大小,例如 100Gi。必须大于 shared_buffers。此字段是可选字段。如果您未指定此字段的值,AlloyDB Omni 将使用磁盘上的所有剩余空间,这适用于容器中的 AlloyDB Omni 和 Kubernetes 集群中的 AlloyDB Omni。
    • STORAGE_CLASS_NAME:超高速缓存卷的 storage class 的名称,例如 local-storage
  2. 重新应用清单。

在本地卷上启用磁盘缓存

如果您想使用本地卷,则无需创建永久性卷。您可以改用以下优化。

例如,如果您使用 GKE 且尚未准备好永久性卷和 storageClass,请确保您已执行以下操作,然后再在本地卷上启用磁盘缓存:

  1. 创建了使用基于本地 SSD 的存储空间的集群
  2. 使用运行本地卷静态预配工具的第 1 步将卷格式化为 ext4 文件系统。

如需为数据库在本地卷上启用磁盘缓存,请执行以下操作:

  1. 修改数据库集群清单,将 ultraFastCache 属性添加到 spec 部分的 features 部分:

        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"
        ...
          

    替换以下内容:

    • CLUSTER_NAME:您的数据库集群的名称。该名称与您在创建数据库集群时声明的名称相同。
    • DISK_CACHE_SIZE:缓存的大小,例如 100Gi。必须大于 shared_buffers。此字段是可选字段。如果您未指定此字段的值,AlloyDB Omni 将使用磁盘上的所有剩余空间,这适用于容器中的 AlloyDB Omni 和 Kubernetes 集群中的 AlloyDB Omni。
    • STORAGE_CLASS_NAME存储类的名称。
    • LOCAL_VOLUME_PATH:本地卷的路径,例如 /mnt/disks/raid/0
    • LABEL_KEY:节点的键标签,该键用作位置指示器,有助于在集群中均匀分配 Pod,例如 cloud.google.com/gke-local-nvme-ssd
    • OPERATOR_VALUE:键与一组值的关系,例如 In。将该参数设置为以下任一项:
      • In:值数组不得为空。
      • NotIn:值数组不得为空。
      • Exists:值数组必须为空。
      • DoesNotExist:值数组必须为空。
      • Gt:值数组必须包含一个元素,该元素会被解读为整数。
      • Lt:值数组必须包含一个元素,该元素会被解读为整数。
    • LABEL_KEY_VALUE:标签键的值,例如 true。将该参数设置为字符串值数组,如下所示:
      • 如果运算符为 InNotIn,则值数组不得为空。
      • 如果运算符为 ExistsDoesNotExist,则值数组必须为空。
      • 如果运算符为 GtLt,则值数组必须包含单个元素,该元素会被解读为整数。
  2. 重新应用清单。

验证磁盘缓存配置

启用 AlloyDB Omni 磁盘缓存后,使用 iotopiostat 等可用实用程序监控对磁盘的读写活动,验证是否访问了磁盘缓存。

此外,您还可以检查 AlloyDB Omni 磁盘缓存是否处于打开状态。

用于验证 AlloyDB Omni 的磁盘缓存配置的步骤取决于您是在容器中还是在 Kubernetes 集群上运行 AlloyDB Omni。

单服务器

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"

如果磁盘缓存配置正确,日志中会显示 Successfully opened omni disk cache ... 消息。

后续步骤