規劃儲存空間和 PVC 大小

選取文件版本:

為避免儲存空間不足導致資料庫停機和資料遺失,您必須為 AlloyDB Omni 資料庫叢集 (DBCluster) 適當規劃儲存空間和 Persistent Volume Claim (PVC) 容量。使用 AlloyDB Omni Kubernetes 運算子在 Kubernetes 上部署時,請根據這些大小建議設定磁碟區。

建立 DBCluster 自訂資源時,AlloyDB Omni operator 會根據您在下列欄位中定義的磁碟,佈建 Kubernetes PVC:

  • 主要和高可用性 (HA) 待命執行個體:在自訂資源的 spec.primarySpec.resources.disks 欄位中設定。DBCluster如果您透過設定 spec.availability.numberOfStandbys 欄位啟用高可用性,每個待命副本都會使用與主要執行個體相同的磁碟設定。
  • 讀取集區執行個體:在每個DBInstance自訂資源的 spec.resources.disks 中設定,其中 instanceType 設為 ReadPool。如果省略 DBInstance 資源的 spec.resources 區段,讀取集區執行個體會從父項 DBCluster 資源的 spec.primarySpec.resources 欄位沿用磁碟設定。

支援的 PVC 磁碟區

AlloyDB Omni 運算子不會同時佈建所有 PVC 磁碟區:

  • 一律佈建:運算子一律會為所有主要、高可用性待命和讀取集區資料庫執行個體 Pod 佈建 DataDisk、ObsDisk、BackupDisk 和 LogDisk。您必須在資訊清單中明確指定 DataDisk 及其大小。您可以在資訊清單中指定 ObsDisk、BackupDisk 和 LogDisk,也可以不指定。如未提供這些 PVC,如基本安裝資訊清單所示,運算子仍會使用預設大小佈建這些 PVC。
  • 預設不會佈建:建立獨立 DBCluster 資源或BackupRepoDisk在 Cloud Storage 或 Amazon S3 中儲存備份時,運算子不會佈建磁碟區。只有在建立 BackupPlan 資源,將備份資料儲存在 Kubernetes 叢集本機時 (也就是沒有遠端 backupLocation 欄位的 BackupPlan 資源),這個外掛程式才會佈建備份存放區 Pod 及其 BackupRepoDisk PVC。

下表說明 AlloyDB Omni 運算子管理的持續性磁碟區:

磁碟名稱 掛接路徑 目標 Pod 資訊清單設定 佈建行為 目的
DataDisk /mnt/disks/pgsql 資料庫 Pod 必填 一律為每個資料庫 Pod 佈建。 儲存 PostgreSQL 資料庫叢集目錄 (PGDATA)、資料表、索引、暫時檔案和作用中的預寫記錄檔 (WAL) 區段。
ObsDisk /obs 資料庫 Pod 選用 (預設值:2Gi) 一律為每個資料庫 Pod 佈建。 儲存可觀測的資料,包括 PostgreSQL 伺服器記錄 (postgresql.log)、pgAudit 記錄 (postgresql.audit)、內部記錄 (postgresql.internal) 和輪替的 .gz 記錄封存檔。
BackupDisk /backup 資料庫 Pod 選用 (預設值:10Gi) 一律為每個資料庫 Pod 佈建。 為資料庫 Pod 的備份作業提供本機暫存目錄。
LogDisk /archive 資料庫 Pod 選用 (預設值:2Gi) 一律為每個資料庫 Pod 佈建。 為自訂或第三方備份輔助容器提供專屬的 WAL 封存目的地。如果未使用自訂 WAL 封存輔助容器,可以從資訊清單中省略這個磁碟,並保留預設的 2Gi 大小。
BackupRepoDisk /backup 備份存放區 Pod 選用 (預設值:10Gi) 預設不會佈建。只有在 BackupPlan 資源在本機儲存備份時才會佈建 (如果未設定 BackupPlan,或備份使用 Cloud Storage 或 Amazon S3,則不會佈建)。 使用本機儲存空間備份時,系統會提供專屬磁碟區,用於儲存實體資料庫備份、增量和差異備份,以及封存的 WAL 檔案。

