在 AlloyDB Omni 中配置列式引擎

选择文档版本:

本页面介绍了如何在 AlloyDB Omni 数据库集群上启用或停用列式引擎。还介绍了如何为其列存储区配置适当的初始大小。

如需查看 AlloyDB 列式引擎的概念性概览,请参阅 AlloyDB Omni 列式引擎概览

启用列式引擎

如需在实例上使用列式引擎,请将实例的 google_columnar_engine.enabled 标志设置为 on

您用于在实例上设置此标志的步骤取决于您是在容器中还是在 Kubernetes 集群中运行 AlloyDB Omni。

单个服务器

如需将 google_columnar_engine.enabled 设置为 on,请执行以下步骤:

  1. 运行 ALTER SYSTEM PostgreSQL 命令

    ALTER SYSTEM SET google_columnar_engine.enabled = 'on'
    
  2. 如果您想调整列式引擎的配置,请先按照下一部分中的说明操作,然后再重启数据库服务器。否则,请立即完成以下步骤以重启数据库服务器。

  3. 如需使配置参数更改生效,请重启运行 AlloyDB Omni 的容器。

    Docker

      sudo docker restart CONTAINER_NAME

    Podman

      sudo podman restart CONTAINER_NAME

Kubernetes

如需将 google_columnar_engine.enabled 标志设置为 on,请修改数据库集群清单,以将 parameters 属性添加到 primarySpec 部分:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      databaseVersion: "15.12.0"
      primarySpec:
        parameters:
          google_columnar_engine.enabled: "on"

CLUSTER_NAME 替换为您的数据库集群的名称。这是您在创建数据库集群时声明的同一个名称。

配置列存储区的大小

在实例上启用列式引擎后,AlloyDB Omni 会分配一部分实例内存来存储其列式数据。将高速 RAM 专门用于列存储区可确保 AlloyDB Omni 能够尽可能快地访问列式数据。

内存和存储空间缓存共同代表列式引擎的总容量。

配置内存

您可以使用 google_columnar_engine.memory_size_in_mb 标志将内存分配设置为固定大小。

您用于为 AlloyDB Omni 配置列存储区内存的步骤取决于您是在容器中还是在 Kubernetes 集群中运行 AlloyDB Omni。

单个服务器

如需在实例上设置 google_columnar_engine.memory_size_in_mb 标志,请执行以下操作:

  1. 通过运行 ALTER SYSTEM PostgreSQL 命令来配置内存:

    ALTER SYSTEM SET google_columnar_engine.memory_size_in_mb = COLUMN_MEMORY_SIZE;
    

    COLUMN_MEMORY_SIZE 替换为列存储空间的新大小(以兆字节为单位),例如 256

  2. 如需使配置参数更改生效,请重启运行 AlloyDB Omni 的容器。

    Docker

    sudo docker restart CONTAINER_NAME

    Podman

    sudo podman restart CONTAINER_NAME

Kubernetes

如需设置 google_columnar_engine.memory_size_in_mb 标志,请修改数据库集群清单,以将 parameters 属性添加到 primarySpec 部分:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      databaseVersion: "15.12.0"
      primarySpec:
        parameters:
          google_columnar_engine.memory_size_in_mb: "COLUMN_MEMORY_SIZE"

替换以下内容:

  • CLUSTER_NAME:您的数据库集群的名称。这是您在创建数据库集群时声明的同一个名称。
  • COLUMN_MEMORY_SIZE:列存储空间的新大小(以兆字节为单位),例如 256

配置存储空间缓存

您用于为 AlloyDB Omni 配置列式引擎存储缓存的步骤取决于您是在容器中还是在 Kubernetes 集群中运行 AlloyDB Omni。

单个服务器

您可以在专用设备或共用设备上配置列式引擎存储缓存。

专用设备

