postgresql之patroni高可用

实验环境:

3台VM:Rocky Linux 9--关闭防火墙,SELinux

postgresql 18

etcd Version: 3.6.6

patroni 4.1.0
##安装etcd,patroni,postgresql 18

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

yum install -y postgresql18-server

/usr/pgsql-18/bin/postgresql-18-setup initdb

##安装etcd需要先启用pgdg-rhel9-extras

yum config-manager --enable pgdg-rhel9-extras

yum install etcd

yum install patroni patroni-etcd
##节点1的etcd配置文件

root@linux050 etcd# cat etcd.conf

member

ETCD_NAME=etcd050

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

#ETCD_WAL_DIR=""

#ETCD_SNAPSHOT_COUNT="10000"

#ETCD_HEARTBEAT_INTERVAL="100"

#ETCD_ELECTION_TIMEOUT="1000"

ETCD_LISTEN_PEER_URLS="http://192.168.56.50:2380"

ETCD_LISTEN_CLIENT_URLS="http://192.168.56.50:2379,http://127.0.0.1:2379"

#ETCD_MAX_SNAPSHOTS="5"

#ETCD_MAX_WALS="5"

#ETCD_CORS=""

#cluster

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.56.50:2380"

if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."

ETCD_INITIAL_CLUSTER="etcd050=http://192.168.56.50:2380,etcd060=http://192.168.56.60:2380,etcd070=http://192.168.56.70:2380"

ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.50:2379"

#ETCD_DISCOVERY=""

#ETCD_DISCOVERY_SRV=""

#ETCD_DISCOVERY_FALLBACK="proxy"

#ETCD_DISCOVERY_PROXY=""

#ETCD_ENABLE_V2="true"

#ETCD_STRICT_RECONFIG_CHECK="false"

#ETCD_AUTO_COMPACTION_RETENTION="0"

#proxy

#ETCD_PROXY="off"

#ETCD_PROXY_FAILURE_WAIT="5000"

#ETCD_PROXY_REFRESH_INTERVAL="30000"

#ETCD_PROXY_DIAL_TIMEOUT="1000"

#ETCD_PROXY_WRITE_TIMEOUT="5000"

#ETCD_PROXY_READ_TIMEOUT="0"

#security

#ETCD_CERT_FILE=""

#ETCD_KEY_FILE=""

#ETCD_CLIENT_CERT_AUTH="false"

#ETCD_TRUSTED_CA_FILE=""

#ETCD_AUTO_TLS="false"

#ETCD_PEER_CERT_FILE=""

#ETCD_PEER_KEY_FILE=""

#ETCD_PEER_CLIENT_CERT_AUTH="false"

#ETCD_PEER_TRUSTED_CA_FILE=""

#ETCD_PEER_AUTO_TLS="false"

#logging

#ETCD_DEBUG="false"

examples for -log-package-levels etcdserver=WARNING,security=DEBUG

#ETCD_LOG_PACKAGE_LEVELS=""

root@linux050 etcd#
##节点2的etcd配置文件

root@linux060 \~# cat /etc/etcd/etcd.conf

member

ETCD_NAME=etcd060

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

#ETCD_WAL_DIR=""

#ETCD_SNAPSHOT_COUNT="10000"

#ETCD_HEARTBEAT_INTERVAL="100"

#ETCD_ELECTION_TIMEOUT="1000"

ETCD_LISTEN_PEER_URLS="http://192.168.56.60:2380"

ETCD_LISTEN_CLIENT_URLS="http://192.168.56.60:2379,http://127.0.0.1:2379"

#ETCD_MAX_SNAPSHOTS="5"

#ETCD_MAX_WALS="5"

#ETCD_CORS=""

#cluster

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.56.60:2380"

if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."

ETCD_INITIAL_CLUSTER="etcd050=http://192.168.56.50:2380,etcd060=http://192.168.56.60:2380,etcd070=http://192.168.56.70:2380"

ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.60:2379"

#ETCD_DISCOVERY=""

#ETCD_DISCOVERY_SRV=""

#ETCD_DISCOVERY_FALLBACK="proxy"

#ETCD_DISCOVERY_PROXY=""

#ETCD_ENABLE_V2="true"

#ETCD_STRICT_RECONFIG_CHECK="false"

#ETCD_AUTO_COMPACTION_RETENTION="0"

