ディスク キャッシュを使用してデータベースのパフォーマンスを高速化する

このページでは、AlloyDB Omni でディスク キャッシュをプロビジョニング、設定、使用して、AlloyDB Omni インストールのパフォーマンスを向上させる方法について説明します。

AlloyDB Omni ディスク キャッシュでは、標準の PostgreSQL メモリ内共有バッファに加えて、ソリッド ステート ドライブ(SSD)などの高速ストレージにバッファを保存できます。ディスク キャッシュを使用すると、データ ディレクトリが低速なストレージにある AlloyDB Omni インストールでデータの取得が高速化されます。

PostgreSQL の共有バッファと同様に、AlloyDB Omni ディスク キャッシュは永続的ではありません。つまり、キャッシュに保存されたデータは再起動時に失われます。

デフォルトでは、AlloyDB Omni ディスク キャッシュはファイル システムから報告されたすべてのストレージを使用します。データのキャッシュに予約するストレージの量は、omni_disk_cache_file_size パラメータを使用して定義できます。

AlloyDB Omni ディスク キャッシュを有効にする

AlloyDB Omni のディスク キャッシュを有効にするための手順は、AlloyDB Omni をコンテナで実行するか、Kubernetes クラスタで実行するかによって異なります。

単一サーバー

ディスクをプロビジョニングしてファイル システムを作成する

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_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. データベース クラスタ マニフェストを変更して、spec セクションの features セクションに ultraFastCache 属性を追加します。

        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 クラスタの両方に適用されます。
    • STORAGE_CLASS_NAME: 超高速キャッシュ ボリュームの storage class の名前(例: local-storage)。
  2. マニフェストを再度適用します。

ローカル ボリュームでディスク キャッシュを有効にする

ローカル ボリュームを使用する場合は、永続ボリュームを作成する必要はありません。代わりに、次の最適化を使用できます。

たとえば、GKE を使用しているときに永続ボリュームと storageClass の準備ができていない場合は、ローカル ボリュームでディスク キャッシュを有効にする前に、次の操作を完了していることを確認してください。

  1. ローカル SSD ベースのストレージを使用するクラスタを作成しました
  2. ローカル ボリュームの静的プロビジョナーを実行するの手順 1 で、ボリュームを ext4 ファイル システムにフォーマットしました。

データベースのローカル ボリュームでディスク キャッシュを有効にするには、次の操作を行います。

  1. データベース クラスタ マニフェストを変更して、spec セクションの features セクションに ultraFastCache 属性を追加します。

        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 クラスタの両方に適用されます。
    • STORAGE_CLASS_NAME: ストレージ クラスの名前。
    • LOCAL_VOLUME_PATH: ローカル ボリュームのパス(例: /mnt/disks/raid/0)。
    • LABEL_KEY: ロケーション インジケーターとして機能し、クラスタ全体に Pod を均等に分散するキーのノードラベル(例: cloud.google.com/gke-local-nvme-ssd)。
    • OPERATOR_VALUE: キーと値のセットの関連付け(例: In)。パラメータを次のいずれかに設定します。
      • In: values 配列は空でないこと。
      • NotIn: values 配列は空でないこと。
      • Exists: values 配列は空にする必要があります。
      • DoesNotExist: values 配列は空にする必要があります。
      • Gt: 値の配列には、整数として解釈される単一の要素が必要です。
      • Lt: 値の配列には、整数として解釈される単一の要素が必要です。
    • LABEL_KEY_VALUE: ラベルキーの値(例: true)。次のように、パラメータを文字列値の配列に設定します。
      • 演算子が In または NotIn の場合、値の配列は空でないこと。
      • 演算子が Exists または DoesNotExist の場合、値の配列は空にする必要があります。
      • 演算子が Gt または Lt の場合、値の配列には整数として解釈される単一の要素が必要です。
  2. マニフェストを再度適用します。

ディスク キャッシュの構成を確認する

AlloyDB Omni ディスク キャッシュを有効にしたら、iotopiostat などの利用可能なユーティリティを使用してディスクへの読み取り / 書き込みアクティビティをモニタリングし、ディスク キャッシュにアクセスされていることを確認します。

また、AlloyDB Omni ディスク キャッシュが開いているかどうかを確認することもできます。

AlloyDB Omni のディスク キャッシュ構成を確認する手順は、AlloyDB Omni をコンテナで実行するか、Kubernetes クラスタで実行するかによって異なります。

単一サーバー

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 ... メッセージが表示されます。

次のステップ