PVC 大小建議

請根據工作負載、記錄設定和備份策略,按照下列指引調整各個 PVC 磁碟區的大小。

DataDisk 主要資料庫儲存空間的磁碟區

AlloyDB Omni operator 一律會為每個資料庫 Pod 佈建 DataDisk 磁碟區,您必須在資訊清單中明確指定磁碟區大小。如要估算 DataDisk 的最低容量,請使用下列公式:

DataDisk capacity = (initial_dataset_size + projected_growth + max_wal_size) * 1.30

調整 DataDisk 磁碟區大小時,請考量下列因素:

  • 索引負荷:PostgreSQL 索引和系統目錄表通常需要額外 20% 到 50% 的儲存空間,才能儲存原始資料表資料。
  • 有效 WAL 空間:高輸送量的寫入交易會在 pg_wal 目錄中累積 WAL 檔案,直到檢查點完成為止。分配足夠的儲存空間,以容納您設定的max_wal_size資料庫參數 (通常為數 GB 到數十 GB,視工作負載而定)。如要查看或修改資料庫參數 (例如 max_wal_size),請參閱「設定資料庫參數」。
  • 暫時性檔案和清除作業:查詢排序、建立索引、重新建立索引和自動清除作業需要額外的暫時性磁碟空間。
  • 一般大小規則:分配原始資料庫大小的 1.5 到 2 倍,包括至少 30% 的安全緩衝區。

ObsDisk 診斷和稽核記錄的數量

AlloyDB Omni 運算子一律會為每個資料庫 Pod 佈建 ObsDisk 磁碟區 (如果您從資訊清單中省略,則會使用 2Gi 預設大小)。如果 ObsDisk 磁碟區已滿,PostgreSQL 就無法寫入新的記錄項目,記錄檔輪替作業也可能會停滯。如要瞭解如何為 ObsDisk 磁碟區設定記錄檔輪替和保留設定,請參閱「設定記錄檔輪替」。

調整 ObsDisk 磁碟區大小時,請考量下列準則:

  • 標準記錄:在預設記錄輪替設定 (200 MB 輪替門檻和 7 天保留期限) 下,標準作業記錄的容量為 4 GiB 至 10 GiB。
  • 稽核記錄 (pgAudit):使用 pgAudit 啟用稽核記錄時,稽核記錄會產生大量記錄。視查詢率和稽核規則詳細程度而定,配置 20 GiB 至 50 GiB 以上。

BackupRepoDisk 磁碟區,做為本機備份存放區

與資料庫 Pod 磁碟不同,BackupRepoDisk 不會預設佈建。 只有在您建立 BackupPlan 資源,將備份資料儲存在 Kubernetes 叢集本機 ,且沒有遠端 backupLocation 欄位時,AlloyDB Omni operator 才會佈建備份存放區 Pod 及其 BackupRepoDisk PVC。如果從 DBCluster 資訊清單中省略這個磁碟,系統會使用預設大小 10Gi。如果未設定 BackupPlan 資源,或 BackupPlan 資源使用 GCS 類型的 Cloud Storage 或 S3 類型的 Amazon S3,則運算子不會佈建 BackupRepoDisk。如要進一步瞭解如何設定備份方案及調整備份儲存空間大小,請參閱「在 Kubernetes 中備份及還原」和「調整備份磁碟大小」。

將備份檔儲存在本機時,BackupRepoDisk 磁碟區會儲存壓縮的完整、差異和增量備份,以及封存的 WAL 檔案。所需總儲存空間取決於資料庫大小、每日資料變更率、backupSchedules中定義的備份排程,以及 backupRetainDays 設定的保留期限:

  • 備份壓縮:壓縮備份通常會使用未壓縮資料庫大小的 37% 到 38%,代表大小縮減了 62% 到 63%。舉例來說,50 GiB 的資料庫壓縮後約為 18.5 GiB。
  • 備份時間和保留期限:如果每週進行完整備份,每天進行增量或差異備份,所需的儲存空間會比每天進行完整備份少得多。

