暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

PostgreSQL Patroni + Consul 高可用

原创 黄山谷 2025-10-27
350

之前写过 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  # 自动监控
最后修改时间:2025-10-28 14:02:57
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论