本页介绍了如何在 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 将其挂载在容器内。此外,您还可以使用 mdadm
或 lvm
等实用程序,使用多个磁盘共享容量,并使用任何文件系统。
以下步骤演示了如何在使用 NVMe SSD 的 Ubuntu Compute Engine 实例上使用 lvm
和 ext4
。
使用所有可用的实体设备创建卷组:
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
。
-
如需使用上一步中卷组的空闲容量创建逻辑卷,请使用以下命令:
sudo lvcreate -n LOGICAL_VOLUME -l 100%FREE VOLUME_GROUP
将
LOGICAL_VOLUME
替换为 LVM 视为分区的逻辑卷的名称,例如omni_disk_cache_device
。 - 在逻辑卷上创建
ext4
文件系统。如果需要,您可以指定其他受数据安全影响的ext4
选项。sudo mkfs.ext4 /dev/VOLUME_GROUP/LOGICAL_VOLUME
如需创建一个目录,并将其作为宿主机上的装载点来装载文件系统,请使用以下命令:
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) 参数。
-
如需以超级用户身份连接到容器化 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
-
如需设置参数的值,请在 AlloyDB Omni 数据库中使用以下命令:
alter system set omni_disk_cache_enabled=on; alter system set omni_disk_cache_directory='/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER';
-
默认情况下,AlloyDB Omni 会使用文件系统中的所有可用空间。如果需要,您可以使用
omni_disk_cache_file_size
参数替换默认值。alter system set omni_disk_cache_file_size=SIZE_IN_MB;
-
如需使缓存配置参数更改生效,请使用 AlloyDB Omni 重启正在运行的容器:
Docker
sudo docker restart CONTAINER_NAME
Podman
sudo podman restart CONTAINER_NAME
Kubernetes
在通用卷上启用磁盘缓存
您可以使用通用卷启用磁盘缓存。
如需在 AlloyDB Omni Kubernetes 操作器上为通用卷启用磁盘缓存,您需要预先准备好永久性卷和 storageClass
。
例如,如果您使用 GKE 且尚未准备好永久性卷和 storageClass
,请确保您已执行以下操作,然后再在通用卷上启用磁盘缓存:
- 创建了使用基于本地 SSD 的存储空间的集群。
- 使用运行本地卷静态预配工具的第 1 步将卷格式化为 ext4 文件系统。
- 使用用于定义存储设备上持久性存储的
storageClass
为集群中的每个 SSD 手动创建了永久性卷。
如需为数据库的通用卷启用磁盘缓存,请完成以下步骤:
修改数据库集群清单,将
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
。
- 重新应用清单。
在本地卷上启用磁盘缓存
如果您想使用本地卷,则无需创建永久性卷。您可以改用以下优化。
例如,如果您使用 GKE 且尚未准备好永久性卷和 storageClass
,请确保您已执行以下操作,然后再在本地卷上启用磁盘缓存:
- 创建了使用基于本地 SSD 的存储空间的集群。
- 使用运行本地卷静态预配工具的第 1 步将卷格式化为 ext4 文件系统。
如需为数据库在本地卷上启用磁盘缓存,请执行以下操作:
修改数据库集群清单,将
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
。将该参数设置为字符串值数组,如下所示:- 如果运算符为
In
或NotIn
,则值数组不得为空。 - 如果运算符为
Exists
或DoesNotExist
,则值数组必须为空。 - 如果运算符为
Gt
或Lt
,则值数组必须包含单个元素,该元素会被解读为整数。
- 如果运算符为
- 重新应用清单。
验证磁盘缓存配置
启用 AlloyDB Omni 磁盘缓存后,使用 iotop
或 iostat
等可用实用程序监控对磁盘的读写活动,验证是否访问了磁盘缓存。
此外,您还可以检查 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 ...
消息。