之前写过 Patroni + etcd 的, 文章链接:https://www.modb.pro/db/1927921527933120512
这次尝试了下 Patroni + Consul 离线安装带给大家
核心特性对比
| 特性 | etcd | Consul |
|---|---|---|
| 开发背景 | CoreOS(Kubernetes原生) | HashiCorp(云原生) |
| 数据模型 | 键值存储 + 租约 | 键值存储 + 服务发现 |
| 一致性算法 | Raft(强一致性) | Raft(强一致性) |
| 服务发现 | 基础功能 | 核心功能(强大) |
| 健康检查 | 基础健康检查 | 丰富健康检查机制 |
| 多数据中心 | 有限支持 | 原生支持(强大) |
| ACL安全 | RBAC + 证书 | ACL + 令牌 |
| 性能特点 | 高吞吐、低延迟 | 功能丰富、中等性能 |
consul:实现分布式系统的服务发现与配置
consul优势:
1)使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
2)支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
3)支持健康检查. etcd 不提供此功能.
4)支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
5)官方提供web管理界面, etcd 无此功能.
****Patroni :接管 PostgreSQL 数据库的启停,同时监控本地的 PostgreSQL 数据库,并将本地的 PostgreSQL 数据库信息写入DCS,注册到consul中
0、准备环境
| 主机名 | 系统 | 配置 | 部署内容 |
|---|---|---|---|
| node81 | Kylin Linux V10 (SP3) | 4c 8g | Patroni、Consul 、PostgreSQL |
| node82 | Kylin Linux V10 (SP3) | 4c 8g | Patroni、Consul 、PostgreSQL |
| node83 | Kylin Linux V10 (SP3) | 2c 4g | Consul |
======
主机名
hostnamectl set-hostname node81
hostnamectl set-hostname node82
hostnamectl set-hostname node83
vi /etc/hosts
10.10.3.81 node81
10.10.3.82 node82
10.10.3.83 node83
解压安装包合集
tar -zvf Kylin_x86-patroni-consul.tar

