patroni+etcd部署 使用callbacks回调函数实现failover时的vip漂移

节点规划

IP hostname 部署服务
10.0.0.101 PostgreSQL-01 etcd-v3.5.21+PostgreSQL 15.5+ patroni 4.0.5
10.0.0.102 PostgreSQL-02 etcd-v3.5.21+PostgreSQL 15.5+ patroni 4.0.5
10.0.0.103 PostgreSQL-03 etcd-v3.5.21+PostgreSQL 15.5+ patroni 4.0.5
10.0.0.104 PostgreSQL-04 PostgreSQL 15.5 + patroni 4.0.5
10.0.0.105 PostgreSQL-05 PostgreSQL 15.5 + patroni 4.0.5
10.0.0.106 PostgreSQL-06 PostgreSQL 15.5 + patroni 4.0.5

1.安装etcd

在所有etcd节点执行

[root@PostgreSQL-01 ~]# cd /opt
[root@PostgreSQL-01 opt]# wget https://github.com/etcd-io/etcd/releases/download/v3.5.21/etcd-v3.5.21-linux-amd64.tar.gz
[root@PostgreSQL-01 opt]# tar xf etcd-v3.5.21-linux-amd64.tar.gz
[root@PostgreSQL-01 opt]# cd etcd-v3.5.21-linux-amd64
[root@PostgreSQL-01 etcd-v3.5.21-linux-amd64]# cp etcd /usr/bin/
[root@PostgreSQL-01 etcd-v3.5.21-linux-amd64]# cp etcdctl /usr/bin/

[root@PostgreSQL-01 etcd-v3.5.21-linux-amd64]# etcd --version
etcd Version: 3.5.21
Git SHA: a17edfd
Go Version: go1.23.7
Go OS/Arch: linux/amd64

2.配置启动etcd

2.1 编辑etcd配置文件

在所有etcd节点执行

# 所有节点都要配置,按本地ip修改配置
[root@PostgreSQL-01 ~]# mkdir /data/etcd
[root@PostgreSQL-01 ~]# chown -R postgres.postgres /data/etcd
[root@PostgreSQL-01 ~]# cd /data/etcd
[root@PostgreSQL-01 ~]# vim etcd.yaml
# [Member]
name: etcd1
data-dir: "/data/etcd"
listen-client-urls: "http://127.0.0.1:2379,http://10.0.0.101:2379"
listen-peer-urls: "http://10.0.0.101:2380"
# [Cluster]
initial-advertise-peer-urls: "http://10.0.0.101:2380"
initial-cluster: "etcd1=http://10.0.0.101:2380,etcd2=http://10.0.0.102:2380,etcd3=http://10.0.0.103:2380"
initial-cluster-token: "etcd-cluster"
initial-cluster-state: "new"
advertise-client-urls: "http://127.0.0.1:2379,http://10.0.0.101:2379"
# [Logging]
log-outputs:
  - "/data/etcd/etcd.log"  # 必须是数组形式
  - "stderr"               # 可以同时输出到多个目标
log-level: warn
enable-log-rotation: true
log-rotation-config-json: '{"maxsize": 100, "maxage": 7, "maxbackups": 0, "localtime": true, "compress": true}'

# 以下为不同节点需要修改的内容
name: etcd1
listen-client-urls: "http://127.0.0.1:2379,http://本机ip:2379"
listen-peer-urls: "http://本机ip:2380"
initial-advertise-peer-urls: "http://本机ip:2380"
advertise-client-urls: "http://127.0.0.1:2379,http://本机ip:2379"

2.2 配置system启动文件

在所有etcd节点执行

[root@PostgreSQL-01 ~]# vi /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=notify
User=postgres
ExecStart=/usr/bin/etcd --config-file=/data/etcd/etcd.yaml
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

2.3 启动etcd

在所有etcd节点执行

[root@PostgreSQL-01 ~]# systemctl daemon-reload
[root@PostgreSQL-01 ~]# systemctl enable etcd
# 单个节点启动后会hang在前台,因为找不到集群其他节点,其他节点启动后才能进入到后台
[root@PostgreSQL-01 ~]# systemctl start etcd  

查看成员列表