在专用设备上,如需为单服务器容器启用 AlloyDB Omni 列式引擎存储缓存,您需要预配磁盘并创建文件系统,然后在 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:使用非易失性存储快速通道 (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_COLUMNAR_STORAGE_CACHE_DIRECTORY
    sudo mount /dev/VOLUME_GROUP/LOGICAL_VOLUME /OMNI_COLUMNAR_STORAGE_CACHE_DIRECTORY

    OMNI_COLUMNAR_STORAGE_CACHE_DIRECTORY 替换为用作装载点的目录的名称或该目录的路径,例如 omni_columnar_storage_cache_directory

在 AlloyDB Omni 中装载列式存储缓存目录

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

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

如需在运行 AlloyDB Omni 的 Docker 容器中装载 OMNI_COLUMNAR_STORAGE_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_COLUMNAR_STORAGE_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_COLUMNAR_STORAGE_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_COLUMNAR_STORAGE_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_columnar_storage_cache_directory(类似于 OMNI_COLUMNAR_STORAGE_CACHE_DIRECTORY)或 /disk/cache/inside/container

如需授予针对已装载 OMNI_COLUMNAR_STORAGE_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 容器内访问已装载的缓存目录,然后设置相应的全局统一配置 (GUC) 参数。

  1. 设置列式存储缓存目录:

    ALTER SYSTEM SET google_columnar_engine.omni_storage_cache_directory = OMNI_COLUMNAR_STORAGE_CACHE_DIRECTORY;
    

    OMNI_COLUMNAR_STORAGE_CACHE_DIRECTORY 替换为您希望 AlloyDB Omni 存储列式引擎存储缓存文件的专用目录的绝对路径。确保此目录存在,且数据库用户拥有相应的写入权限。

  2. 配置存储缓存大小:

    ALTER SYSTEM SET google_columnar_engine.storage_cache_size = STORAGE_CACHE_SIZE;
    

    STORAGE_CACHE_SIZE 替换为所需的列式存储缓存大小(以兆字节为单位)。默认情况下,专用设备的整个大小会分配给列式引擎,而不会影响磁盘缓存。此标志允许的最大值是 1,000 * google_columnar_engine.memory_size_in_mb(以较低者为准)。

  3. 如需使配置参数更改生效,请重启运行 AlloyDB Omni 的容器。

    Docker

    sudo docker restart CONTAINER_NAME

    Podman

    sudo podman restart CONTAINER_NAME

共用设备

在将列式存储缓存配置为使用磁盘缓存的共用设备之前,您必须启用 AlloyDB Omni 磁盘缓存

在共用设备上配置存储缓存,如下所示:

  1. 配置存储缓存:

    ALTER SYSTEM SET google_columnar_engine.storage_cache_size = STORAGE_CACHE_SIZE;
    

    STORAGE_CACHE_SIZE 替换为所需的存储空间缓存大小(以兆字节为单位)。默认情况下,5% 的磁盘缓存会分配给列式引擎。此标志允许的最大值是总磁盘缓存的 50% 或 1,000 * google_columnar_engine.memory_size_in_mb(以较低者为准)。

  2. 如需使配置参数更改生效,请重启运行 AlloyDB Omni 的容器。

    Docker

    sudo docker restart CONTAINER_NAME

    Podman

    sudo podman restart CONTAINER_NAME

Kubernetes

如需为数据库启用存储空间缓存,请修改数据库集群清单,以将 columnarSpillToDisk 属性添加到 primarySpec 部分的 features 部分:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: CLUSTER_NAME
spec:
  databaseVersion: "15.12.0"
  primarySpec:
    features:
      columnarSpillToDisk:
        cacheSize: STORAGE_CACHE_SIZE
      ultraFastCache:
        cacheSize: ULTRAFAST_CACHE_SIZE
        genericVolume:
          storageClass: "STORAGE_CLASS_NAME"
...

替换以下内容:

  • CLUSTER_NAME:您的数据库集群的名称。这是您在创建数据库集群时声明的同一个名称。
  • STORAGE_CACHE_SIZE:列式存储空间缓存的大小,例如 5Gi。如果您没有为此字段指定值,则默认会将 5% 的磁盘缓存分配给列式引擎。
  • ULTRAFAST_CACHE_SIZE:缓存的大小,例如 100Gi。必须大于 shared_buffers。此字段是可选字段。如果您未指定此字段的值,AlloyDB Omni 会使用磁盘上剩余的所有空间,这适用于容器中的 AlloyDB Omni 和 Kubernetes 集群中的 AlloyDB Omni。如需详细了解度量单位,请参阅内存资源单位
  • STORAGE_CLASS_NAME:超快缓存卷的存储类别的名称,例如 local-storage

启用向量化联接

列式引擎具有向量化联接功能,可通过对符合条件的查询应用向量化处理来提高联接性能。

启用向量化联接后,AlloyDB 查询规划工具可以选择应用向量化联接运算符,而不是标准 PostgreSQL 哈希联接运算符。规划工具通过比较使用每种方法执行查询的成本来做出此决策。

如需在实例上启用向量化联接,请将实例的 google_columnar_engine.enable_vectorized_join 标志设置为 on

如需在实例上设置此标志,请运行 ALTER SYSTEM PostgreSQL 命令

ALTER SYSTEM SET google_columnar_engine.enable_vectorized_join = 'on';

默认情况下,AlloyDB Omni 会将一个线程分配给向量化联接功能。您可以通过将 google_columnar_engine.vectorized_join_threads 标志设置为更大的值来增加此功能可用的线程数量。最大值为 cpu_count * 2

手动刷新列式引擎

默认情况下,当列式引擎处于启用状态时,它会在后台刷新列存储区。

如需手动刷新列引擎,请运行以下 SQL 查询:

SELECT google_columnar_engine_refresh(relation =>'TABLE_NAME');

TABLE_NAME 替换为您要手动刷新的表或物化视图的名称。

停用列式引擎

如需在实例上停用列式引擎,请将 google_columnar_engine.enabled 标志设置为 off

您用于对实例设置此标志的步骤取决于您是在单个服务器上的容器中还是在 Kubernetes 集群中运行 AlloyDB Omni。

单个服务器

如需将 google_columnar_engine.enabled 设置为 off,请执行以下步骤:

  1. 运行 ALTER SYSTEM PostgreSQL 命令
ALTER SYSTEM SET google_columnar_engine.enabled = 'off'
  1. 如需使配置参数更改生效,请重启运行 AlloyDB Omni 的容器。

Docker

如需重启 AlloyDB Omni 容器,请运行 docker container restart 命令

  sudo docker restart CONTAINER_NAME

CONTAINER_NAME 替换为您在安装 AlloyDB Omni 容器时为其分配的名称。

Podman

如需重启 AlloyDB Omni 容器,请运行 podman container start 命令

  sudo podman restart CONTAINER_NAME

CONTAINER_NAME 替换为您在安装 AlloyDB Omni 容器时为其分配的名称。

Kubernetes

如需将 google_columnar_engine.enabled 标志设置为 off,请修改数据库集群清单,以将 parameters 属性添加到 primarySpec 部分:

  apiVersion: alloydbomni.dbadmin.goog/v1
  kind: DBCluster
  metadata:
    name: CLUSTER_NAME
  spec:
    databaseVersion: "15.12.0"
    primarySpec:
      parameters:
        google_columnar_engine.enabled: "off"

CLUSTER_NAME 替换为您的数据库集群的名称。这是您在创建数据库集群时声明的同一个名称。

排查列式引擎问题

修正 insufficient shared memory 错误

如果您运行 AlloyDB Omni 时没有足够的共享内存供列式引擎使用,则可能会看到以下错误:

Insufficient shared memory for generating the columnar formats.

您可以通过指定可供 AlloyDB Omni 容器使用的共享内存量来解决此问题。具体操作方法因主机操作系统而异。

Linux

使用修改 /etc/fstab 文件等方法来增加宿主机 /dev/shm 分区的大小。

macOS

安装新的 AlloyDB Omni 容器,--shm-size 标志指定更大的共享内存值

修正未填充的列

如果列未在列式引擎中填充,则可能存在以下情况之一:

  • 您要添加的列包含不受支持的数据类型。

  • 不符合列式引擎的要求。

如需排查此问题,请尝试执行以下操作:

  • 确认查询中的表或物化视图处于列式引擎中。
  • 使用 EXPLAIN 语句验证列式引擎的使用情况。

后续步骤