1、postgresql 安装
安装编译所需 rpm 包
yum install -y --nogpgcheck libicu-devel zlib-devel readline readline-devel \
perl-ExtUtils-Embed perl-ExtUtils-MakeMaker pam-devel openssl-devel \
openldap-devel libxml2-devel libxslt-devel systemd-devel tcl-devel \
gcc net-tools python python-devel
dnf install make -y --nogpgcheck
make --version
系统相关参数
cp /etc/sysctl.conf /etc/sysctl.conf.bak
cat >> /etc/sysctl.conf << "EOF"
fs.aio-max-nr = 2097152
fs.file-max = 76724600
fs.nr_open = 20480000
vm.swappiness = 1
vm.min_free_kbytes = 204800
vm.overcommit_memory = 0
vm.overcommit_ratio = 90
vm.dirty_background_bytes = 409600000
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 95
vm.dirty_writeback_centisecs = 100
vm.mmap_min_addr = 65536
vm.zone_reclaim_mode = 2
vm.nr_hugepages = 750
kernel.sem = 4096 2048000 200 32768
kernel.shmmax = 4012843008
kernel.shmall = 979698
kernel.shmmni = 16384
kernel.numa_balancing = 0
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_local_port_range = 40000 65535
net.ipv4.tcp_max_tw_buckets = 62144
net.core.somaxconn = 16384
net.ipv4.tcp_max_syn_backlog = 8198
net.ipv4.tcp_rmem = 8192 65536 1677216
net.ipv4.tcp_wmem = 8192 65536 1677216
net.ipv4.tcp_mem = 8388608 12582912 1677216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 1
EOF
sysctl -p
cat > /etc/security/limits.d/postgresql.conf << "EOF"
postgres soft nproc 655360
postgres hard nproc 655360
postgres hard nofile 655360
postgres soft nofile 655360
postgres soft stack unlimited
postgres hard stack unlimited
postgres soft core unlimited
postgres hard core unlimited
postgres soft memlock 250000000
postgres hard memlock 250000000
EOF
#reboot
关闭防火墙和 SeLinux
cp /etc/selinux/config /etc/selinux/config_`date +"%Y%m%d_%H%M%S"`&& sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
创建用户密码
groupadd -g 60000 postgres
useradd -u 60000 -g postgres postgres
passwd postgres
su - root
mkdir -p /data/pgdata
mkdir -p /data/archive
chown -R postgres:postgres /data/
su - postgres
tar -xvf /soft/postgresql-14.19.tar.gz -C /home/postgres
mkdir -p /home/postgres/app/postgresql
mkdir -p /home/postgres/log
配置
#block size. Allowed values are 1,2,4,8,16,32
cd postgresql-14.19/
./configure --prefix=/home/postgres/app/postgresql \
--with-icu \
--with-perl \
--with-tcl \
--with-tclconfig=/usr/lib64 \
--with-openssl \
--with-includes=/usr/include/openssl \
--with-readline \
--with-pam \
--with-gssapi \
--with-libraries=/usr/lib64 \
--enable-nls \
--with-libxml \
--with-libxslt \
--with-ldap \
--with-selinux \
--with-systemd \
--with-system-tzdata=/usr/share/zoneinfo \
--with-blocksize=32 \
--with-wal-blocksize=32
编译安装
gmake world -j8 && gmake install-world -j8
其它扩展模板安装:
cd /home/postgres/postgresql-14.19/contrib/
gmake -j 16 && gmake install
环境变量
vim /home/postgres/.bash_profile
# for PostgreSQL
export PGPORT=1622
export PGDATA=/data/pgdata
export PGHOME=/home/postgres/app/postgresql
#export PGHOST=pgcluster01 #修改
export LANG='en_US.UTF-8'
#export PS1="\[\e[1;32m\][\[\e[0m\]\[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\$"
export LANG=en_US.UTF-8
#export PS1="[\u@\h \W]\$ "
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export DATE=`date +"%Y%m%d%H%M"`
export MANPATH=$PGHOME/share/man:$MANPATH
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
source /home/postgres/.bash_profile
[pgsql@pg15 ~]$ env |grep PG
PGPORT=1622
PGUSER=postgres
PGDATABASE=postgres
PGHOME=/home/postgres/app/postgresql
PGHOST=/data/pgdata
PGDATA=/data/pgdata
初始化(主库)
/home/postgres/app/postgresql/bin/initdb -D $PGDATA -E UTF8 --locale=C --lc-collate=C --lc-ctype=en_US.UTF-8 -U postgres
32C 64G
cat > /data/pgdata/postgresql.conf << "EOF"
#========================================#
# PostgreSQL Configuration information #
# for 4C 8G #
#=========================================
#base
listen_addresses = '*'
port=54321
max_connections=100 #1C 50connections
shared_buffers=2GB #1/4 Mem
work_mem =100MB #指定在写到临时磁盘文件之前用于内部排序操作和哈希表的内存量
superuser_reserved_connections = 10 #后门用户
maintenance_work_mem=4GB #它决定数据库的维护操作使用的内存空间的大小
effective_cache_size=6GB #3/4 Mem
max_locks_per_transaction=1024
max_wal_size=2GB
min_wal_size=1GB #在自动 WAL 检查点之间允许 WAL增长到的最小尺寸,max_wal_size/4
checkpoint_timeout=20min #自动 WAL 检查点之间的最长时间
checkpoint_completion_target=0.9 #增加checkpoint_completion_target来降低检查点的1/0负载,默认0.5
max_worker_processes=4 #CPU SL
max_parallel_workers_per_gather=2
#max_parallel_workers=64 #CPU SL
autovacuum = on
autovacuum_max_workers = 1 #指定能同时运行的 autovacuum 进程的最大数量,适当调大,避免vacuum不及时导致表膨胀。CPU/3
unix_socket_directories='/home/postgres/pgdata'
#-----------------------------------------
#密码验证插件
shared_preload_libraries='passwordcheck'
#-----------------------------------------
#日志、审计
logging_collector = on
log_destination = 'csvlog'
log_directory = '/home/postgres/pgdata/pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.csv'
log_truncate_on_rotation = on
log_connections = on
log_disconnections = on
log_statement = ddl # 记录执行的SQL: none,ddl(create,alter,drop),mod,all
log_min_duration_statement =60s
log_checkpoints = on
log_lock_waits= on
deadlock_timeout = 1s #死锁超时时间1s
log_rotation_age=1d
log_rotation_size=1000MB
lc_messages='C'
log_min_duration_statement=-1
log_autovacuum_min_duration='100ms'
#-----------------------------------------
#archive
wal_level='replica'
archive_mode='on'
archive_command='test ! -f /home/postgres/archive/%f && cp %p /home/postgres/archive/%f'
restore_command='cp /home/postgres/archive/%f %p'
max_wal_senders=10
wal_keep_size=128MB
wal_sender_timeout=60s
#-----------------------------------------
EOF
cp /data/pgdata/pg_hba.conf /data/pgdata/pg_hba.confbak
cat >> /data/pgdata/pg_hba.conf << EOF
# Other connections 参数文件读取顺序 由下往上
host all all 0.0.0.0/0 trust #修改好密码注释掉
host all all 0.0.0.0/0 scram-sha-256
host replication repuser 0.0.0.0/0 scram-sha-256
EOF
启动主库,这里只需要启动主库即可
pg_ctl start
ALTER USER postgres WITH PASSWORD 'xxxxx'; # 尽量密码不要用特殊字符
create role repuser login encrypted password 'xxxxx' replication;
防火墙策略。如果需要
firewall-cmd --zone=public --add-port=1622/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports | grep 1622
# 或查看所有开放端口
firewall-cmd --list-all
------------------------------------------------------------
iptables -A INPUT -p tcp --dport 1622 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
iptables -L -n | grep 1622
配置好主库,修改 pg_hba
# TYPE DATABASE USER ADDRESS METHOD
local all all scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
host all all ::1/128 scram-sha-256
local replication all scram-sha-256
host replication all 0.0.0.0/0 scram-sha-256
host replication all ::1/128 scram-sha-256
2、Consul
一、 consul集群安装
1、下载地址:https://releases.hashicorp.com/consul/
2、上传安装包至服务器并解压
unzip consul_1.19.2_linux_amd64.zip
mv consul /usr/local/bin/
consul -version