下表顯示基準尖峰儲存空間用量,以及建議BackupRepoDisk大小 (包括 20% 的緩衝區)。資料庫大小為 100 GiB,每日資料變更率為 10%,保留期限為預設的 14 天 (backupRetainDays: 14),備份排程如下:

備份排程 (backupSchedules) 完整備份尖峰 差異備份 增量備份 封存的 WAL 檔案 儲存空間用量上限 建議的 BackupRepoDisk 大小 (外加 20% 緩衝區)
每週完整 + 每日增量 148.0 GiB 0 GiB 66.6 GiB 155.4 GiB 370.0 GiB 444 GiB (約為資料庫大小的 4.4 倍)
每週完整 + 週中差異 + 每日增量 148.0 GiB 22.2 GiB 44.4 GiB 155.4 GiB 370.0 GiB 444 GiB (約為資料庫大小的 4.4 倍)
每週完整 + 每日差異 148.0 GiB 155.4 GiB 0 GiB 155.4 GiB 458.8 GiB 551 GiB (約為資料庫大小的 5.5 倍)
僅限每日完整資料 (預設時間表) 592.0 GiB 0 GiB 0 GiB 111.0 GiB 703.0 GiB 844 GiB (約為資料庫大小的 8.4 倍)

BackupDisk 磁碟區,用於資料庫 Pod 備份暫存

AlloyDB Omni 運算子一律會為每個資料庫 Pod 佈建 BackupDisk 磁碟區,預設大小為 10 GiB (10Gi)。AlloyDB Omni 會在備份作業期間,將 BackupDisk 磁碟區做為本機暫存目錄。由於預設的 10 GiB 大小足以應付標準作業,因此您可以從 DBCluster 資訊清單中省略 BackupDisk,使用預設大小。

自訂 WAL 封存的 LogDisk 容量

AlloyDB Omni operator 一律會為每個資料庫 Pod 佈建 LogDisk 磁碟區,預設大小為 2 GiB (2Gi)。只有在部署自訂或第三方邊車容器時,才需要為 LogDisk 磁碟區指定自訂大小,因為這類容器會將 WAL 檔案封存至 /archive 目錄。對於使用內建備份的標準 AlloyDB Omni operator 部署作業,您可以從 DBCluster 資訊清單中省略 LogDisk,並保留預設的 2Gi 大小。

依資料集大小調整大小的參考資料

下表列出常見原始資料集大小的建議 PVC 大小:

原始資料大小 建議的 DataDisk 大小 建議的 ObsDisk 大小 建議的 BackupRepoDisk 大小 (僅適用於本機備份) 建議的 BackupDisk 大小 建議的 LogDisk 大小
50 GiB 100 GiB 4 GiB (使用 pgAudit 時為 10 到 20 GiB) 150 GiB 10 GiB (預設) 2 GiB (預設)
200 GiB 400 GiB 10 GiB (使用 pgAudit 時為 20 至 50 GiB) 600 GiB 10 GiB (預設) 2 GiB (預設)
500 GiB 1,000 GiB (1 TiB) 15 GiB (使用 pgAudit 時為 30 至 60 GiB) 1,500 GiB (1.5 TiB) 10 GiB (預設) 2 GiB (預設)
1 TiB 2,000 GiB (2 TiB) 20 GiB (使用 pgAudit 時為 50 至 100 GiB) 3,000 GiB (3 TiB) 10 GiB (預設) 2 GiB (預設)

監控磁碟使用率和 I/O 指標

您可以透過 kubectl,或收集 AlloyDB Omni 匯出的 Prometheus 指標,直接在資料庫和備份儲存庫 Pod 中監控即時磁碟用量。

使用 kubectl 檢查磁碟使用量