#proxy

#ETCD_PROXY="off"

#ETCD_PROXY_FAILURE_WAIT="5000"

#ETCD_PROXY_REFRESH_INTERVAL="30000"

#ETCD_PROXY_DIAL_TIMEOUT="1000"

#ETCD_PROXY_WRITE_TIMEOUT="5000"

#ETCD_PROXY_READ_TIMEOUT="0"

#security

#ETCD_CERT_FILE=""

#ETCD_KEY_FILE=""

#ETCD_CLIENT_CERT_AUTH="false"

#ETCD_TRUSTED_CA_FILE=""

#ETCD_AUTO_TLS="false"

#ETCD_PEER_CERT_FILE=""

#ETCD_PEER_KEY_FILE=""

#ETCD_PEER_CLIENT_CERT_AUTH="false"

#ETCD_PEER_TRUSTED_CA_FILE=""

#ETCD_PEER_AUTO_TLS="false"

#logging

#ETCD_DEBUG="false"

examples for -log-package-levels etcdserver=WARNING,security=DEBUG

#ETCD_LOG_PACKAGE_LEVELS=""

root@linux060 \~#
##节点3的etcd配置文件

root@linux070 \~# cat /etc/etcd/etcd.conf

member

ETCD_NAME=etcd070

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

#ETCD_WAL_DIR=""

#ETCD_SNAPSHOT_COUNT="10000"

#ETCD_HEARTBEAT_INTERVAL="100"

#ETCD_ELECTION_TIMEOUT="1000"

ETCD_LISTEN_PEER_URLS="http://192.168.56.70:2380"

ETCD_LISTEN_CLIENT_URLS="http://192.168.56.70:2379,http://127.0.0.1:2379"

#ETCD_MAX_SNAPSHOTS="5"

#ETCD_MAX_WALS="5"

#ETCD_CORS=""

#cluster

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.56.70:2380"

if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."

ETCD_INITIAL_CLUSTER="etcd050=http://192.168.56.50:2380,etcd060=http://192.168.56.60:2380,etcd070=http://192.168.56.70:2380"

ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.70:2379"

#ETCD_DISCOVERY=""

#ETCD_DISCOVERY_SRV=""

#ETCD_DISCOVERY_FALLBACK="proxy"

#ETCD_DISCOVERY_PROXY=""

#ETCD_ENABLE_V2="true"

#ETCD_STRICT_RECONFIG_CHECK="false"

#ETCD_AUTO_COMPACTION_RETENTION="0"

#proxy

#ETCD_PROXY="off"

#ETCD_PROXY_FAILURE_WAIT="5000"

#ETCD_PROXY_REFRESH_INTERVAL="30000"

#ETCD_PROXY_DIAL_TIMEOUT="1000"

#ETCD_PROXY_WRITE_TIMEOUT="5000"

#ETCD_PROXY_READ_TIMEOUT="0"

#security

#ETCD_CERT_FILE=""

#ETCD_KEY_FILE=""

#ETCD_CLIENT_CERT_AUTH="false"

#ETCD_TRUSTED_CA_FILE=""

#ETCD_AUTO_TLS="false"

#ETCD_PEER_CERT_FILE=""

#ETCD_PEER_KEY_FILE=""

#ETCD_PEER_CLIENT_CERT_AUTH="false"

#ETCD_PEER_TRUSTED_CA_FILE=""

#ETCD_PEER_AUTO_TLS="false"

#logging

#ETCD_DEBUG="false"

examples for -log-package-levels etcdserver=WARNING,security=DEBUG

#ETCD_LOG_PACKAGE_LEVELS=""

root@linux070 \~#
root@linux050 \~# etcdctl endpoint health --cluster

http://192.168.56.70:2379 is healthy: successfully committed proposal: took = 11.169064ms

http://192.168.56.50:2379 is healthy: successfully committed proposal: took = 9.853069ms

http://192.168.56.60:2379 is healthy: successfully committed proposal: took = 23.430727ms

root@linux050 \~#

在节点1初始化DB,插入几条数据,模拟standalone转成cluster

root@linux050 \~# /usr/pgsql-18/bin/postgresql-18-setup initdb

Initializing database ... OK

root@linux050 \~#

create user ccc password 'ccc' createdb;

