דוגמאות להגדרות של AlloyDB Omni ב-Kubernetes

בדף הזה מוצגות דוגמאות להגדרות YAML לפריסה ולניהול של AlloyDB Omni ב-Kubernetes.

הגדרות הליבה ומערכת ההפעלה של DBCluster

לבדוק את ההגדרות של אשכול הבסיס ואת ההגדרות של מערכת ההפעלה בהתאמה אישית.

‫DBCluster מינימלי

הגדרה בסיסית לפריסת DBCluster של AlloyDB Omni.

הצגת הגדרת YAML מינימלית של DBCluster

# 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: "15.17.0"
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-dbcluster-sample
    resources:
      memory: 5Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 10Gi

אשכול מסדי נתונים מלא

הגדרה מקיפה שבה מוצגות ההגדרות הזמינות.

הצגת הגדרת 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:
  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: "15.17.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: "15.17.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.

הצגת הגדרת YAML של פריסות שמבוססות על Debian

# 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: "15.17.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).

הצגת הגדרת YAML של פריסות מבוססות-UBI9

# 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: "15.17.0"
  databaseImageOSType: UBI9
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-dbcluster-sample
    resources:
      memory: 5Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 10Gi

אפשרויות תזמון של Pod

הגדרת זיקה של צומת, סבילות והתנהגויות תזמון.

הצגת הגדרת YAML של אפשרויות תזמון Pod

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: "15.17.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

זמינות גבוהה והתאמה לעומס (scaling)

להפיץ את התנועה ולוודא שאין זמן השבתה או שהוא מינימלי.

HA DBCluster

הגדרת כמה רפליקות לזמינות גבוהה.

הצגת הגדרת ה-YAML של HA 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: "15.17.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 עם מאזן עומסים

חשיפת נקודות קצה לקריאה/כתיבה באמצעות איזון עומסים של שירותים.

הצגת הגדרת 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: "15.17.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: "15.17.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.

הצגת הגדרת YAML של שילוב Vault

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: "15.17.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"

אימות בהגדרת המשתמש (Active Directory)

הגדרת כללים מותאמים אישית של pg_hba.conf ו-pg_ident.conf וסודות של קובץ keytab של Kerberos לאימות Active Directory ‏ (GSSAPI).

הצגת הגדרת YAML של אימות בהגדרת המשתמש

apiVersion: v1
kind: Secret
metadata:
  name: db-keytab-dbcluster-sample
type: Opaque
data:
  krb5.keytab: |
    DUMMY_KEYTAB
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: UserDefinedAuthentication
metadata:
  name: dbcluster-sample-ad-auth
spec:
  dbclusterRef:
    name: dbcluster-sample
  keytabSecretRef:
    name: db-keytab-dbcluster-sample
  pgHbaEntries:
    - hostgssenc all all 0.0.0.0/0 gss
    - hostgssenc all all ::1/128 gss
    - hostssl all all 0.0.0.0/0 scram-sha-256
    - hostssl all all ::/0 scram-sha-256
  pgIdentEntries:
    - usermap active_directory_user postgres_user

שכפול ראשי-המתנה

מגדירים רפליקציה בין מסדי נתונים במעלה הזרם (ראשי) ובמורד הזרם (המתנה).

הגדרה במעלה הזרם (ראשי)

מגדירים את הצומת הראשי לפרסום שינויים.

הצגת ההגדרה של Upstream (Primary) Configuration YAML

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: replication-upstream-sample
spec:
  dbcluster:
    name: dbcluster-sample
  upstream: {}

הגדרת Downstream (המתנה)

הגדרת יעדי רפליקציה לסנכרון מצומת ראשי.

הצגת ההגדרה של Downstream (Standby) Configuration 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

גיבוי, שחזור ושכפול

ניהול תוכנית התאוששות מאסון (DR), עותקי נתונים על פי דרישה ולוחות זמנים.

תוכנית גיבוי מתוזמנת

לתזמן גיבויים מלאים ומצטברים.

הצגת הגדרת 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 * * *"

גיבוי ב-Cloud Storage

אחסון מאובטח של גיבויים בקטגוריה של Cloud Storage.

הצגת הגדרות ה-YAML של הגיבוי ב-Cloud Storage

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.

הצגת הגדרת ה-YAML של הגיבוי ל-Amazon S3

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

שכפול מסד נתונים

שכפול של אשכולות DB רגילים.

הצגת הגדרת ה-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

יתירות כשל בתוכנית התאוששות מאסון (DR)

טיפול בתרחישים לא מתוכננים של התאוששות מאסון (DR) או יתירות כשל.

הצגת הגדרת ה-YAML של יתירות כשל בתוכנית התאוששות מאסון (DR)

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Failover
metadata:
  name: failover-sample
spec:
  dbclusterRef: dbcluster-sample

מאגר חיבורים (PgBouncer)

הגדרת שכבות של שרתי proxy למסדי נתונים באמצעות PgBouncer.

‫PgBouncer בסיסי

פריסת שירות נלווה רגיל של PgBouncer.

הצגת הגדרת YAML בסיסית של PgBouncer

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"

שירותים משולבים ו-sidecars

שיפור יכולות מסד הנתונים באמצעות למידת מכונה, יכולת תצפית וסיידקארים של סוכנים בהתאמה אישית.

DBCluster עם סוכן ML

משלבים את ה-sidecar של שרת ה-proxy של Vertex AI או של ה-ML המקומי.

הצגת הגדרת YAML של DBCluster עם סוכן ML

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: "15.17.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

הגדרת ניראות (observability)

להגדיר מדדי אשכולות, כולל שאילתות SQL בהתאמה אישית, כדי לאסוף מדדים ספציפיים לאפליקציות ולמסדי נתונים שהוגדרו על ידי המשתמשים.

הצגת הגדרת YAML של הגדרת הניראות (observability)

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

הגדרת מדדי ניראות (observability) מורחבים

להרחיב את AlloyDB Omni באמצעות מדדים נוספים של PostgreSQL, כמו כותב ברקע, WAL, קלט/פלט של טבלה ומדדי טרנזקציות.

הצגת הגדרת 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 לתמיכה רגילה בפודים של האשכול.

הצגת הגדרת YAML של Custom Sidecar

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

DBCluster עם Sidecar בהתאמה אישית

מגדירים DBCluster בסיסי שכולל sidecars סטנדרטיים לתמיכה.

הצגת DBCluster עם הגדרת YAML של Sidecar בהתאמה אישית

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: "15.17.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 כ-sidecar של כלי עזר.

הצגת הגדרת ה-YAML של Commvault Backup Sidecar

# 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

‫DBCluster עם Commvault Sidecar

מגדירים DBCluster שמציין קונטיינר משני (sidecar) של עוזר אישי לסוכן Commvault.

הצגת DBCluster עם הגדרת Commvault Sidecar 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: "15.17.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