[root@PostgreSQL-01 etcd]# etcdctl -w table  member list

在这里插入图片描述

查看主节点

[root@PostgreSQL-01 etcd]# etcdctl --endpoints=10.0.0.101:2379,10.0.0.102:2379,10.0.0.103:2379 -w table endpoint status

在这里插入图片描述

3.安装patroni

3.1 安装patroni

在所有的数据库节点执行

[root@PostgreSQL-01 ~]# mkdir /data/patroni -p
[root@PostgreSQL-01 ~]# pip3 install 'psycopg2-binary==2.9.8'
[root@PostgreSQL-01 ~]# pip3 install 'patroni[etcd]==4.0.5'
# gcc版本较低可能会报错,可以尝试使用以下方式安装
# CFLAGS='-std=c99' pip3 install 'patroni[etcd]==4.0.5'
[root@PostgreSQL-01 ~]# patroni --version
patroni 4.0.5

3.2 配置postgres用户的sudo权限

在所有的数据库节点执行

# failover时需要postgres执行ip与arping等操作,需要sudo权限
[root@PostgreSQL-01 ~]# vim /etc/sudoers
postgres ALL=(ALL) NOPASSWD: ALL

4. 配置启动patroni

4.1 编辑patroni配置文件

在所有数据节点节点配置

# 同一集群中的数据库节点都要配置,注意每个节点不同的参数是:
# name: pg_cluster1_node1
# restapi 里的 connect_address: 10.0.0.101:8008
# postgresql 里的 connect_address: 10.0.0.101:5432

[root@PostgreSQL-01 ~]# cd /data/patroni
[root@PostgreSQL-01 patroni]# vim pg_cluster1.yaml
log:
  dir: /data/patroni
  type: plain
  file_size: 104857600
  file_num: 5
  level: INFO
  date_format: '+%Y-%m-%d %H:%M:%S %z'
# 集群名
scope: pg_cluster1
# 定义 etcd 中存储集群相关信息的目录,在etcd的保存目录为/namespace/scope
namespace: /service
# 节点名称
name: pg_cluster1_node1
# 表示 Patroni 的 REST API 监听的地址和端口
restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.0.101:8008

# etcd 集群的地址列表,如果使用etcd2版本,这里就用"etcd:",如果使用etcd3版本,这里就用"etcd3:"
etcd3:
  hosts: 10.0.0.101:2379,10.0.0.102:2379,10.0.0.103:2379

bootstrap:
# 分布式一致性系统(DCS)相关的配置
  dcs:
# Leader 锁的租约时间,如果超过这个时间 Leader 没有续约,将触发故障转移
    ttl: 30
# 主循环的休眠时间,即 Patroni 每次检查集群状态的间隔
    loop_wait: 10
# DCS 和 PostgreSQL 操作重试的超时时间
    retry_timeout: 5
# 以上三个值需要满足 "loop_wait + 2 * retry_timeout <= ttl"
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: true
    postgresql:
      use_pg_rewind: true
      use_slots: true
      # patroni启动后,会将数据库的原配置文件重命名为postgresql.base.conf,按照以下配置来新生成一份配置文件postgresql.conf,新的配置文件头部会include 'postgresql.base.conf'。
      parameters:
        hot_standby: 'on'
        listen_addresses: '0.0.0.0'
        port: '5432'
        max_connections: '1000'
        password_encryption: 'md5'
        max_locks_per_transaction: '64'
        max_prepared_transactions: '0'
        max_replication_slots: '10'
        max_wal_senders: '10'
        max_worker_processes: '8'
        max_stack_depth: '2MB'
        track_commit_timestamp: 'off'
        log_timezone: 'Asia/Shanghai'
        logging_collector: 'on'
        log_destination: 'stderr'
        log_min_messages: 'warning'   
        log_directory: 'log'
        log_filename: 'postgresql-%Y-%m-%d.log' 
        log_truncate_on_rotation: off 
        log_rotation_age: '1d'
        log_rotation_size: '0'
        log_min_duration_statement: '1000'
        log_statement: 'none'
        lc_messages: 'en_US.UTF-8'
        log_line_prefix: '%t [%p]: user:%u,db:%d,app:%a,client:%h '
        shared_buffers: '1GB'
        temp_buffers: '8MB'
        work_mem: '8MB'
        maintenance_work_mem: '128MB' 
        huge_pages: 'on'
        temp_file_limit: '20GB'
        fsync: 'on'
        commit_delay: '0'
        full_page_writes: 'on'
        synchronous_commit: 'on'
        wal_level: 'replica'
        wal_compression: 'on'
        wal_keep_size: '10GB'
        wal_level: 'replica'
        wal_log_hints: 'on'
        wal_sync_method: 'fdatasync'
        wal_buffers: '16MB'
        max_wal_size: '40GB'
        min_wal_size: '10GB'
        wal_keep_size: '10GB'
        autovacuum: 'on'
        autovacuum_work_mem: '256MB'