如要檢查資料庫 Pod 和備份存放區 Pod 中已掛接 PVC 磁碟區的目前磁碟空間用量,請執行下列指令:

  1. 取得 DBCluster 資源的資料庫 Pod 名稱:

    export DB_POD=$(kubectl get pod -n NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}')

    更改下列內容:

    • NAMESPACE:部署資料庫叢集的 Kubernetes 命名空間。
    • DB_CLUSTER_NAME:資料庫叢集名稱。
  2. 在資料庫容器中執行 df -h,即可查看 DataDisk (/mnt/disks/pgsql)、ObsDisk (/obs)、BackupDisk (/backup) 和 LogDisk (/archive) 磁碟區的容量和用量:

    kubectl exec -n NAMESPACE "${DB_POD}" -c database -- df -h /mnt/disks/pgsql /obs /backup /archive
  3. 如果已設定 BackupPlan 資源在本機儲存備份,請取得備份存放區 Pod 的名稱,然後執行 df -h,查看 BackupRepoDisk 磁碟區的容量和用量 (/backup):

    export BACKUP_REPO_POD=$(kubectl get pod -n NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/backup-repository -o jsonpath='{.items[0].metadata.name}')
    kubectl exec -n NAMESPACE "${BACKUP_REPO_POD}" -c backuprepo -- df -h /backup

使用 Prometheus 監控儲存空間指標

AlloyDB Omni 會在al-INSTANCE_ID-DB_CLUSTER_NAME-monitoring-system 9187 服務 (連接埠 9187) 上匯出儲存空間和磁碟 I/O 指標。如要瞭解如何擷取及查詢這些指標,請參閱「監控 AlloyDB Omni」。如需可用指標的完整清單,請參閱「AlloyDB Omni 指標」。

監控下列磁碟指標:

  • 儲存空間用量和容量:監控 alloydb_omni_node_storage_usage_per_disk_byte 和 alloydb_omni_node_storage_limit_per_disk_byte 指標,這些指標會使用 disk 標籤 (例如 DataDisk、ObsDisk 或 BackupDisk),回報每個磁碟區的儲存空間用量和總容量 (以位元組為單位)。當磁碟用量達到容量的 80% 和 90% 時,請設定快訊,以便在磁碟空間用盡前擴充磁碟區。
  • 磁碟輸送量和 I/O 作業:監控磁碟讀取和寫入輸送量的 alloydb_omni_node_storage_read_bytes_count_total 和 alloydb_omni_node_storage_write_bytes_count_total 指標,以及讀取和寫入 I/O 作業的 alloydb_omni_node_storage_read_ops_count_total 和 alloydb_omni_node_storage_write_ops_count_total 指標。

調整現有 DBCluster 的 PVC 大小

如果您已按照「建立資料庫叢集」建立 DBCluster 資源,初始資訊清單可能只指定 DataDisk 磁碟區 (例如 10Gi),而 AlloyDB Omni operator 會以預設大小佈建 ObsDisk (2Gi)、BackupDisk (10Gi) 和 LogDisk (2Gi) 磁碟區。您可以更新 DBCluster 資訊清單,擴充任何這類 PVC。

調整 PVC 大小前,請先詳閱下列規定和限制:

  • StorageClass 磁碟區擴充:只有在 Kubernetes StorageClass 資源設定 allowVolumeExpansion: true 時,您才能增加磁碟大小。詳情請參閱「擴充永久磁碟區聲明」。
  • 無法縮減或變更 StorageClass:您無法縮減磁碟大小,也無法在現有 PVC 佈建後變更其 storageClass 欄位。
  • 調整預設大小的磁碟:如要擴充先前從資訊清單中省略的磁碟 (例如 ObsDisk 磁碟區或 BackupRepoDisk 磁碟區),請在 spec.primarySpec.resources.disks 欄位中為該磁碟新增項目,並將 size 欄位設為大於目前預設容量。更新資訊清單時,請務必保留 disks 清單中的 DataDisk 和任何其他現有磁碟項目。
  • Pod 重新啟動行為:修改 resources.disks 欄位時,AlloyDB Omni 運算子會更新基礎 PVC,並重新啟動資料庫執行個體 Pod,以套用新的資源規格。在規劃的維護期間執行儲存空間擴充作業,或設定高可用性,盡量縮短停機時間。

