Exemplos de configuração do AlloyDB Omni no Kubernetes

Esta página fornece exemplos de configuração YAML para implantação e gerenciamento do AlloyDB Omni no Kubernetes.

Configurações principais e de SO do DBCluster

Confira as configurações básicas do cluster e as configurações personalizadas do sistema operacional.

Minimal DBCluster

Uma configuração básica para implantar um DBCluster do AlloyDB Omni.

Ver configuração YAML mínima do 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: "18.3.0"
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-dbcluster-sample
    resources:
      memory: 5Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 10Gi

Full DBCluster

Uma configuração abrangente que mostra as opções disponíveis.

Ver a configuração completa do YAML do 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: "18.3.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"

Parâmetros personalizados

Configure parâmetros personalizados do PostgreSQL.

Ver a configuração YAML de parâmetros personalizados

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.3.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"

Implantações baseadas em Debian

Especifique uma base de imagem do SO Debian.

Ver a configuração YAML de implantações baseadas em 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: "18.3.0"
  databaseImageOSType: Debian
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-dbcluster-sample
    resources:
      memory: 5Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 10Gi

Implantações baseadas no UBI9

Especifique uma base da Red Hat Universal Base Image 9 (UBI 9).

Ver a configuração YAML de implantações baseadas no 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: "18.3.0"
  databaseImageOSType: UBI9
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-dbcluster-sample
    resources:
      memory: 5Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 10Gi

Opções de programação de pods

Configure a afinidade de nós, tolerâncias e comportamentos de programação.

Ver a configuração YAML das opções de programação de pods

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.3.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

Alta disponibilidade e escalonamento

Distribuir o tráfego e garantir tempo de inatividade zero ou mínimo.

HA DBCluster

Configure várias réplicas para alta disponibilidade.

Ver a configuração YAML do DBCluster de alta disponibilidade

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.3.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 com balanceador de carga

Exponha endpoints de leitura/gravação usando o balanceamento de carga de serviço.

Ver DBCluster com configuração YAML do balanceador de carga

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.3.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

Instância do pool de leitura

Adicione instâncias de pool somente leitura para escalonar operações de leitura.

Conferir a configuração YAML da instância do pool de leitura

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"

Gerenciamento de segurança e secrets

Proteja chaves, certificados e credenciais de cluster.

Emissores de certificados

Configure emissores de certificados TLS personalizados.

Ver a configuração YAML dos emissores de certificados

# 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.3.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

Integração do Vault

Recupere e mantenha os secrets seguros usando o HashiCorp Vault.

Ver a configuração YAML da integração do 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: "18.3.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"

Replicação primária-em espera

Configure a replicação entre os bancos de dados upstream (principal) e downstream (em espera).

Configuração upstream (primária)

Configure o nó principal para publicar as mudanças.

Ver a configuração YAML upstream (principal)

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

Configuração downstream (em espera)

Configure destinos de replicação para sincronizar de um nó principal.

Ver a configuração YAML downstream (em espera)

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

Backup, restauração e clonagem

Gerenciar a recuperação de desastres, cópias de dados sob demanda e programações.

Plano de backup programado

Programar backups completos e incrementais.

Ver a configuração YAML do plano de backup programado

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 * * *"

Fazer backup no Google Cloud Storage (GCS)

Armazene backups com segurança em um bucket do Google Cloud Storage.

Ver a configuração YAML de backup para o Google Cloud Storage (GCS)

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>

Fazer backup no Amazon S3

Armazene backups em um bucket compatível com o Amazon S3.

Ver a configuração YAML do Backup para o 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

Backup manual sob demanda

Crie um único backup manual.

Ver a configuração YAML de backup manual on demand

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Backup
metadata:
  name: backup1
spec:
  dbclusterRef: dbcluster-sample
  backupPlanRef: backupplan1
  manual: true
  physicalBackupSpec:
    backupType: full

Restaurar do backup

Recupere ou crie um cluster de um backup armazenado.

Ver a configuração YAML de restauração do backup

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Restore
metadata:
  name: restore1
spec:
  sourceDBCluster: dbcluster-sample
  backup: backup1

Clone do banco de dados

Clonar DBClusters padrão.

Ver a configuração YAML do clone de banco de dados

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

Operações e failover

Executar transições de topologia seguras.

Troca controlada

Promova uma réplica secundária com uma alternância planejada sem perda de dados.

Ver a configuração YAML da migração controlada

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

Failover de recuperação de desastres

Lidar com cenários não planejados de recuperação de desastres ou failover.

Ver a configuração YAML de failover de recuperação de desastres

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

Pooling de conexões (PgBouncer)

Configure camadas de proxy de banco de dados usando o PgBouncer.

PgBouncer básico

Implante um complemento padrão do PgBouncer.

Ver a configuração YAML básica do 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 completo

Configure o ajuste avançado, a autorização personalizada e as substituições de pool de conexões.

Ver a configuração YAML completa do PgBouncer

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"

Serviços integrados e sidecars

Melhore os recursos do banco de dados com machine learning, observabilidade e contêineres secundários de agente personalizados.

DBCluster com agente de ML

Integre o sidecar proxy local de ML ou da Vertex AI.

Ver DBCluster com configuração YAML do agente de 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: "18.3.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

Configuração de observabilidade

Configure métricas de cluster, incluindo consultas SQL personalizadas para coletar métricas definidas pelo usuário e específicas do aplicativo.

Ver a configuração YAML da configuração de observabilidade

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

Configuração estendida de métricas de observabilidade

Estenda o AlloyDB Omni com métricas complementares do PostgreSQL, como gravador em segundo plano, WAL, E/S de tabela e métricas de transação.

Ver a configuração YAML das métricas de observabilidade estendida

# 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 the last ANALYZE operation"
            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 personalizado

Injete arquivos secundários de suporte padrão nos pods do cluster.

Ver a configuração YAML do sidecar personalizado

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 com arquivo secundário personalizado

Configure um DBCluster de base que inclua sidecars de suporte padrão.

Ver DBCluster com configuração YAML de arquivo secundário personalizado

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

Sidecar de backup do Commvault

Especifique a configuração do agente do Commvault como um arquivo secundário auxiliar.

Ver a configuração YAML do sidecar de backup do Commvault

# 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 com sidecar do Commvault

Configure um DBCluster que especifica um contêiner de arquivo secundário auxiliar do agente do Commvault.

Ver DBCluster com configuração YAML do Commvault 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: "18.3.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