zalando / postgres-operator

Postgres operator creates and manages PostgreSQL clusters running in Kubernetes
https://postgres-operator.readthedocs.io/
MIT License
4.29k stars 974 forks source link

How to set synchronous communication between primary and read-replica #2206

Open arjunavinfra opened 1 year ago

arjunavinfra commented 1 year ago

Please, answer some short questions which should help us to understand your problem / question better?

 patroni:
   synchronous_mode: false 

Also, I need the replication between the master and read-replica synchronously in each cluster like in the below diagram, What are the modifications that I need to do in configuration files to set the primary replica communication as synchronous?

anuta-dr drawio (4)

arjunavinfra commented 1 year ago

posgres-cluster.yaml

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  annotations:
    meta.helm.sh/release-name: infra-postgres
  generation: 3
  labels:
    app: infra-postgres-db
    app.kubernetes.io/managed-by: Helm
    infra: "true"
    k8s-app: infra-postgres-db
  name: infra-postgres-db
spec:
  additionalVolumes:
  - mountPath: /config
    name: postgres-exporter-config
    targetContainers:
    - postgres-exporter
    volumeSource:
      configMap:
        name: postgres-exporter-config
  allowedSourceRanges:
  - 0.0.0.0/0
  databases:
    netseva: netseva
  enableMasterLoadBalancer: true
  enableReplicaLoadBalancer: true
  numberOfInstances: 2
  patroni:
    synchronous_mode: false
  podAnnotations:
    prometheus: infra-postgres-db
    prometheus.io/path: /metrics
    prometheus.io/port: "9187"
    prometheus.io/scrape: "true"
  podPriorityClassName: high-priority
  postgresql:
    parameters:
      checkpoint_completion_target: "0.9"
      default_statistics_target: "100"
      effective_cache_size: 1536MB
      effective_io_concurrency: "200"
      log_connections: "off"
      log_destination: stderr
      log_disconnections: "off"
      log_statement: none
      logging_collector: "off"
      maintenance_work_mem: 128MB
      max_connections: "150"
      max_parallel_maintenance_workers: "1"
      max_parallel_workers: "2"
      max_parallel_workers_per_gather: "1"
      max_wal_size: 4GB
      max_worker_processes: "2"
      min_wal_size: 1GB
      random_page_cost: "1.1"
      shared_buffers: 512MB
      tcp_keepalives_count: "0"
      tcp_keepalives_idle: "0"
      tcp_keepalives_interval: "0"
      wal_buffers: 16MB
      work_mem: 3495kB
    version: "11"
  resources:
    limits:
      cpu: "2"
      memory: 16Gi
    requests:
      cpu: 200m
      memory: 4Gi
  sidecars:
  - env:
    - name: DATA_SOURCE_URI
      value: localhost/netseva?sslmode=disable
    - name: DATA_SOURCE_USER
      valueFrom:
        secretKeyRef:
          key: username
          name: postgres.infra-postgres-db.credentials
    - name: DATA_SOURCE_PASS
      valueFrom:
        secretKeyRef:
          key: password
          name: postgres.infra-postgres-db.credentials
    - name: PG_EXPORTER_EXTEND_QUERY_PATH
      value: /config/queries.yaml
    image: quay.io/anuta/postgres_exporter:v0.8.0
    name: postgres-exporter
    ports:
    - containerPort: 9187
      name: pg-metrics
      protocol: TCP
  teamId: infra
  users:
    netseva:
    - login
  volume:
    size: 100Gi
    storageClass: postgres-storage

patronictl show-config

loop_wait: 10
maximum_lag_on_failover: 33554432
postgresql:
  parameters:
    archive_mode: 'on'
    archive_timeout: 1800s
    autovacuum_analyze_scale_factor: 0.02
    autovacuum_max_workers: 5
    autovacuum_vacuum_scale_factor: 0.05
    checkpoint_completion_target: '0.9'
    default_statistics_target: '100'
    effective_cache_size: 1536MB
    effective_io_concurrency: '200'
    hot_standby: 'on'
    log_autovacuum_min_duration: 0
    log_checkpoints: 'on'
    log_connections: 'off'
    log_disconnections: 'off'
    log_line_prefix: '%t [%p]: [%l-1] %c %x %d %u %a %h '
    log_lock_waits: 'on'
    log_min_duration_statement: 500
    log_statement: none
    log_temp_files: 0
    maintenance_work_mem: 128MB
    max_connections: '150'
    max_parallel_maintenance_workers: '1'
    max_parallel_workers: '2'
    max_parallel_workers_per_gather: '1'
    max_replication_slots: 10
    max_wal_senders: 10
    max_wal_size: 4GB
    max_worker_processes: '2'
    min_wal_size: 1GB
    random_page_cost: '1.1'
    tcp_keepalives_count: '0'
    tcp_keepalives_idle: '0'
    tcp_keepalives_interval: '0'
    track_functions: all
    wal_buffers: 16MB
    wal_compression: 'on'
    wal_level: hot_standby
    wal_log_hints: 'on'
    work_mem: 3495kB
  use_pg_rewind: true
  use_slots: true
