patroni+etcd部署 使用callbacks回调函数实现failover时的vip漂移
如果是重启类参数,此时查看集群列表会有显示需要重启生效,需要按先从后主的顺序重启。登录数据库,查看初始化用户已成功创建,但当前的pg_hba规则是全部免密。再次查看集群列表,成功切换,并且vip漂移到了新主节点。pg_cluster1_node1节点。删除集群前,停止所有patroni节点。在所有etcd节点执行。在所有etcd节点执行。在所有etcd节点执行。在所有etcd节点执行。在所有的数据
·
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
更多推荐



所有评论(0)