postgresql:   
  listen: 0.0.0.0:5432
  connect_address: 10.0.0.101:5432
  data_dir: /data/pgsql/data
  bin_dir: /usr/local/pgsql/bin
  config_dir: /data/pgsql/data
  authentication:
    replication:
      username: repuser
      password: '123'
    superuser:
      username: postgres
      password: '123'
#回调函数,在数据库发生了启动,重启和主库切换这些动作时,会调用配置的脚本进行其他动作,这里配置的是vip生成脚本
  callbacks:
    on_stop: /bin/bash /data/patroni/pg_cluster1_vip.sh
    on_start: /bin/bash /data/patroni/pg_cluster1_vip.sh
    on_restart: /bin/bash /data/patroni/pg_cluster1_vip.sh
    on_role_change: /bin/bash /data/patroni/pg_cluster1_vip.sh

watchdog:
    mode: off

tags:
# 是否禁止该节点成为主库
    nofailover: false
# 是否从负载均衡池中排除
    noloadbalance: false
# 是否允许其他节点从此节点克隆数据
    clonefrom: false
# 是否禁止该节点成为同步备库
    nosync: false

4.2 编辑vip脚本

在所有数据节点节点配置

[root@PostgreSQL-01 patroni]# cd /data/patroni
[root@PostgreSQL-01 patroni]# vim pg_cluster1_vip.sh
#!/bin/bash
# 加强版的 VIP 管理脚本
exec >> /data/patroni/patroni.log 2>&1

readonly OPERATION=$1
readonly ROLE=$2
readonly SCOPE=$3

VIP='10.0.0.201'
PREFIX='32'
DEV='ens33'
LABEL="${DEV}:vip"

function usage() {
    echo "Usage: $0 <on_start|on_stop|on_role_change> <ROLE> <SCOPE>"
    exit 1
}

function log() {
    echo "$(date "+%Y-%m-%d %H:%M:%S %z") $1"
}

function remove_vip() {
    # 检查 VIP 是否存在
    if ip addr show ${DEV} | grep -q "${VIP}/${PREFIX}"; then
        sudo ip addr del ${VIP}/${PREFIX} dev ${DEV} label ${LABEL}
        log "VIP ${VIP} removed successfully"
        
        # 发送 gratuitous ARP 更新邻居
        sudo arping -q -A -c 3 -I ${DEV} ${VIP} 2>/dev/null
    else
        log "VIP ${VIP} not present, no action needed"
    fi
}

function add_vip() {
    # 检查 VIP 是否已存在
    if ! ip addr show ${DEV} | grep -q "${VIP}/${PREFIX}"; then
        sudo ip addr add ${VIP}/${PREFIX} dev ${DEV} label ${LABEL}
        log "VIP ${VIP} added successfully"
        
        # 发送 gratuitous ARP 通知网络
        sudo arping -q -A -c 3 -I ${DEV} ${VIP}
    else
        log "VIP ${VIP} already present"
    fi
}

# 主逻辑
log "Callback triggered: OPERATION=${OPERATION}, ROLE=${ROLE}, SCOPE=${SCOPE}"

case $OPERATION in
    on_stop)
        log "Service stopping, removing VIP"
        remove_vip
        ;;
        
    on_start | on_restart | on_role_change)
        # 兼容多种角色名称
        if [[ $ROLE == 'master' || $ROLE == 'primary' || $ROLE == 'leader' ]]; then
            add_vip
        else
            log "Role is ${ROLE}, removing VIP"
            remove_vip
        fi
        ;;
        
    *)
        log "Unknown operation: ${OPERATION}"
        usage
        ;;