CREATE USER patroni WITH SUPERUSER ENCRYPTED PASSWORD 'patroni';

CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replicator';

mkdir -p /data/pg/ccc_tbs01

chown -R postgres:postgres /data/pg

postgres=# create tablespace ccc_tbs01 owner ccc location '/data/pg/ccc_tbs01';

CREATE TABLESPACE

postgres=#

postgres=# create database ccc owner=ccc tablespace=ccc_tbs01;

CREATE DATABASE

postgres=#

postgres=# \c ccc

You are now connected to database "ccc" as user "postgres".

ccc=# set role ccc;

SET

ccc=> select current_role;

current_role


ccc

(1 row)

ccc=> create schema ccc;

CREATE SCHEMA

ccc=> create table t1(id int,name varchar(20));

CREATE TABLE

ccc=> \dt

List of tables

Schema | Name | Type | Owner

--------+------+-------+-------

ccc | t1 | table | ccc

(1 row)

ccc=> insert into t1 values(1,'aaa');

INSERT 0 1

ccc=> insert into t1 values(2,'bbb');

INSERT 0 1

ccc=> insert into t1 values(3,'ccc');

INSERT 0 1

ccc=> select * from t1;

id | name

----+------

1 | aaa

2 | bbb

3 | ccc

(3 rows)

ccc=>

开始配置patroni

##节点1的配置文件

root@linux050 patroni# cat patroni.yml

scope: 'pgcluster'

name: pg050

log:

format: '%(asctime)s %(levelname)s: %(message)s'

level: INFO

max_queue_size: 1000

traceback_level: ERROR

type: plain

restapi:

connect_address: 192.168.56.50:8008

listen: 192.168.56.50:8008

etcd3:

hosts:

  • 192.168.56.50:2379

  • 192.168.56.60:2379

  • 192.168.56.70:2379

The bootstrap configuration. Works only when the cluster is not yet initialized.

If the cluster is already initialized, all changes in the `bootstrap` section are ignored!

bootstrap:

This section will be written into <dcs>:/<namespace>/<scope>/config after initializing

new cluster and all other cluster members will use it as a `global configuration`.

WARNING! If you want to change any of the parameters that were set up

via `bootstrap.dcs` section, please use `patronictl edit-config`!

dcs:

loop_wait: 10

retry_timeout: 10

ttl: 30

postgresql:

parameters:

DateStyle: ISO, MDY

TimeZone: Asia/Shanghai

archive_mode: 'on'

autovacuum_worker_slots: '16'

cluster_name: ''

default_text_search_config: pg_catalog.english

dynamic_shared_memory_type: posix

hot_standby: 'on'

lc_messages: en_US.UTF-8

lc_monetary: en_US.UTF-8

lc_numeric: en_US.UTF-8

lc_time: en_US.UTF-8

log_destination: stderr

log_directory: log

log_filename: postgresql-%a.log

log_line_prefix: '%m %p '

log_rotation_age: 1d

log_rotation_size: '0'

log_timezone: Asia/Shanghai

log_truncate_on_rotation: 'on'

logging_collector: 'on'

max_connections: '100'

max_locks_per_transaction: '64'

max_prepared_transactions: '0'

max_replication_slots: '10'

max_wal_senders: '10'

max_wal_size: 1GB

max_worker_processes: '8'

min_wal_size: 80MB

shared_buffers: 128MB

summarize_wal: 'on'

track_commit_timestamp: 'off'

wal_keep_size: '0'

wal_level: replica

wal_log_hints: 'off'

use_slots: true

postgresql:

authentication:

replication:

password: 'replicator'

username: 'replicator'

superuser:

password: 'patroni'

username: 'patroni'

bin_dir: /usr/pgsql-18/bin

connect_address: 192.168.56.50:5432

data_dir: /var/lib/pgsql/18/data

listen: 192.168.56.50:5432

parameters:

archive_command: gzip < %p > /data/pg/archivedir/%f.gz

config_file: /var/lib/pgsql/18/data/postgresql.conf

hba_file: /var/lib/pgsql/18/data/pg_hba.conf

ident_file: /var/lib/pgsql/18/data/pg_ident.conf

restore_command: gunzip < /data/pg/archivedir/%f.gz > %p