如要檢查及調整 DBCluster 的 PVC 大小,請按照下列步驟操作:

  1. 列出資料庫叢集命名空間中的 PVC,檢查目前的容量和 StorageClass 資源:

    kubectl get pvc -n NAMESPACE

    將 NAMESPACE 替換為您部署 DBCluster 的命名空間 (例如 default)。

    如果叢集名為 my-db-cluster,輸出結果會與下列內容相似:

    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    backupdisk-al-1060-my-db-cluster-0  Bound    pvc-45a28be2-a111-40ed-9641-61b9d25f313b   10Gi       RWO            standard-rwo   10m
    datadisk-al-1060-my-db-cluster-0    Bound    pvc-c23a1ab8-f97c-4449-9072-502b6d9ba869   10Gi       RWO            standard-rwo   10m
    logdisk-al-1060-my-db-cluster-0     Bound    pvc-f0c41d15-bb13-4d28-b94b-01a28dc67ef6   2Gi        RWO            standard-rwo   10m
    obsdisk-al-1060-my-db-cluster-0     Bound    pvc-69ea1ca7-a868-4dc9-a9f8-503d5e5f2387   2Gi        RWO            standard-rwo   10m
    
  2. 確認 PVC 使用的 StorageClass 資源支援擴充磁碟區:

    kubectl get storageclass STORAGE_CLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'

    將 STORAGE_CLASS_NAME 替換成先前輸出內容 STORAGECLASS 欄中的儲存空間類別名稱 (例如 standard-rwo)。確認指令傳回 true。

  3. 更新 DBCluster 資訊清單中的 spec.primarySpec.resources.disks 欄位,增加 DataDisk 磁碟區的 size 值,並新增需要擴充的任何預設大小磁碟 (例如 ObsDisk 磁碟區或 BackupRepoDisk 磁碟區)。

    下列資訊清單範例會將 DataDisk 磁碟區擴充至 400Gi,將 ObsDisk 磁碟區從預設的 2Gi 擴充至 10Gi,並在 600Gi 為 200 GiB 工作負載設定 BackupRepoDisk 磁碟區:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: DB_CLUSTER_NAME
      namespace: NAMESPACE
    spec:
      databaseVersion: "18.3.0"
      primarySpec:
        adminUser:
          passwordRef:
            name: db-pw-DB_CLUSTER_NAME
        resources:
          cpu: 4
          memory: 32Gi
          disks:
          - name: DataDisk
            size: 400Gi
            storageClass: STORAGE_CLASS_NAME
          - name: ObsDisk
            size: 10Gi
            storageClass: STORAGE_CLASS_NAME
          - name: BackupRepoDisk
            size: 600Gi
            storageClass: STORAGE_CLASS_NAME
    

    更改下列內容:

    • DB_CLUSTER_NAME:資料庫叢集的名稱,例如 my-db-cluster。
    • NAMESPACE:資料庫叢集的命名空間。
    • STORAGE_CLASS_NAME:永久磁碟區使用的 Kubernetes StorageClass 資源名稱,例如 standard-rwo。如果您在建立叢集時省略 storageClass 欄位,可以繼續省略,讓運算子使用叢集的預設 StorageClass。
  4. 套用更新後的 DBCluster 資訊清單:

    kubectl apply -f DB_CLUSTER_MANIFEST.yaml

    將 DB_CLUSTER_MANIFEST 替換為 DBCluster 資訊清單檔案的路徑。

  5. 確認 PVC 和 DBCluster 狀態反映擴充後的大小:

    kubectl get pvc -n NAMESPACE

    您也可以檢查 allocatedResources.disks 資源的 DBCluster 狀態欄位:

    kubectl get dbcluster DB_CLUSTER_NAME -n NAMESPACE -o jsonpath='{.status.primary.allocatedResources.disks}{"\n"}'

    更改下列內容:

    • NAMESPACE:資料庫叢集的命名空間。
    • DB_CLUSTER_NAME:資料庫叢集名稱。

如要進一步瞭解如何調整運算和儲存資源大小,請參閱「調整 Kubernetes 型資料庫叢集的大小」。

後續步驟