esac

log "Callback completed"

4.3 配置system启动

在所有数据节点配置

[root@PostgreSQL-01 patroni]# vim /usr/lib/systemd/system/patroni.service
[Unit]
Description=patroni - a high-availability PostgreSQL
Documentation=https://patroni.readthedocs.io/en/latest/index.html
After=syslog.target network.target watchdog.service
Wants=network-online.target

[Service]
Type=simple
User=postgres
Group=postgres
PermissionsStartOnly=true
Environment="PGHOME=/usr/local/pgsql" 
Environment="PGDATA=/data/pgsql/data" 
Environment="PGPORT=5432"
Environment="LD_LIBRARY_PATH=/usr/local/pgsql/lib" 
Environment="PATH=/usr/local/pgsql/bin:/usr/local/bin:/usr/bin:/usr/sbin" 
ExecStart= /usr/local/bin/patroni /data/patroni/pg_cluster1.yaml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65536
KillMode=process
KillSignal=SIGINT
Restart=on-abnormal
RestartSec=30s
TimeoutSec=0
[Install]
WantedBy=multi-user.target


# 注意
# Type=simple,不能设置为forking,否则会一直hang住
# 这里设置了这么多变量是因为如果不设置,通过system启动后无法找到相关变量信息

5.启动patroni

5.1 启动第一个patroni节点

[root@PostgreSQL-01 patroni]# systemctl daemon-reload
[root@PostgreSQL-01 patroni]# systemctl start patroni

查看日志

# 查看日志可以发现,数据库服务被拉起,当前节点的角色由replica变为primary,VIP添加成功
[root@PostgreSQL-01 patroni]# tail -f patroni.log 
2026-02-28 14:40:28,059 WARNING: Postgresql is not running.
2026-02-28 14:40:28 +0800 Callback triggered: OPERATION=on_start, ROLE=replica, SCOPE=pg_cluster1
2026-02-28 14:40:28 +0800 Role is replica, removing VIP
2026-02-28 14:40:28 +0800 VIP 10.0.0.201 not present, no action needed
2026-02-28 14:40:28 +0800 Callback completed
2026-02-28 14:40:28 +0800 Callback triggered: OPERATION=on_role_change, ROLE=primary, SCOPE=pg_cluster1
2026-02-28 14:40:28 +0800 VIP 10.0.0.201 added successfully
2026-02-28 14:40:30 +0800 Callback completed

vip成功挂载

在这里插入图片描述

查看数据目录

[root@PostgreSQL-01 ~]# ll /data/pgsql/data
total 120
drwx------ 5 postgres postgres    33 Feb 28 14:21 base
drwx------ 2 postgres postgres  4096 Feb 28 14:40 global
-rw------- 1 postgres postgres   567 Feb 28 14:21 patroni.dynamic.json
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_commit_ts
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_dynshmem
-rw------- 1 postgres postgres  4791 Feb 28 14:21 pg_hba.conf
-rw------- 1 postgres postgres  4791 Feb 28 14:40 pg_hba.conf.backup
-rw------- 1 postgres postgres  1636 Feb 28 14:21 pg_ident.conf
-rw------- 1 postgres postgres  1636 Feb 28 14:40 pg_ident.conf.backup
drwx------ 4 postgres postgres    68 Feb 28 14:40 pg_logical
drwx------ 4 postgres postgres    36 Feb 28 14:21 pg_multixact
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_notify
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_replslot
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_serial
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_snapshots
drwx------ 2 postgres postgres     6 Feb 28 14:40 pg_stat
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_stat_tmp
drwx------ 2 postgres postgres    18 Feb 28 14:21 pg_subtrans
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_tblspc
drwx------ 2 postgres postgres     6 Feb 28 14:21 pg_twophase
-rw------- 1 postgres postgres     3 Feb 28 14:21 PG_VERSION
drwx------ 3 postgres postgres   116 Feb 28 14:40 pg_wal
drwx------ 2 postgres postgres    18 Feb 28 14:21 pg_xact
-rw------- 1 postgres postgres    88 Feb 28 14:21 postgresql.auto.conf
-rw------- 1 postgres postgres 29442 Feb 28 14:21 postgresql.base.conf
-rw------- 1 postgres postgres 29442 Feb 28 14:40 postgresql.base.conf.backup
-rw------- 1 postgres postgres   724 Feb 28 14:40 postgresql.conf
-rw------- 1 postgres postgres   724 Feb 28 14:40 postgresql.conf.backup
-rw------- 1 postgres postgres   447 Feb 28 14:40 postmaster.opts
-rw------- 1 postgres postgres    80 Feb 28 14:40 postmaster.pid