pg_hba:

  • local all all peer

  • host all all 127.0.0.1/32 scram-sha-256

  • host all all 192.168.56.0/24 scram-sha-256

  • host all all ::1/128 scram-sha-256

  • local replication all peer

  • host replication all 127.0.0.1/32 scram-sha-256

  • host replication all ::1/128 scram-sha-256

tags:

clonefrom: true

failover_priority: 1

noloadbalance: false

nostream: false

nosync: false

sync_priority: 1

root@linux050 patroni#
##节点2的配置文件

root@linux060 \~# cat /etc/patroni/patroni.yml

scope: 'pgcluster'

name: pg060

log:

format: '%(asctime)s %(levelname)s: %(message)s'

level: INFO

max_queue_size: 1000

traceback_level: ERROR

type: plain

restapi:

connect_address: 192.168.56.60:8008

listen: 192.168.56.60:8008

etcd3:

hosts:

  • 192.168.56.50:2379

  • 192.168.56.60:2379

  • 192.168.56.70:2379

The bootstrap configuration. Works only when the cluster is not yet initialized.

If the cluster is already initialized, all changes in the `bootstrap` section are ignored!

bootstrap:

This section will be written into <dcs>:/<namespace>/<scope>/config after initializing

new cluster and all other cluster members will use it as a `global configuration`.

WARNING! If you want to change any of the parameters that were set up

via `bootstrap.dcs` section, please use `patronictl edit-config`!

dcs:

loop_wait: 10

retry_timeout: 10

ttl: 30

postgresql:

parameters:

DateStyle: ISO, MDY

TimeZone: Asia/Shanghai

archive_mode: 'on'

autovacuum_worker_slots: '16'

cluster_name: ''

default_text_search_config: pg_catalog.english

dynamic_shared_memory_type: posix

hot_standby: 'on'

lc_messages: en_US.UTF-8

lc_monetary: en_US.UTF-8

lc_numeric: en_US.UTF-8

lc_time: en_US.UTF-8

log_destination: stderr

log_directory: log

log_filename: postgresql-%a.log

log_line_prefix: '%m %p '

log_rotation_age: 1d

log_rotation_size: '0'

log_timezone: Asia/Shanghai

log_truncate_on_rotation: 'on'

logging_collector: 'on'

max_connections: '100'

max_locks_per_transaction: '64'

max_prepared_transactions: '0'

max_replication_slots: '10'

max_wal_senders: '10'

max_wal_size: 1GB

max_worker_processes: '8'

min_wal_size: 80MB

shared_buffers: 128MB

summarize_wal: 'on'

track_commit_timestamp: 'off'

wal_keep_size: '0'

wal_level: replica

wal_log_hints: 'off'

use_slots: true

postgresql:

authentication:

replication:

password: 'replicator'

username: 'replicator'

superuser:

password: 'patroni'

username: 'patroni'

bin_dir: /usr/pgsql-18/bin

connect_address: 192.168.56.60:5432

data_dir: /var/lib/pgsql/18/data

listen: 192.168.56.60:5432

parameters:

archive_command: gzip < %p > /data/pg/archivedir/%f.gz

config_file: /var/lib/pgsql/18/data/postgresql.conf

hba_file: /var/lib/pgsql/18/data/pg_hba.conf

ident_file: /var/lib/pgsql/18/data/pg_ident.conf

restore_command: gunzip < /data/pg/archivedir/%f.gz > %p

pg_hba:

  • local all all peer

  • host all all 127.0.0.1/32 scram-sha-256

  • host all all 192.168.56.0/24 scram-sha-256

  • host all all ::1/128 scram-sha-256

  • local replication all peer

  • host replication all 127.0.0.1/32 scram-sha-256

  • host replication all ::1/128 scram-sha-256

tags:

clonefrom: true

failover_priority: 1

noloadbalance: false

nostream: false

nosync: false

sync_priority: 1

root@linux060 \~#
##节点3的配置文件

root@linux070 \~# cat /etc/patroni/patroni.yml

scope: 'pgcluster'

name: pg070

log:

format: '%(asctime)s %(levelname)s: %(message)s'

level: INFO

max_queue_size: 1000

traceback_level: ERROR

type: plain

restapi:

connect_address: 192.168.56.70:8008

listen: 192.168.56.70:8008

etcd3:

hosts:

  • 192.168.56.50:2379

  • 192.168.56.60:2379

  • 192.168.56.70:2379