retry_timeout: 10
synchronous_mode: false
ttl: 30

postgres.yml

bootstrap:
  dcs:
    loop_wait: 10
    maximum_lag_on_failover: 33554432
    postgresql:
      parameters:
        archive_mode: 'on'
        archive_timeout: 1800s
        autovacuum_analyze_scale_factor: 0.02
        autovacuum_max_workers: 5
        autovacuum_vacuum_scale_factor: 0.05
        checkpoint_completion_target: '0.9'
        default_statistics_target: '100'
        effective_cache_size: 1536MB
        effective_io_concurrency: '200'
        hot_standby: 'on'
        log_autovacuum_min_duration: 0
        log_checkpoints: 'on'
        log_connections: 'off'
        log_disconnections: 'off'
        log_line_prefix: '%t [%p]: [%l-1] %c %x %d %u %a %h '
        log_lock_waits: 'on'
        log_min_duration_statement: 500
        log_statement: none
        log_temp_files: 0
        maintenance_work_mem: 128MB
        max_connections: '150'
        max_parallel_maintenance_workers: '1'
        max_parallel_workers: '2'
        max_parallel_workers_per_gather: '1'
        max_replication_slots: 10
        max_wal_senders: 10
        max_wal_size: 4GB
        max_worker_processes: '2'
        min_wal_size: 1GB
        random_page_cost: '1.1'
        tcp_keepalives_count: '0'
        tcp_keepalives_idle: '0'
        tcp_keepalives_interval: '0'
        track_functions: all
        wal_buffers: 16MB
        wal_compression: 'on'
        wal_level: hot_standby
        wal_log_hints: 'on'
        work_mem: 3495kB
      use_pg_rewind: true
      use_slots: true
    retry_timeout: 10
    synchronous_mode: true
    ttl: 30
  initdb:
  - auth-host: md5
  - auth-local: trust
  post_init: /scripts/post_init.sh "zalandos"
  users:
    zalandos:
      options:
      - CREATEDB
      - NOLOGIN
      password: ''
kubernetes:
  bypass_api_service: true
  labels:
    application: spilo
  pod_ip: 10.200.14.8
  ports:
  - name: postgresql
    port: 5432
  role_label: spilo-role
  scope_label: pg-cluster-name
  use_endpoints: true
namespace: atom
postgresql:
  authentication:
    replication:
      password: <>
      username: standby
    superuser:
      password: <>
      username: postgres
  basebackup_fast_xlog:
    command: /scripts/basebackup.sh
    retries: 2
  bin_dir: /usr/lib/postgresql/11/bin
  callbacks:
    on_role_change: /scripts/on_role_change.sh zalandos true
  connect_address: 10.200.14.8:5432
  create_replica_method:
  - basebackup_fast_xlog
  data_dir: /home/postgres/pgdata/pgroot/data
  listen: '*:5432'
  name: infra-postgres-db-0
  parameters:
    archive_command: /bin/true
    bg_mon.history_buckets: 120
    bg_mon.listen_address: '::'
    extwlist.custom_path: /scripts
    extwlist.extensions: btree_gin,btree_gist,citext,extra_window_functions,first_last_agg,hll,hstore,hypopg,intarray,ltree,pgcrypto,pgq,pgq_node,pg_trgm,postgres_fdw,tablefunc,uuid-ossp,timescaledb,pg_partman
    log_destination: stderr
    log_directory: ../pg_log
    log_file_mode: '0644'
    log_filename: postgresql-%u.log
    log_rotation_age: 1d
    log_truncate_on_rotation: 'on'
    logging_collector: 'off'
    pg_stat_statements.track_utility: 'off'
    shared_buffers: 512MB
    shared_preload_libraries: bg_mon,pg_stat_statements,pgextwlist,pg_auth_mon,set_user,timescaledb,pg_cron,pg_stat_kcache
    ssl: 'on'
    ssl_cert_file: /run/certs/server.crt
    ssl_key_file: /run/certs/server.key
  pg_hba:
  - local   all             all                                   trust
  - hostssl all             +zalandos    127.0.0.1/32       pam
  - host    all             all                127.0.0.1/32       md5
  - hostssl all             +zalandos    ::1/128            pam
  - host    all             all                ::1/128            md5
  - local   replication     standby                    trust
  - hostssl replication     standby all                md5
  - hostnossl all           all                all                reject
  - hostssl all             +zalandos    all                pam
  - hostssl all             all                all                md5
  pgpass: /run/postgresql/pgpass
  use_unix_socket: true
  use_unix_socket_repl: true
restapi:
  connect_address: 10.200.14.8:8008
  listen: :8008
scope: infra-postgres-db