3、创建目录
mkdir -p /home/postgres/app/consul/config/
mkdir -p /home/postgres/app/consul/data/
mkdir -p /home/postgres/app/consul/logs
4、 配置文件
vim /home/postgres/app/consul/config/consul.hcl
# 将JSON转换为HCL格式(Consul推荐)
sudo cat > /home/postgres/app/consul/config/consul.hcl << 'EOF'
datacenter = "dc1"
data_dir = "/home/postgres/app/consul/data"
log_level = "INFO"
node_name = "consul01"
server = true
bootstrap_expect = 3
bind_addr = "10.10.3.81"
client_addr = "0.0.0.0"
ui = true
enable_script_checks = false
enable_local_script_checks = true
retry_join = ["10.10.3.81", "10.10.3.82", "10.10.3.83"]
retry_interval = "30s"
reconnect_timeout = "72h"
ports {
http = 8500
https = 8501
serf_lan = 8301
serf_wan = 8302
server = 8300
}
EOF
sudo cat > /home/postgres/app/consul/config/consul.hcl << 'EOF'
datacenter = "dc1"
data_dir = "/home/postgres/app/consul/data"
log_level = "INFO"
node_name = "consul02"
server = true
bootstrap_expect = 3
bind_addr = "10.10.3.82"
client_addr = "0.0.0.0"
ui = true
enable_script_checks = false
enable_local_script_checks = true
retry_join = ["10.10.3.81", "10.10.3.82", "10.10.3.83"]
retry_interval = "30s"
reconnect_timeout = "72h"
ports {
http = 8500
https = 8501
serf_lan = 8301
serf_wan = 8302
server = 8300
}
EOF
sudo cat > /home/postgres/app/consul/config/consul.hcl << 'EOF'
datacenter = "dc1"
data_dir = "/home/postgres/app/consul/data"
log_level = "INFO"
node_name = "consul03"
server = true
bootstrap_expect = 3
bind_addr = "10.10.3.83"
client_addr = "0.0.0.0"
ui = true
enable_script_checks = false
enable_local_script_checks = true
retry_join = ["10.10.3.81", "10.10.3.82", "10.10.3.83"]
retry_interval = "30s"
reconnect_timeout = "72h"
ports {
http = 8500
https = 8501
serf_lan = 8301
serf_wan = 8302
server = 8300
}
EOF
5、 编辑系统启动文件
# 修改服务文件,移除ProtectHome限制
sudo cat > /etc/systemd/system/consul.service << 'EOF'
[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network.target
Wants=network.target
[Service]
Type=simple
#User=postgres
#Group=postgres
ExecStart=/usr/local/bin/consul agent -config-dir=/home/postgres/app/consul/config/
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
Environment=GOMAXPROCS=2
WorkingDirectory=/home/postgres/app/consul/
# 移除或修改安全限制
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
# ProtectHome=read-only # 注释掉或移除这一行
[Install]
WantedBy=multi-user.target
EOF
# 重载并重启
sudo systemctl daemon-reload
sudo systemctl restart consul
sudo systemctl status consul
查看日志
journalctl -u consul -n 50 --no-pager
# 1. 集群成员
consul members
# 2. 领导者状态
curl -s http://localhost:8500/v1/status/leader
# 3. 所有节点健康状态
curl -s http://localhost:8500/v1/health/state/any | jq
# 4. Web UI访问(浏览器打开)
echo "Web UI: http://10.10.3.81:8500/"
consul members

http://10.10.3.81:8500/

如果需要配置防火墙
# 开放Consul所需端口
sudo firewall-cmd --permanent --add-port={8300,8301,8302,8500,8501}/tcp
sudo firewall-cmd --permanent --add-port={8301,8302}/udp
sudo firewall-cmd --reload
# 验证端口开放
sudo firewall-cmd --list-all
3、Patroni
[root@node81 soft]# python3 -V
Python 3.7.9
安装 setuptool
cd /soft
tar -zxvf setuptools-67.7.2.tar.gz
cd /soft/setuptools-67.7.2 && python3 setup.py build && python3 setup.py install
安装 pip
cd /soft
tar -zxvf pip-23.1.2.tar.gz
cd /soft/pip-23.1.2 && python3 setup.py build && python3 setup.py install
pip3 -V

按顺序安装
cd /soft
pip3 install psutil-5.9.8.tar.gz
pip3 install ydiff-1.4.2.tar.gz
pip3 install certifi-2023.11.17.tar.gz
安装 .whl 依赖包
pip3 install /soft/*.whl --ignore-installed

继续按循序安装
pip3 install python-consul-1.1.0.tar.gz
pip3 install psycopg2-binary-2.8.6.tar.gz
pip3 install psycopg2-2.8.6.tar.gz
pip3 install patroni-3.3.5.tar.gz
#查询patroni版本号,验证是否安装成功
patronictl version
which patroni
patroni --help

配置文件
二台
su - postgres
mkdir -p /home/postgres/app/patroni
mkdir -p /home/postgres/patroni_log
patroni 配置文件
cat > /home/postgres/app/patroni/patroni_config.yml << EOF
scope: cndb
namespace: /service/
name: node81 # 使用主机名
log:
level: INFO
traceback_level: ERROR
dir: /home/postgres/patroni_log
file_num: 10
file_size: 104857600
restapi:
listen: 10.10.3.81:8010
connect_address: 10.10.3.81:8010
consul:
hosts: 10.10.3.81:8500,10.10.3.82:8500,10.10.3.83:8500
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
max_timelines_history: 0
master_start_timeout: 300
master_stop_timeout: 0
synchronous_mode: false
leader_key: /service/cndb/leader
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
max_connections: 2000
superuser_reserved_connections: 100
max_locks_per_transaction: 64
max_worker_processes: 2
max_prepared_transactions: 0
wal_level: replica
wal_log_hints: on
track_commit_timestamp: off
max_wal_senders: 32
max_replication_slots: 10
wal_keep_size: 4096MB
hot_standby: on
hot_standby_feedback: on
listen_addresses: "*"
port: 1622
cluster_name: "cndb"
archive_mode: "always"
archive_command: "cp %p /data/archive/%f"
archive_timeout: 1800s
postgresql:
synchronous_commit: 'on'
synchronous_standby_names: '*' # 所有备节点参与同步
listen: 0.0.0.0:1622
connect_address: 10.10.3.81:1622
bin_dir: /home/postgres/app/postgresql/bin
data_dir: /data/pgdata
config_dir: /data/pgdata
pgpass: /home/postgres/.pgpass
pg_ctl_timeout: 60
use_pg_rewind: true
remove_data_directory_on_rewind_failure: false
remove_data_directory_on_diverged_timelines: true
authentication:
replication:
username: repuser
password:
superuser:
username: postgres
password:
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
EOF
cat > /home/postgres/app/patroni/patroni_config.yml << EOF
scope: cndb
namespace: /service/
name: node82 # 使用主机名
log:
level: INFO
traceback_level: ERROR
dir: /home/postgres/patroni_log
file_num: 10
file_size: 104857600
restapi:
listen: 10.10.3.82:8010
connect_address: 10.10.3.82:8010
consul:
hosts: 10.10.3.81:8500,10.10.3.82:8500,10.10.3.83:8500
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
max_timelines_history: 0
master_start_timeout: 300
master_stop_timeout: 0
synchronous_mode: false
leader_key: /service/cndb/leader
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
max_connections: 2000
superuser_reserved_connections: 100
max_locks_per_transaction: 64
max_worker_processes: 2
max_prepared_transactions: 0
wal_level: replica
wal_log_hints: on
track_commit_timestamp: off
max_wal_senders: 32
max_replication_slots: 10
wal_keep_size: 4096MB
hot_standby: "on"
hot_standby_feedback: "on"
listen_addresses: "*"
port: 1622
cluster_name: "cndb"
archive_mode: "always"
archive_command: "cp %p /data/archive/%f"
archive_timeout: 1800s
postgresql:
listen: 0.0.0.0:1622
connect_address: 10.10.3.82:1622
bin_dir: /home/postgres/app/postgresql/bin
data_dir: /data/pgdata
config_dir: /data/pgdata
pgpass: /home/postgres/.pgpass
pg_ctl_timeout: 60
use_pg_rewind: true
remove_data_directory_on_rewind_failure: false
remove_data_directory_on_diverged_timelines: true
authentication:
replication:
username: repuser
password:
superuser:
username: postgres
password:
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
EOF
patroni启动服务配置
systemctl 启动
su - root
vi /usr/lib/systemd/system/patroni.service
[Unit]
Description=patroni
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment="PGHOME=/home/postgres/app/postgresql/bin"
Environment="PGDATA=/data/pgdata"
Environment="PGPORT=1622"
Environment="LD_LIBRARY_PATH=/home/postgres/app/postgresql/lib"
Environment="PATH=/home/postgres/app/postgresql/bin:/usr/local/bin"
ExecStart=/bin/bash -c "patroni /home/postgres/app/patroni/patroni_config.yml >> /home/postgres/patroni_log/patroni.log 2>&1 &"
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/killall patroni
KillMode=process
TimeoutSec=30
Restart=on
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl start patroni.service
systemctl enable patroni.service
systemctl status patroni.service

#因为 patroni会检测 PostgreSOL数据库是否正常运行;
如果没有运行,会自动启动PostgreSQL数据库,所以可以考虑禁用PostgreSQL服务,由 **patroni** 托管 PG 的启停
此时我们可以在 Consul 上看到 Patroni 注册的元数据

正常启动 patroni 后,看下集群状态,由于我们之前没有配置 主备,这里显示备库 failed,没关系我们直接用 patroni 把数据库拉起来

这里我们先 配置个环境变量,方便操作
su - postgres
cat >> /home/postgres/.bash_profile << EOF
alias patronictl='patronictl -c /home/postgres/app/patroni/patroni_config.yml'
EOF
source /home/postgres/.bash_profile
patronictl list
reinit 创建备库
patronictl reinit cndb node82

可以看到集群状态正常

此时我们 pg 基于 Patroni + Consul 的高可用集群就搭建好了
switchover 测试
patronictl switchover

Conusl 存储的leader 也已经变成了node82

Consul常用操作:
所有节点健康状态
\[root@node82 sbin\]# curl -s http://localhost:8500/v1/health/state/any | jq
\[
{
"Node": "consul1",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": \[\],
"Type": "",
"Interval": "",
"Timeout": "",
"ExposedPort": 0,
"Definition": {},
"CreateIndex": 13,
"ModifyIndex": 13
},
{
"Node": "consul2",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": \[\],
"Type": "",
"Interval": "",
"Timeout": "",
"ExposedPort": 0,
"Definition": {},
"CreateIndex": 14,
"ModifyIndex": 14
},
{
"Node": "consul3",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": \[\],
"Type": "",
"Interval": "",
"Timeout": "",
"ExposedPort": 0,
"Definition": {},
"CreateIndex": 15,
"ModifyIndex": 15
}
\]
# 查看键值(只读)
curl -s http://localhost:8500/v1/kv/service/cndb/leader?raw

# 查看会话信息
curl -s http://localhost:8500/v1/session/list | jq .

# 查看节点信息
curl -s http://localhost:8500/v1/kv/service/cndb/members?recurse | jq .

Patroni 优化建议
bootstrap:
dcs:
# 添加同步复制配置
synchronous_mode: true
synchronous_node_count: 1
synchronous_mode_strict: false # 允许降级为异步
postgresql:
parameters:
# 添加同步复制参数
synchronous_commit: 'on'
synchronous_standby_names: '*' # 所有备节点参与同步
优化性能参数
postgresql:
parameters:
# 内存优化
shared_buffers: 2GB # 根据内存调整
work_mem: 4MB # 工作内存
maintenance_work_mem: 512MB # 维护操作内存
# 连接优化
max_connections: 2000
superuser_reserved_connections: 100
# 性能优化
effective_cache_size: 4GB # 缓存大小
random_page_cost: 1.1 # SSD优化
checkpoint_completion_target: 0.9
添加监控和健康检查
restapi:
listen: 10.10.3.81:8010
connect_address: 10.10.3.81:8010
# 添加健康检查
auth: 'username:password' # 建议设置API认证
# 添加监控配置
watchdog:
mode: automatic # 自动监控