The bootstrap configuration. Works only when the cluster is not yet initialized.

If the cluster is already initialized, all changes in the `bootstrap` section are ignored!

bootstrap:

This section will be written into <dcs>:/<namespace>/<scope>/config after initializing

new cluster and all other cluster members will use it as a `global configuration`.

WARNING! If you want to change any of the parameters that were set up

via `bootstrap.dcs` section, please use `patronictl edit-config`!

dcs:

loop_wait: 10

retry_timeout: 10

ttl: 30

postgresql:

parameters:

DateStyle: ISO, MDY

TimeZone: Asia/Shanghai

archive_mode: 'on'

autovacuum_worker_slots: '16'

cluster_name: ''

default_text_search_config: pg_catalog.english

dynamic_shared_memory_type: posix

hot_standby: 'on'

lc_messages: en_US.UTF-8

lc_monetary: en_US.UTF-8

lc_numeric: en_US.UTF-8

lc_time: en_US.UTF-8

log_destination: stderr

log_directory: log

log_filename: postgresql-%a.log

log_line_prefix: '%m %p '

log_rotation_age: 1d

log_rotation_size: '0'

log_timezone: Asia/Shanghai

log_truncate_on_rotation: 'on'

logging_collector: 'on'

max_connections: '100'

max_locks_per_transaction: '64'

max_prepared_transactions: '0'

max_replication_slots: '10'

max_wal_senders: '10'

max_wal_size: 1GB

max_worker_processes: '8'

min_wal_size: 80MB

shared_buffers: 128MB

summarize_wal: 'on'

track_commit_timestamp: 'off'

wal_keep_size: '0'

wal_level: replica

wal_log_hints: 'off'

use_slots: true

postgresql:

authentication:

replication:

password: 'replicator'

username: 'replicator'

superuser:

password: 'patroni'

username: 'patroni'

bin_dir: /usr/pgsql-18/bin

connect_address: 192.168.56.70:5432

data_dir: /var/lib/pgsql/18/data

listen: 192.168.56.70:5432

parameters:

archive_command: gzip < %p > /data/pg/archivedir/%f.gz

config_file: /var/lib/pgsql/18/data/postgresql.conf

hba_file: /var/lib/pgsql/18/data/pg_hba.conf

ident_file: /var/lib/pgsql/18/data/pg_ident.conf

restore_command: gunzip < /data/pg/archivedir/%f.gz > %p

pg_hba:

  • local all all peer

  • host all all 127.0.0.1/32 scram-sha-256

  • host all all 192.168.56.0/24 scram-sha-256

  • host all all ::1/128 scram-sha-256

  • local replication all peer

  • host replication all 127.0.0.1/32 scram-sha-256

  • host replication all ::1/128 scram-sha-256

tags:

clonefrom: true

failover_priority: 1

noloadbalance: false

nostream: false

nosync: false

sync_priority: 1

root@linux070 \~#

chown -R postgres:postgres /etc/patroni

依次启动,一个一个来:

root@linux050 \~# systemctl status patroni

● patroni.service - Runners to orchestrate a high-availability PostgreSQL

Loaded: loaded (/usr/lib/systemd/system/patroni.service; disabled; preset: disabled)

Active: active (running) since Wed 2026-01-28 18:32:21 CST; 15s ago

Main PID: 2258 (patroni)

Tasks: 6 (limit: 11055)

Memory: 26.5M

CPU: 692ms

CGroup: /system.slice/patroni.service

└─2258 /usr/bin/python3.12 /usr/bin/patroni /etc/patroni/patroni.yml

Jan 28 18:32:21 linux050 patroni2258: 2026-01-28 18:32:21,853 INFO: establishing a new patroni heartbeat connection to postgres

Jan 28 18:32:21 linux050 patroni2258: 2026-01-28 18:32:21,952 INFO: Changed cluster_name from '' to 'pgcluster' (restart might be required)

Jan 28 18:32:21 linux050 patroni2258: 2026-01-28 18:32:21,953 INFO: Changed listen_addresses from '*' to '192.168.56.50' (restart might be required)

Jan 28 18:32:21 linux050 patroni2258: 2026-01-28 18:32:21,953 INFO: Changed wal_keep_size from '0' to '128MB'