登录数据库,查看初始化用户已成功创建,但当前的pg_hba规则是全部免密

在这里插入图片描述

修改pg_hba文件,并重载配置

[postgres@PostgreSQL-01 data]$ vi pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     repuser         10.0.0.0/24             md5
host    replication     repuser         127.0.0.1/32            md5
host    replication     repuser         ::1/128                 md5
host    all             postgres        10.0.0.0/24             md5
host    all             postgres        127.0.0.1/32            md5
local   all             postgres                                md5
host    all             postgres        ::1/128                 md5

[postgres@PostgreSQL-01 data]$ pg_ctl reload -D $PGDATA

数据库成功启用密码验证

在这里插入图片描述

5.2 启动后续节点

[root@PostgreSQL-02 patroni]# systemctl daemon-reload
[root@PostgreSQL-02 patroni]# systemctl start patroni
[root@PostgreSQL-02 patroni]# vi patroni.log

在这里插入图片描述

[root@PostgreSQL-03 patroni]# systemctl daemon-reload
[root@PostgreSQL-03 patroni]# systemctl start patroni
[root@PostgreSQL-03 patroni]# vi patroni.log

在这里插入图片描述

5.3 查看集群列表

patronictl -c /data/patroni/pg_cluster1.yaml list

在这里插入图片描述

5.4 使用vip登录数据库

在这里插入图片描述

6.运维操作

查看当前集群节点列表

patronictl -c /data/patroni/pg_cluster1.yaml list

查看当前集群参数

patronictl -c /data/patroni/pg_cluster1.yaml show-config

修改集群参数

patronictl -c /data/patroni/pg_cluster1.yaml edit-config
# 修改前的值会有红色标记
# 修改后的值会有绿色标记

在这里插入图片描述

patroni日志中会有参数修改的记录,并且postgresql.conf中的参数值会被修改

[root@PostgreSQL-02 patroni]# grep "max_connections" patroni.log 

[root@PostgreSQL-02 patroni]# grep "max_connections" /data/pgsql/data/postgresql.conf

在这里插入图片描述

如果是重启类参数,此时查看集群列表会有显示需要重启生效,需要按先从后主的顺序重启

在这里插入图片描述

重启节点

[root@PostgreSQL-01 patroni]# patronictl -c /data/patroni/pg_cluster1.yaml restart pg_cluster1 pg_cluster1_node2

switchover操作

[root@PostgreSQL-01 patroni]# patronictl -c /data/patroni/pg_cluster1.yaml switchover

# 注意,只能切换到同步流节点,否则会报错
Switchover failed, details: 412, candidate name does not match with sync_standby

在这里插入图片描述

再次查看集群列表,成功切换,并且vip漂移到了新主节点

在这里插入图片描述

在这里插入图片描述

查看切换日志

pg_cluster1_node1节点

2026-02-28 16:31:43,407 INFO: received switchover request with leader=pg_cluster1_node1 candidate=pg_cluster1_node2 scheduled_at=None
2026-02-28 16:31:43,442 INFO: Got response from pg_cluster1_node2 http://10.0.0.102:8008/patroni: {"state": "running", "postmaster_start_time": "2026-02-28 15:36:36.085886+08:00", "role": "replica", "server_version": 150005, "xlog": {"received_location": 83886408, "replayed_location": 83886408, "replayed_timestamp": "2026-02-28 15:36:53.229199+08:00", "paused": false}, "sync_standby": true, "timeline": 1, "replication_state": "streaming", "dcs_last_seen": 1772267496, "database_system_identifier": "7611814854766790160", "pending_restart": true, "pending_restart_reason": {"max_connections": {"old_value": "1000", "new_value": "500"}}, "patroni": {"version": "4.0.5", "scope": "pg_cluster1", "name": "pg_cluster1_node2"}}
2026-02-28 16:31:43,629 INFO: Got response from pg_cluster1_node2 http://10.0.0.102:8008/patroni: {"state": "running", "postmaster_start_time": "2026-02-28 15:36:36.085886+08:00", "role": "replica", "server_version": 150005, "xlog": {"received_location": 83886408, "replayed_location": 83886408, "replayed_timestamp": "2026-02-28 15:36:53.229199+08:00", "paused": false}, "sync_standby": true, "timeline": 1, "replication_state": "streaming", "dcs_last_seen": 1772267496, "database_system_identifier": "7611814854766790160", "pending_restart": true, "pending_restart_reason": {"max_connections": {"old_value": "1000", "new_value": "500"}}, "patroni": {"version": "4.0.5", "scope": "pg_cluster1", "name": "pg_cluster1_node2"}}
2026-02-28 16:31:43,577 INFO: Lock owner: pg_cluster1_node1; I am pg_cluster1_node1
2026-02-28 16:31:43,772 INFO: switchover: demoting myself
2026-02-28 16:31:43,772 INFO: Demoting self (graceful)
2026-02-28 16:31:44 +0800 Callback triggered: OPERATION=on_stop, ROLE=primary, SCOPE=pg_cluster1
2026-02-28 16:31:44 +0800 Service stopping, removing VIP
2026-02-28 16:31:44 +0800 VIP 10.0.0.201 removed successfully
2026-02-28 16:31:44 +0800 Callback completed
2026-02-28 16:31:44,941 INFO: Leader key released
2026-02-28 16:31:44,943 INFO: Lock owner: None; I am pg_cluster1_node1
2026-02-28 16:31:44,943 INFO: not healthy enough for leader race
2026-02-28 16:31:44,943 INFO: switchover: demote in progress
2026-02-28 16:31:44,947 INFO: Lock owner: pg_cluster1_node2; I am pg_cluster1_node1
2026-02-28 16:31:44,947 INFO: switchover: demote in progress
2026-02-28 16:31:46,211 INFO: Lock owner: pg_cluster1_node2; I am pg_cluster1_node1
2026-02-28 16:31:46,211 INFO: switchover: demote in progress
2026-02-28 16:31:46,947 INFO: Local timeline=1 lsn=0/50001F8
2026-02-28 16:31:46,955 INFO: primary_timeline=2
2026-02-28 16:31:46,959 INFO: primary: history=1        0/5000270       no recovery target specified
2026-02-28 16:31:46,960 INFO: closed patroni connections to postgres
2026-02-28 16:31:46,963 INFO: max_connections value in pg_controldata: 1000, in the global configuration: 500. pg_controldata value will be used. Setting 'Pending restart' flag
2026-02-28 16:31:47,304 INFO: postmaster pid=10608
2026-02-28 16:31:47 +0800 Callback triggered: OPERATION=on_role_change, ROLE=replica, SCOPE=pg_cluster1
2026-02-28 16:31:47 +0800 Role is replica, removing VIP
2026-02-28 16:31:47 +0800 VIP 10.0.0.201 not present, no action needed
2026-02-28 16:31:47 +0800 Callback completed
2026-02-28 16:31:56,208 INFO: Lock owner: pg_cluster1_node2; I am pg_cluster1_node1
2026-02-28 16:31:56,209 INFO: establishing a new patroni heartbeat connection to postgres
2026-02-28 16:31:56,307 INFO: no action. I am (pg_cluster1_node1), a secondary, and following a leader (pg_cluster1_node2)
2026-02-28 16:32:06,256 INFO: no action. I am (pg_cluster1_node1), a secondary, and following a leader (pg_cluster1_node2)

删除集群

删除集群前,停止所有patroni节点

patronictl -c /data/patroni/pg_cluster1.yaml  remove pg_cluster1
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