本頁面提供 YAML 設定範例,說明如何在 Kubernetes 上部署及管理 AlloyDB Omni。
DBCluster Core 和 OS 設定
瞭解基本叢集設定和自訂作業系統設定。
最少的 DBCluster
部署 AlloyDB Omni DBCluster 的基本設定。
查看 DBCluster YAML 最少設定
# This is a minimal DBCluster spec. See v1_dbcluster_full.yaml for more configurations. apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
完整 DBCluster
顯示可用設定的完整設定。
查看完整的 DBCluster YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: allowExternalIncomingTraffic: true availability: healthcheckPeriodSeconds: 30 # default is 30secs, new feature in 1.2.0. minimum value is 1 and the maximum value is 86400 autoFailoverTriggerThreshold: 3 # after which failover is triggered autoHealTriggerThreshold: 3 enableAutoFailover: true enableAutoHeal: true enableStandbyAsReadReplica: true numberOfStandbys: 1 controlPlaneAgentsVersion: 1.6.0 databaseVersion: "18.1.0" databaseImageOSType: UBI9 isDeleted: false mode: "" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample tls: dataPlaneCertIssuer: name: data-plane-issuer kind: ClusterIssuer controlPlaneAgentsCertIssuer: name: control-plane-issuer kind: ClusterIssuer dataPlaneCertRequest: commonName: database.dbcluster-sample.com dnsNames: - database.dbcluster-sample.com - database-alt.dbcluster-sample.com duration: 240h0m0s renewBefore: 120h0m0s privateKey: rotationPolicy: Always algorithm: RSA size: 8192 controlPlaneAgentsCertRequest: duration: 240h0m0s renewBefore: 120h0m0s privateKey: rotationPolicy: Always algorithm: RSA size: 8192 auditLogTarget: {} dbLoadBalancerOptions: annotations: networking.gke.io/load-balancer-type: "internal" lb.company.com/enabled: "true" gcp: {} features: columnarSpillToDisk: cacheSize: 50Gi ultraFastCache: cacheSize: 100Gi # either generic volume or local volume genericVolume: storageClass: "local-storage" # localVolume: # path: "/mnt/disks/raid/0" # nodeAffinity: # required: # nodeSelectorTerms: # - matchExpressions: # - key: "cloud.google.com/gke-local-nvme-ssd" # operator: "In" # values: # - "true" googleMLExtension: config: vertexAIKeyRef: vertex-ai-key-alloydb # secret used to enable AlloyDB Omni to access AlloyDB AI features vertexAIRegion: us-central1 # default resources: cpu: "12" disks: - name: DataDisk size: 1000Gi storageClass: px-ceph - name: LogDisk size: 10Gi storageClass: px-ceph - name: ObsDisk size: 4Gi storageClass: px-ceph - name: BackupDisk size: 10Gi storageClass: px-ceph memory: 100Gi walArchiveSetting: location: wal/log # enable WAL archiving and archive logs to /archive/wal/log sidecarRef: name: cv-sidecar-config # provide a sidecar config that is referenced here parameters: google_columnar_engine.enabled: "on" google_columnar_engine.memory_size_in_mb: "256" google_storage.parallel_log_replay_enabled: 'off' google_pg_auth.enable_auth: 'false' shared_preload_libraries: "pg_cron,pg_bigm3" archive_mode: 'on' archive_timeout: '300' work_mem: '4MB' # operator default values # shared_preload_libraries='g_stats,google_columnar_engine,google_db_advisor,google_job_scheduler,pg_stat_statements,pglogical,pgaudit' log_rotation_age: "2" # rotate every two minutes. Set to "0" to disable age-based rotation. If unset, no age-based rotation log_rotation_size: "400000" # rotate every 400,000kb. set to "0" to disable size-based rotation. If unset, rotate every 200,000kb schedulingconfig: tolerations: - effect: NoSchedule key: alloydb-node-type operator: Exists nodeaffinity: # requiredDuringSchedulingIgnoredDuringExecution: strong condition, not being able to meet this would stop pods being scheduled preferredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: alloydb-node-type operator: In values: - database podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname" podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: "topology.kubernetes.io/zone" services: Logging: true Monitoring: true --- apiVersion: v1 kind: PersistentVolume metadata: name: "example-local-pv" spec: capacity: storage: 375Gi accessModes: - "ReadWriteOnce" persistentVolumeReclaimPolicy: "Retain" storageClassName: "local-storage" local: path: "/mnt/disks/raid/0" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: # following example key applies to an operator that is deployed on # Google Cloud and uses the local ssd option - key: "cloud.google.com/gke-local-nvme-ssd" operator: "In" values: - "true" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBInstance metadata: name: dbcluster-sample-rp-1 spec: instanceType: ReadPool dbcParent: name: dbcluster-sample nodeCount: 2 resources: memory: 6Gi cpu: 2 disks: - name: DataDisk size: 15Gi schedulingconfig: tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" nodeaffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname" podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: "topology.kubernetes.io/zone"
自訂參數
設定自訂 PostgreSQL 參數。
查看自訂參數 YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi parameters: google_columnar_engine.enabled: "on" google_columnar_engine.memory_size_in_mb: "256"
以 Debian 為基礎的部署作業
指定 Debian OS 映像檔基礎。
查看以 Debian 為基礎的 Deployment YAML 設定
# This is a minimal DBCluster spec. See v1_dbcluster_full.yaml for more configurations. apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" databaseImageOSType: Debian primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
以 UBI9 為基礎的部署作業
指定 Red Hat Universal Base Image 9 (UBI 9) 基礎。
查看以 UBI9 為基礎的 Deployment YAML 設定
# This is a minimal DBCluster spec. See v1_dbcluster_full.yaml for more configurations. apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" databaseImageOSType: UBI9 primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
Pod 排程選項
設定節點相依性、容許度和排程行為。
查看 Pod 排程選項 YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" availability: numberOfStandbys: 1 enableStandbyAsReadReplica: true primarySpec: schedulingconfig: topologySpreadConstraints: - maxSkew: 1 topologyKey: "topology.kubernetes.io/zone" whenUnsatisfiable: DoNotSchedule adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
高可用性和擴充性
分配流量,確保零或最短停機時間。
高可用性 DBCluster
設定多個副本,確保高可用性。
查看 HA DBCluster YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" availability: numberOfStandbys: 1 enableStandbyAsReadReplica: true primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
使用負載平衡器的 DBCluster
使用服務負載平衡公開讀取/寫入端點。
查看 DBCluster 與負載平衡器 YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi dbLoadBalancerOptions: annotations: # Creates internal LoadBalancer in GKE. networking.gke.io/load-balancer-type: "internal" allowExternalIncomingTraffic: true
讀取集區執行個體
新增唯讀集區執行個體,以調度讀取作業資源。
查看讀取集區執行個體 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBInstance metadata: name: dbcluster-sample-rp-1 spec: instanceType: ReadPool dbcParent: name: dbcluster-sample nodeCount: 2 resources: memory: 6Gi cpu: 2 disks: - name: DataDisk size: 15Gi schedulingconfig: tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" nodeaffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname" podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: "topology.kubernetes.io/zone"
安全性和密鑰管理
保護金鑰、憑證和叢集憑證。
憑證核發機構
設定自訂 TLS 憑證核發者。
查看憑證簽發機構的 YAML 設定
# This is a minimal DBCluster spec. See v1_dbcluster_full.yaml for more configurations. apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: tls: dataPlaneCertIssuer: name: data-plane-issuer kind: ClusterIssuer controlPlaneAgentsCertIssuer: name: control-plane-issuer kind: ClusterIssuer dataPlaneCertRequest: commonName: database.dbcluster-sample.com dnsNames: - database.dbcluster-sample.com - database-alt.dbcluster-sample.com duration: 240h0m0s renewBefore: 120h0m0s privateKey: rotationPolicy: Always algorithm: RSA size: 8192 controlPlaneAgentsCertRequest: duration: 240h0m0s renewBefore: 120h0m0s privateKey: rotationPolicy: Always algorithm: RSA size: 8192 adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
Vault 整合
使用 HashiCorp Vault 擷取及保護密鑰。
查看 Vault Integration YAML 設定
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: # dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 dbcluster-sample: "ZGhhcm1hbGluZ2Ft" --- apiVersion: v1 kind: Secret metadata: name: alloydbadmin-pw-dbcluster-sample type: Opaque data: # dbcluster-sample: "Q2hhbmdlTWUxMjM=" dbcluster-sample: "ZGhhcm1hbGluZ2Ft" # dbcluster-sample: "YXJhdmluZGFuCg==" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" # availability: # numberOfStandbys: 1 # enableStandbyAsReadReplica: true primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample systemUserPasswordRefs: alloydbadmin: alloydbadmin-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi parameters: omni_password_provider: "/samwise-scripts/credfetcher"
主要/待命複製
在上游 (主要) 和下游 (待命) 資料庫之間設定複製作業。
上游 (主要) 設定
設定主要節點,發布變更。
查看上游 (主要) 設定 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: replication-upstream-sample spec: dbcluster: name: dbcluster-sample upstream: {}
下游 (待機) 設定
設定要從主要節點同步處理的複寫目標。
查看下游 (待機) 設定 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: replication-downstream-sample spec: dbcluster: name: dbcluster-sample downstream: host: "10.10.10.10" port: 5432 username: alloydbreplica password: name: "ha-rep-pw-dbcluster-sample" replicationSlotName: "dbcluster_sample_replication_upstream_sample" control: setup # to promote downstream, change control to promote
備份、還原及複製
管理災難復原、隨需資料副本和排程。
排定的備份方案
排定完整備份和增量備份時程。
查看排定備份方案的 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: BackupPlan metadata: name: backupplan1 spec: dbclusterRef: dbcluster-sample backupRetainDays: 14 paused: false backupSchedules: # Full backup at 00:00 on every Sunday. full: "0 0 * * 0" # Incremental backup at 21:00 every day. incremental: "0 21 * * *"
備份至 Google Cloud Storage (GCS)
將備份安全地儲存在 Google Cloud Storage bucket 中。
查看備份至 Google Cloud Storage (GCS) 的 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: BackupPlan metadata: name: backupplan1 namespace: db spec: dbclusterRef: dbcluster-sample backupRetainDays: 14 paused: false backupSchedules: # Full backup at 00:00 on every Sunday. full: "0 0 * * 0" # Incremental backup at 21:00 every day. incremental: "0 21 * * *" backupLocation: type: GCS gcsOptions: bucket: dbcluster-sample-backups key: /backup # You can optionally provide a key for accessing your GCS bucket. # The key.json needs to be base64 encoded and stored in the given secret under data[key.json]. # Or comment out below, which will then use the GKE cluster service account # to access the GCS bucket (you need to make sure the service account has # the right permission to R/W the GCS bucket). secretRef: name: gcs-key namespace: db --- apiVersion: v1 kind: Secret metadata: name: gcs-key namespace: db data: key.json: | <paste your base64 encoded GCS key json here with 4 spaces for indentation>
備份至 Amazon S3
將備份檔儲存在與 Amazon S3 相容的儲存桶中。
查看備份至 Amazon S3 的 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: BackupPlan metadata: name: backupplan1 namespace: db spec: dbclusterRef: dbcluster-sample backupRetainDays: 14 paused: false backupSchedules: # Full backup at 00:00 on every Sunday. full: "0 0 * * 0" # Incremental backup at 21:00 every day. incremental: "0 21 * * *" backupLocation: type: S3 s3Options: bucket: dbcluster-sample-backups-s3 key: /backup region: "us-east-1" endpoint: "https://s3.storage.com" secretRef: name: s3-access-secret namespace: db # You can optionally provide the cert to be used to connect to the S3 with TLS. # If not provided, TLS verification will be skipped. certRef: name: server-tls namespace: server-ns --- apiVersion: v1 kind: Secret metadata: namespace: db name: "s3-access-secret" type: Opaque data: # Update the following with your S3 access keys. access-key-id: "Q2hhbmdlTWUxMjM=" # access-key-id is ChangeMe123 access-key: "Q2hhbmdlTWUxMjM=" # access-key is ChangeMe123
手動備份
建立單一手動備份。
查看「按照需求執行的手動備份」YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Backup metadata: name: backup1 spec: dbclusterRef: dbcluster-sample backupPlanRef: backupplan1 manual: true physicalBackupSpec: backupType: full
從備份還原
從儲存的備份還原或建立叢集。
查看「從備份還原」YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Restore metadata: name: restore1 spec: sourceDBCluster: dbcluster-sample backup: backup1
資料庫複製
複製標準 DBCluster。
查看資料庫副本 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Restore metadata: name: clone1 spec: sourceDBCluster: dbcluster-sample pointInTime: "2024-02-23T19:59:43Z" clonedDBClusterConfig: dbclusterName: new-dbcluster-sample
作業和容錯移轉
執行安全的拓撲轉換。
受控切換
透過計畫性切換升級次要副本,不會遺失任何資料。
查看受控切換 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Switchover metadata: name: switchover-sample spec: dbclusterRef: dbcluster-sample
災難復原容錯移轉
處理非預期的災難復原或容錯移轉情境。
查看災難復原容錯移轉 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Failover metadata: name: failover-sample spec: dbclusterRef: dbcluster-sample
連線集區 (PgBouncer)
使用 PgBouncer 設定資料庫 Proxy 層。
基本 PgBouncer
部署標準 PgBouncer 隨附項目。
查看基本的 PgBouncer YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: PgBouncer metadata: name: mypgbouncer spec: allowSuperUserAccess: true dbclusterRef: dbcluster-sample replicaCount: 1 parameters: pool_mode: transaction ignore_startup_parameters: extra_float_digits default_pool_size: "15" max_client_conn: "800" max_db_connections: "160" podSpec: resources: memory: 1Gi cpu: 1 image: "gcr.io/alloydb-omni/operator/g-pgbouncer:1.7.0" serviceOptions: type: "ClusterIP"
完整 PgBouncer
設定進階微調、自訂授權和連線集區覆寫。
查看完整的 PgBouncer YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: PgBouncer metadata: name: mypgbouncer spec: allowSuperUserAccess: true dbclusterRef: dbcluster-sample replicaCount: 2 parameters: pool_mode: transaction ignore_startup_parameters: extra_float_digits default_pool_size: "15" max_client_conn: "800" max_db_connections: "160" podSpec: resources: memory: 1Gi cpu: 1 image: "gcr.io/alloydb-omni-staging/g-pgbouncer:1.4.0" schedulingconfig: nodeaffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: nodetype operator: In values: - pgbouncer serviceOptions: type: "LoadBalancer" loadBalancerSourceRanges: - "11.0.0.0/8" annotations: networking.gke.io/load-balancer-type: "internal"
整合式服務和 Sidecar
透過機器學習、可觀測性和自訂代理程式 Sidecar,提升資料庫功能。
具有 ML 代理程式的 DBCluster
整合本機 ML 或 Vertex AI 代理伺服器 Sidecar。
查看具有 ML 代理程式 YAML 設定的 DBCluster
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: v1 kind: Secret metadata: name: vertex-ai-key-alloydb type: Opaque data: private-key.json: "" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: features: googleMLExtension: enabled: true config: vertexAIKeyRef: vertex-ai-key-alloydb vertexAIRegion: us-central1 adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi
可觀測性設定
設定叢集指標,包括自訂 SQL 查詢,以收集使用者定義的資料庫和應用程式專屬指標。
查看觀測功能設定 YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: ObservabilityConfig metadata: name: my-custom-metrics spec: dbClusterRefs: - dbcluster-sample customMetrics: resourceLimits: workMemory: "4MB" maxParallelWorkers: 0 #limits to 1 CPU core definitions: - metricGroup: querygroup_postgres database: "postgres" query: | SELECT datname, pg_database_size(datname) as db_size_bytes, (SELECT count(*) FROM pg_stat_activity WHERE datname = d.datname) as active_connections FROM pg_database d WHERE datname = 'postgres' metrics: - name: datname desc: "Database name" usage: label - name: db_size_bytes desc: "Size of the current database in bytes" usage: gauge - name: active_connections desc: "Number of active connections to the database" usage: gauge
擴充觀測指標設定
使用背景寫入器、WAL、資料表 I/O 和交易指標等補充 PostgreSQL 指標,擴充 AlloyDB Omni。
查看擴充觀測指標 YAML 設定
# This ObservabilityConfig extends AlloyDB Omni with supplemental PostgreSQL metrics. # # Intent: # Provide operational visibility into background processes, WAL, table I/O, etc. # # Prometheus Naming Pattern: # alloydb_omni_custom_<metricGroup>_<metric_name> # # Example (bgwriter): # 'checkpoints_timed' in the 'bgwriter' group appears as: # alloydb_omni_custom_bgwriter_checkpoints_timed_total # apiVersion: alloydbomni.dbadmin.goog/v1 kind: ObservabilityConfig metadata: name: obs-extended-metrics spec: dbClusterRefs: - dbcluster-sample customMetrics: resourceLimits: workMemory: "4MB" maxParallelWorkers: 0 definitions: - metricGroup: bgwriter database: "postgres" query: | SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time, buffers_clean, maxwritten_clean, buffers_backend, buffers_backend_fsync, buffers_alloc FROM pg_stat_bgwriter metrics: - name: checkpoints_timed desc: "Scheduled checkpoints performed" usage: counter - name: checkpoints_req desc: "Requested checkpoints performed" usage: counter - name: checkpoint_write_time desc: "Total time writing files to disk during checkpoint (ms)" usage: counter - name: checkpoint_sync_time desc: "Total time syncing files to disk during checkpoint (ms)" usage: counter - name: buffers_clean desc: "Buffers written by the background writer" usage: counter - name: maxwritten_clean desc: "Times bgwriter stopped because it wrote too many buffers" usage: counter - name: buffers_backend desc: "Buffers written directly by backends" usage: counter - name: buffers_backend_fsync desc: "Times backends had to execute their own fsync calls" usage: counter - name: buffers_alloc desc: "Total buffers allocated" usage: counter - metricGroup: autovacuum database: "postgres" query: | SELECT count(*) as active_autovacuum_workers FROM pg_stat_activity WHERE backend_type = 'autovacuum worker' metrics: - name: active_autovacuum_workers desc: "Number of active autovacuum worker processes" usage: gauge - metricGroup: vacuum_progress database: "postgres" query: | SELECT phase, COUNT(*) AS num_in_phase FROM pg_stat_progress_vacuum GROUP BY phase metrics: - name: phase desc: "Current phase of the vacuum operation" usage: label - name: num_in_phase desc: "Number of vacuum operations in this phase" usage: gauge - metricGroup: user_tables database: "postgres" query: | SELECT SUM(seq_scan) AS total_seq_scan, SUM(seq_tup_read) AS total_seq_tup_read, SUM(idx_scan) AS total_idx_scan, SUM(idx_tup_fetch) AS total_idx_tup_fetch, SUM(n_tup_ins) AS total_n_tup_ins, SUM(n_tup_upd) AS total_n_tup_upd, SUM(n_tup_del) AS total_n_tup_del, SUM(n_live_tup) AS total_n_live_tup, SUM(n_dead_tup) AS total_n_dead_tup, SUM(n_mod_since_analyze) AS total_n_mod_since_analyze FROM pg_stat_user_tables metrics: - name: total_seq_scan desc: "Total sequential scans on user tables" usage: counter - name: total_seq_tup_read desc: "Total rows fetched by sequential scans" usage: counter - name: total_idx_scan desc: "Total index scans on user tables" usage: counter - name: total_idx_tup_fetch desc: "Total rows fetched by index scans" usage: counter - name: total_n_tup_ins desc: "Total rows inserted" usage: counter - name: total_n_tup_upd desc: "Total rows updated" usage: counter - name: total_n_tup_del desc: "Total rows deleted" usage: counter - name: total_n_live_tup desc: "Estimated live rows" usage: gauge - name: total_n_dead_tup desc: "Estimated dead rows" usage: gauge - name: total_n_mod_since_analyze desc: "Rows modified since last analyze" usage: counter - metricGroup: statio_user_tables database: "postgres" query: | SELECT SUM(heap_blks_read) AS total_heap_blks_read, SUM(heap_blks_hit) AS total_heap_blks_hit, SUM(idx_blks_read) AS total_idx_blks_read, SUM(idx_blks_hit) AS total_idx_blks_hit, SUM(toast_blks_read) AS total_toast_blks_read, SUM(toast_blks_hit) AS total_toast_blks_hit, SUM(tidx_blks_read) AS total_tidx_blks_read, SUM(tidx_blks_hit) AS total_tidx_blks_hit FROM pg_statio_user_tables metrics: - name: total_heap_blks_read desc: "Heap blocks read from disk" usage: counter - name: total_heap_blks_hit desc: "Heap blocks found in buffer cache" usage: counter - name: total_idx_blks_read desc: "Index blocks read from disk" usage: counter - name: total_idx_blks_hit desc: "Index blocks found in buffer cache" usage: counter - name: total_toast_blks_read desc: "TOAST blocks read from disk" usage: counter - name: total_toast_blks_hit desc: "TOAST blocks found in buffer cache" usage: counter - name: total_tidx_blks_read desc: "TOAST index blocks read from disk" usage: counter - name: total_tidx_blks_hit desc: "TOAST index blocks found in buffer cache" usage: counter - metricGroup: statio_user_indexes database: "postgres" query: | SELECT SUM(idx_blks_read) AS total_index_blks_read, SUM(idx_blks_hit) AS total_index_blks_hit FROM pg_statio_user_indexes metrics: - name: total_index_blks_read desc: "Total index blocks read from disk" usage: counter - name: total_index_blks_hit desc: "Total index blocks found in buffer cache" usage: counter - metricGroup: wal database: "postgres" query: | SELECT wal_records, wal_fpi, wal_bytes, wal_buffers_full, wal_write, wal_sync, wal_write_time, wal_sync_time FROM pg_stat_wal metrics: - name: wal_records desc: "Total WAL records generated" usage: counter - name: wal_fpi desc: "Total full page images generated" usage: counter - name: wal_bytes desc: "Total WAL generated in bytes" usage: counter - name: wal_buffers_full desc: "Number of times WAL buffers were full" usage: counter - name: wal_write desc: "Number of WAL writes to disk" usage: counter - name: wal_sync desc: "Number of WAL syncs to disk" usage: counter - name: wal_write_time desc: "Total time spent writing WAL (ms)" usage: counter - name: wal_sync_time desc: "Total time spent syncing WAL (ms)" usage: counter - metricGroup: stat_wal_receiver database: "postgres" query: | SELECT status, EXTRACT(EPOCH FROM (now() - last_msg_receipt_time)) AS receiver_lag_seconds FROM pg_stat_wal_receiver WHERE last_msg_receipt_time IS NOT NULL metrics: - name: status desc: "Status of the WAL receiver" usage: label - name: receiver_lag_seconds desc: "Seconds since last message from primary" usage: gauge - metricGroup: replication_slots database: "postgres" query: | SELECT slot_name, slot_type, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS retained_wal_bytes FROM pg_replication_slots metrics: - name: slot_name desc: "Name of the replication slot" usage: label - name: slot_type desc: "Type of replication slot" usage: label - name: active desc: "Is replication slot active" usage: gauge - name: retained_wal_bytes desc: "WAL bytes retained by slot" usage: gauge - metricGroup: database database: "postgres" query: | SELECT datname, numbackends, xact_commit, xact_rollback, blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted, tup_updated, tup_deleted, conflicts, temp_files, temp_bytes, deadlocks, checksum_failures, blk_read_time, blk_write_time FROM pg_stat_database WHERE datname IS NOT NULL metrics: - name: datname desc: "Database name" usage: label - name: numbackends desc: "Connected backends" usage: gauge - name: xact_commit desc: "Transactions committed" usage: counter - name: xact_rollback desc: "Transactions rolled back" usage: counter - name: blks_read desc: "Disk blocks read" usage: counter - name: blks_hit desc: "Disk blocks found in cache" usage: counter - name: tup_returned desc: "Rows returned" usage: counter - name: tup_fetched desc: "Rows fetched" usage: counter - name: tup_inserted desc: "Rows inserted" usage: counter - name: tup_updated desc: "Rows updated" usage: counter - name: tup_deleted desc: "Rows deleted" usage: counter - name: conflicts desc: "Recovery conflicts" usage: counter - name: temp_files desc: "Temporary files created" usage: counter - name: temp_bytes desc: "Temporary file bytes" usage: counter - name: deadlocks desc: "Deadlocks detected" usage: counter - name: checksum_failures desc: "Data checksum failures" usage: counter - name: blk_read_time desc: "Time spent reading blocks (ms)" usage: counter - name: blk_write_time desc: "Time spent writing blocks (ms)" usage: counter - metricGroup: long_running_transactions database: "postgres" query: | SELECT COUNT(*) FILTER (WHERE now() - xact_start > INTERVAL '5 minutes') AS long_running_xact_count, COALESCE(EXTRACT(EPOCH FROM MAX(now() - xact_start)), 0) AS max_xact_age_seconds FROM pg_stat_activity WHERE backend_type = 'client backend' AND xact_start IS NOT NULL metrics: - name: long_running_xact_count desc: "Client transactions running > 5m" usage: gauge - name: max_xact_age_seconds desc: "Max transaction age in seconds" usage: gauge - metricGroup: stat_statements database: "postgres" query: | SELECT sum(calls) as total_calls, sum(total_exec_time) as total_exec_time_ms, sum(rows) as total_rows FROM pg_stat_statements metrics: - name: total_calls desc: "Total statement calls" usage: counter - name: total_exec_time_ms desc: "Total statement execution time (ms)" usage: counter - name: total_rows desc: "Total rows processed" usage: counter
自訂 Sidecar
將標準支援服務的 Sidecar 注入叢集 Pod。
查看自訂 Sidecar YAML 設定
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Sidecar metadata: name: sidecar-sample spec: sidecars: - image: busybox name: sidecar-sample volumeMounts: - name: obsdisk mountPath: /logs command: ["/bin/sh"] args: - -c - | while [ true ] do date set -x ls -lh /logs/diagnostic set +x done
具有自訂 Sidecar 的 DBCluster
設定包含標準支援 Sidecar 的基本 DBCluster。
查看具有自訂 Sidecar YAML 設定的 DBCluster
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi sidecarRef: name: sidecar-sample
Commvault Backup Sidecar
將 Commvault 代理程式設定指定為輔助補充資訊容器。
查看 Commvault Backup Sidecar YAML 設定
# Source: commvault/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: cvconfigmap data: CV_MASVCNAME: commvault-prod CV_CSHOSTNAME: "tipcs.idcprodcert.loc" CV_CSIPADDR: "123.123.123.123" CV_CSCLIENTNAME: "tipcs" CV_CLIENT_ROLE: "postgres" --- apiVersion: v1 kind: Secret metadata: name: commcell-secret data: CV_COMMCELL_USER: Y3ZhZG1pbgo= # commcell username is cvadmin CV_COMMCELL_PWD: Y3ZwYXNzd29yZAo= # commcell password is cvpassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Sidecar metadata: name: cv-sidecar-config annotations: alloydbomni.dbadmin.goog/sidecar: commvault spec: sidecars: - name: "commvault-pgsqlagent" image: "commvault/accessnode:11.32.42" lifecycle: preStop: exec: command: [ "/bin/sh", "-c" , "cp /opt/commvault/Base/FwConfig* /etc/CommVaultRegistry/Galaxy/FwConfig/" ] envFrom: - configMapRef: name: cvconfigmap volumeMounts: - name: logdisk mountPath: /archive/ - name: tmp-socket mountPath: /tmp - name: commvault-env-store2 mountPath: /opt/cvdocker_env readOnly: true - name: backupdisk mountPath: /etc/CommVaultRegistry subPath: Registry - name: backupdisk mountPath: /var/log/commvault/Log_Files subPath: Log_Files - name: backupdisk mountPath: /opt/commvault/MediaAgent/IndexCache subPath: IndexCache - name: backupdisk mountPath: /opt/commvault/iDataAgent/jobResults subPath: jobResults - name: backupdisk mountPath: /opt/commvault/Base/certificates subPath: certificates - name: datadisk mountPath: /mnt/disks/pgsql - name: commcell-secret mountPath: /opt/commcell_secret ports: - name: cvdport containerPort: 8400 securityContext: runAsUser: 0 additionalVolumes: - name: commcell-secret secret: secretName: commcell-secret - name: commvault-env-store2 configMap: name: cvconfigmap
具有 Commvault Sidecar 的 DBCluster
設定 DBCluster,指定 Commvault 代理程式輔助資訊車容器。
查看具有 Commvault Sidecar YAML 設定的 DBCluster
apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: "Q2hhbmdlTWUxMjM=" # Password is ChangeMe123 --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: "18.1.0" primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi - name: LogDisk size: 10Gi walArchiveSetting: location: wal/log # enable WAL archiving and archive logs to /archive/wal/log sidecarRef: name: cv-sidecar-config