Jan 28 18:32:21 linux050 patroni2258: 2026-01-28 18:32:21,974 INFO: Reloading PostgreSQL configuration.

Jan 28 18:32:22 linux050 patroni2267: server signaled

Jan 28 18:32:23 linux050 patroni2258: 2026-01-28 18:32:23,060 INFO: Systemd integration is not supported

Jan 28 18:32:23 linux050 patroni2258: 2026-01-28 18:32:23,229 INFO: acquired session lock as a leader

Jan 28 18:32:23 linux050 patroni2258: 2026-01-28 18:32:23,490 INFO: no action. I am (pg050), the leader with the lock

Jan 28 18:32:33 linux050 patroni2258: 2026-01-28 18:32:33,377 INFO: no action. I am (pg050), the leader with the lock

root@linux050 \~#
root@linux060 \~# systemctl status patroni

● patroni.service - Runners to orchestrate a high-availability PostgreSQL

Loaded: loaded (/usr/lib/systemd/system/patroni.service; disabled; preset: disabled)

Active: active (running) since Wed 2026-01-28 18:33:56 CST; 30s ago

Main PID: 1409 (patroni)

Tasks: 18 (limit: 11055)

Memory: 145.7M

CPU: 1.969s

CGroup: /system.slice/patroni.service

├─1409 /usr/bin/python3.12 /usr/bin/patroni /etc/patroni/patroni.yml

├─1424 /usr/pgsql-18/bin/postgres -D /var/lib/pgsql/18/data --config-file=/var/lib/pgsql/18/data/postgresql.conf --listen_addresses=192.168.56.60 --port=5>

├─1426 "postgres: pgcluster: logger "

├─1427 "postgres: pgcluster: io worker 2"

├─1428 "postgres: pgcluster: io worker 1"

├─1429 "postgres: pgcluster: io worker 0"

├─1430 "postgres: pgcluster: checkpointer "

├─1431 "postgres: pgcluster: background writer "

├─1432 "postgres: pgcluster: startup recovering 000000010000000000000007"

├─1447 "postgres: pgcluster: walsummarizer "

├─1448 "postgres: pgcluster: walreceiver streaming 0/7000060"

└─1452 "postgres: pgcluster: patroni postgres 192.168.56.60(51380) idle"

Jan 28 18:34:03 linux060 patroni1435: 192.168.56.60:5432 - rejecting connections

Jan 28 18:34:03 linux060 patroni1437: 192.168.56.60:5432 - rejecting connections

Jan 28 18:34:03 linux060 patroni1409: 2026-01-28 18:34:03,557 INFO: Lock owner: pg050; I am pg060

Jan 28 18:34:03 linux060 patroni1409: 2026-01-28 18:34:03,645 INFO: bootstrap from leader 'pg050' in progress

Jan 28 18:34:04 linux060 patroni1449: 192.168.56.60:5432 - accepting connections

Jan 28 18:34:04 linux060 patroni1409: 2026-01-28 18:34:04,115 INFO: Lock owner: pg050; I am pg060

Jan 28 18:34:04 linux060 patroni1409: 2026-01-28 18:34:04,115 INFO: establishing a new patroni heartbeat connection to postgres

Jan 28 18:34:04 linux060 patroni1409: 2026-01-28 18:34:04,291 INFO: no action. I am (pg060), a secondary, and following a leader (pg050)

Jan 28 18:34:13 linux060 patroni1409: 2026-01-28 18:34:13,672 INFO: no action. I am (pg060), a secondary, and following a leader (pg050)

Jan 28 18:34:23 linux060 patroni1409: 2026-01-28 18:34:23,608 INFO: no action. I am (pg060), a secondary, and following a leader (pg050)

root@linux060 \~#
root@linux070 \~# systemctl status patroni

● patroni.service - Runners to orchestrate a high-availability PostgreSQL

Loaded: loaded (/usr/lib/systemd/system/patroni.service; disabled; preset: disabled)

Active: active (running) since Wed 2026-01-28 18:35:24 CST; 23s ago

Main PID: 1403 (patroni)

Tasks: 18 (limit: 11055)

Memory: 145.8M

CPU: 3.171s

CGroup: /system.slice/patroni.service

├─1403 /usr/bin/python3.12 /usr/bin/patroni /etc/patroni/patroni.yml

├─1421 /usr/pgsql-18/bin/postgres -D /var/lib/pgsql/18/data --config-file=/var/lib/pgsql/18/data/postgresql.conf --listen_addresses=192.168.56.70 --port=5>

├─1422 "postgres: pgcluster: logger "

├─1424 "postgres: pgcluster: io worker 2"

├─1425 "postgres: pgcluster: io worker 0"

├─1426 "postgres: pgcluster: io worker 1"

├─1427 "postgres: pgcluster: checkpointer "

├─1428 "postgres: pgcluster: background writer "

├─1429 "postgres: pgcluster: startup recovering 000000010000000000000007"

├─1442 "postgres: pgcluster: walsummarizer "

├─1453 "postgres: pgcluster: patroni postgres 192.168.56.70(55746) idle"

└─1460 "postgres: pgcluster: walreceiver "

Jan 28 18:35:31 linux070 patroni1421: 2026-01-28 18:35:31.147 CST 1421 HINT: Future log output will appear in directory "log".

Jan 28 18:35:31 linux070 patroni1423: 192.168.56.70:5432 - rejecting connections

Jan 28 18:35:31 linux070 patroni1431: 192.168.56.70:5432 - rejecting connections

Jan 28 18:35:32 linux070 patroni1433: 192.168.56.70:5432 - rejecting connections

Jan 28 18:35:33 linux070 patroni1450: 192.168.56.70:5432 - accepting connections

Jan 28 18:35:33 linux070 patroni1403: 2026-01-28 18:35:33,300 INFO: Lock owner: pg050; I am pg070

Jan 28 18:35:33 linux070 patroni1403: 2026-01-28 18:35:33,300 INFO: establishing a new patroni heartbeat connection to postgres

Jan 28 18:35:33 linux070 patroni1403: 2026-01-28 18:35:33,551 INFO: no action. I am (pg070), a secondary, and following a leader (pg050)

Jan 28 18:35:43 linux070 patroni1403: 2026-01-28 18:35:43,910 INFO: no action. I am (pg070), a secondary, and following a leader (pg050)

Jan 28 18:35:44 linux070 patroni1403: 2026-01-28 18:35:44,240 INFO: no action. I am (pg070), a secondary, and following a leader (pg050)

root@linux070 \~#

检查一下状态

复制代码
[root@linux050 ~]# patronictl -c /etc/patroni/patroni.yml list
+ Cluster: pgcluster (7600309643659044233) ----+----+-------------+-----+------------+-----+-----------------+------------------------------------+----------------------+
| Member |      Host     |   Role  |   State   | TL | Receive LSN | Lag | Replay LSN | Lag | Pending restart |       Pending restart reason       |         Tags         |
+--------+---------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------------------+----------------------+
| pg050  | 192.168.56.50 | Leader  | running   |  1 |             |     |            |     | *               | cluster_name: ->pgcluster          | clonefrom: true      |
|        |               |         |           |    |             |     |            |     |                 | listen_addresses: *->192.168.56.50 | failover_priority: 1 |
|        |               |         |           |    |             |     |            |     |                 |                                    | nosync: false        |
|        |               |         |           |    |             |     |            |     |                 |                                    | sync_priority: 1     |
+--------+---------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------------------+----------------------+
| pg060  | 192.168.56.60 | Replica | streaming |  1 |   0/7000060 |   0 |  0/7000060 |   0 |                 |                                    | clonefrom: true      |
|        |               |         |           |    |             |     |            |     |                 |                                    | failover_priority: 1 |
|        |               |         |           |    |             |     |            |     |                 |                                    | nosync: false        |
|        |               |         |           |    |             |     |            |     |                 |                                    | sync_priority: 1     |
+--------+---------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------------------+----------------------+
| pg070  | 192.168.56.70 | Replica | streaming |  1 |   0/7000060 |   0 |  0/7000060 |   0 |                 |                                    | clonefrom: true      |
|        |               |         |           |    |             |     |            |     |                 |                                    | failover_priority: 1 |
|        |               |         |           |    |             |     |            |     |                 |                                    | nosync: false        |
|        |               |         |           |    |             |     |            |     |                 |                                    | sync_priority: 1     |
+--------+---------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------------------+----------------------+
[root@linux050 ~]#

完成。。

相关推荐
GBASE15 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr1 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3503 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3503 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3503 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB4 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql