部署高可用PostgreSQL14集群

news2025/3/31 5:53:58

目录

基础依赖包安装

consul配置

patroni配置

vip-manager配置

pgbouncer配置

haproxy配置

验证


本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群(14版本),大致的架构图如下,这种架构是业界比较认可和广泛实用的(例如Pigsty)优点是:

  • 使用Patroni和Consul来接管pg,完成它的生命周期管理,包括initdb到切换,避免手动的backup操作,Consul会选举Patroni的主当做pg的主;
  • 使用冗余的Pgbouncer来完成pg的连接池化,降低进程开销;
  • 使用Haproxy来进行所有请求负载均衡到连接池,还可以进一步实现读写分离;

但这种架构缺陷是Consul是跟pg节点共同部署的,如果consul单独抽出来可以同时管理多套pg高可用集群。

                         +-------------------+
                         |     客户端         |
                         +-------------------+
                                  ↓ (连接 VIP:5436)
                         +-------------------+
                         |    HAProxy        |  ← 监听VIP:5436负载均衡
                         | (VIP:100.3.254.200)|
                         +-------------------+
                                  ↓ (轮询转发到三节点PgBouncer的6432)
+-------------------+     +-------------------+     +-------------------+
|  节点1            |     |  节点2            |      |  节点3           |
| - PgBouncer (6432)|     | - PgBouncer (6432)|     | - PgBouncer (6432)|
+-------------------+     +-------------------+     +-------------------+
         ↓ (通过 VIP 连接)          ↓ (通过 VIP 连接)          ↓ (通过 VIP 连接)
+-----------------------------------------------------------------------+
|     vip-manager  管理的PostgreSQL 主节点 (VIP:100.3.254.200:5432)     |
+-----------------------------------------------------------------------+
+---------↓----------+     +---------↓-------+       +---------↓-------+
|  节点1            |     |  节点2            |     |  节点3            |
| - Patroni         |     | - Patroni         |     | - Patroni         |
| - Consul          |     | - Consul          |     | - Consul          |
| - PostgreSQL      |     | - PostgreSQL      |     | - PostgreSQL      |
+-------------------+     +-------------------+     +-------------------+

基础依赖包安装

因为复用3节点资源("100.3.254.210","100.3.254.211","100.3.254.212"),dstat用于监控资源情况,每个节点都安装所有的yum包,下面的步骤将分别细说为什么在每个节点都安装这些包;

yum install -y postgresql14
yum install -y consul
yum install -y patroni
yum install -y vip-manager
yum install -y dstat
yum install -y haproxy

关闭防火墙

systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld

 setenforce配置

sudo setenforce 0

hostname配置

[root@node2 ~]# hostnamectl set-hostname node2
# 校验
[root@node2 ~]# hostname
node2
# 在每个节点上配置node(可选)
[root@node2 ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
100.3.254.210 node1
100.3.254.211 node2
100.3.254.212 node3

consul配置

consul是Go 语言开发的用于服务发现与分布式配置管理工具,Patroni 通过 Consul 的 Session + Lock 机制实现分布式选举,使用 Consul 的 KV 存储保存集群元数据(如当前主节点、节点列表、配置参数);

在3个节点上配置启动consul,配置consul.hc1文件中只有bind_addr有差异,如下:

vi /etc/consul.d/consul.hcl 

datacenter = "dc1"
data_dir = "/opt/consul"
server = true
bootstrap_expect = 3
bind_addr = "100.3.254.210"  # 当前节点 IP
client_addr = "0.0.0.0"
retry_join = ["100.3.254.210","100.3.254.211","100.3.254.212"]
ui = true

# 创建数据目录(dcs相当于分布式数据库)
chown -R consul:consul /opt/consul

# 直接启动
systemctl start consul
systemctl enable consul

# 查看consul节点说
[root@node1 ~]# consul members
Node   Address             Status  Type    Build   Protocol  DC   Partition  Segment
node1  100.3.254.210:8301  alive   server  1.12.2  2         dc1  default    <all>
node2  100.3.254.211:8301  alive   server  1.12.2  2         dc1  default    <all>
node3  100.3.254.212:8301  alive   server  1.12.2  2         dc1  default    <all>
[root@node1 ~]# 

 配置文件中ui = true能够打开web页面查看信息,包括后续patroni在consul中注册的k/v信息;

patroni配置

Patroni 是Python 编写的用于管理 PostgreSQL 高可用性的工具,实现 PostgreSQL 集群的自动化高可用,处理主节点故障转移、从节点同步等任务,确保数据库服务的连续性,厅提供

  • 注册:Patroni 节点在启动时,会将自己的服务信息(如节点名称、角色、IP 地址、端口等)注册到 Consul 的 KV 存储中。例如,每个节点会在 Consul 的 /service/postgresql 路径下创建一个子目录,用于存储自己的详细信息。
  • 发现:其他组件(如 HAProxy、Pgbouncer 等)可以通过 Consul 的 API 或 DNS 接口来查询可用的 PostgreSQL 节点信息。这样,当主节点发生切换时,这些组件可以及时获取到新的主节点信息,从而实现负载均衡和连接管理。

Patroni管理Postgresql的用户、配置、初始化、启停生命周期、主备切换与故障恢复的配置都非常简单,

patronictl工具使用方法:

# 基础状态查询
patronictl -c /path/to/patroni.yml list my-cluster  # 查看集群成员状态
patronictl -c /path/to/patroni.yml show-config my-cluster  # 查看动态配置
patronictl -c /path/to/patroni.yml history my-cluster  # 查看故障转移历史
patronictl -c /path/to/patroni.yml dsn my-cluster node1  # 获取节点连接字符串
patronictl -c /path/to/patroni.yml version  # 查看版本信息

# 主备切换(Switchover)
patronictl -c /path/to/patroni.yml switchover my-cluster --to node2  # 手动切换主节点到 node2
patronictl -c /path/to/patroni.yml switchover my-cluster --scheduled "2025-03-22T08:00:00Z"  # 定时切换
patronictl -c /path/to/patroni.yml switchover my-cluster --force  # 强制切换
patronictl -c /path/to/patroni.yml switchover my-cluster --group 0  # 指定组别切换

# 故障转移(Failover)
patronictl -c /path/to/patroni.yml failover my-cluster --force  # 强制故障转移
patronictl -c /path/to/patroni.yml failover my-cluster --node node3  # 指定新主节点

# 配置管理
patronictl -c /path/to/patroni.yml edit-config my-cluster  # 修改动态配置(如 loop_wait、ttl)
patronictl configure > /path/to/new-patroni.yml  # 生成默认配置模板

# 维护操作
patronictl -c /path/to/patroni.yml restart my-cluster node1 --force  # 重启指定节点
patronictl -c /path/to/patroni.yml reinit my-cluster node2  # 重新初始化节点
patronictl -c /path/to/patroni.yml pause my-cluster  # 暂停自动故障转移
patronictl -c /path/to/patroni.yml resume my-cluster  # 恢复自动故障转移

patroni配置文件如下:

cat /etc/patroni.yml

# 集群名称,所有节点的该配置项需保持一致,用于标识属于同一个 PostgreSQL 集群
scope: pg_cluster         
# 节点的唯一名称,不同节点应使用不同的名称,例如 pg-node1、pg-node2、pg-node3
name: pg-node1            

# REST API 相关配置,用于外部程序与 Patroni 进行交互
restapi:
  # REST API 监听的地址和端口,0.0.0.0 表示监听所有可用的网络接口
  listen: 0.0.0.0:8008    
  # 当前节点用于外部连接 REST API 的 IP 地址和端口
  connect_address: 100.3.254.210:8008  

# Consul 相关配置,Consul 作为分布式协调系统,用于存储集群状态信息
consul:
  # Consul 服务的地址和端口,这里使用本地默认端口
  host: 127.0.0.1:8500    

# 集群启动时的初始化配置
bootstrap:
  # 分布式协调系统(DCS)相关配置
  dcs:
    # Leader 锁的生存时间(Time To Live),单位为秒,超过该时间 Leader 锁将失效
    ttl: 30               
    # 状态检查的时间间隔,单位为秒,Patroni 会按照该间隔检查集群状态
    loop_wait: 10         
    # 操作重试的超时时间,单位为秒,如果操作在该时间内未完成则进行重试
    retry_timeout: 10     
    postgresql:
      # 允许节点在重新加入集群时自动使用 pg_rewind 工具修复数据差异
      use_pg_rewind: true  
      # 使用复制槽来确保流复制的可靠性,避免数据丢失
      use_slots: true      
      # PostgreSQL 数据库的参数配置
      parameters:
        # 数据库允许的最大连接数
        max_connections: 100
        # WAL(Write-Ahead Logging)日志级别,replica 表示支持流复制
        wal_level: replica
        # 启用热备模式,允许在备库上进行只读查询
        hot_standby: "on"
  # 初始化数据库时的配置参数
  initdb:                 
    # 数据库的字符编码设置为 UTF8
    - encoding: UTF8
    # 数据库的区域设置为 en_US.UTF-8
    - locale: en_US.UTF-8
  # PostgreSQL 的客户端访问控制规则,用于限制哪些客户端可以连接到数据库
  pg_hba:                 
    # 允许所有子网内的客户端使用 replicator 用户进行复制连接,使用 md5 加密认证
    - host replication replicator all md5  
    # 允许所有客户端使用任何用户连接到数据库,使用 md5 加密认证
    - host all all 0.0.0.0/0 md5                     

# PostgreSQL 数据库本身的配置
postgresql:
  # PostgreSQL 数据库监听的地址和端口,0.0.0.0 表示监听所有可用的网络接口
  listen: 0.0.0.0:5432
  # 当前节点用于外部连接 PostgreSQL 数据库的 IP 地址和端口
  connect_address: 100.3.254.210:5432  
  # PostgreSQL 数据库的数据文件存储目录
  data_dir: /opt/pgsql/14/data     
  # PostgreSQL 二进制可执行文件所在的目录
  bin_dir: /usr/local/tos/pgsql/bin            
  # 数据库的认证配置,包括复制用户和超级用户的信息
  authentication:       
    replication:
      # 用于流复制的用户名
      username: replicator
      # 用于流复制的用户密码
      password: patroni123
    superuser:
      # 数据库超级用户的用户名
      username: postgres
      # 数据库超级用户的密码
      password: patroni123

增加patroni服务:

[root@node1 ~]# vi /etc/systemd/system/patroni.service
[Unit]
Description=Patroni - HA PostgreSQL
After=network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/bin/patroni /etc/patroni.yml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

# 启动
systemctl start patroni.service 
systemctl status patroni.service 

patroni启动后会自动完成postgreSQL集群的启动和初始化,并选主节点;

[root@node1 ~]# patronictl -c /etc/patroni.yml list
+----------+---------------+---------+---------+----+-----------+
| Member   | Host          | Role    | State   | TL | Lag in MB |
+ Cluster: pg_cluster (7482703141283838846) ---+----+-----------+
| pg-node1 | 100.3.254.210 | Replica | running |  3 |         0 |
| pg-node2 | 100.3.254.211 | Leader  | running |  3 |           |
| pg-node3 | 100.3.254.212 | Replica | running |  3 |         0 |
+----------+---------------+---------+---------+----+-----------+

# psql查看复制状态
postgres=# select * from pg_stat_replication;
  pid  | usesysid |  usename   | application_name |  client_addr  | client_hostname | client_port |         backend_start         | backen
d_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state |   
       reply_time           
-------+----------+------------+------------------+---------------+-----------------+-------------+-------------------------------+-------
-------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------+---
----------------------------
 15132 |    16384 | replicator | pg-node1         | 100.3.254.210 |                 |       36202 | 2025-03-17 18:44:55.147136+08 |       
       | streaming | 0/44C8E98 | 0/44C8E98 | 0/44C8E98 | 0/44C8E98  |           |           |            |             0 | async      | 20
25-03-24 09:38:42.598134+08
 15135 |    16384 | replicator | pg-node3         | 100.3.254.212 |                 |       59486 | 2025-03-17 18:44:57.936311+08 |       
       | streaming | 0/44C8E98 | 0/44C8E98 | 0/44C8E98 | 0/44C8E98  |           |           |            |             0 | async      | 20
25-03-24 09:38:43.652995+08
(2 rows)

以上,完成了patroni基于DCS的接管pg状态的配置;

vip-manager配置

patroni实现了集群的管理,并把leader信息保存在DSC/Consul中,那么就可以基于这个值来实现vip的管理,也就是consul中存的patroni的leader变动那么vip就跟着漂移,因此配置文件如下:

[root@node1 ~]# more /etc/default/vip-manager.yml
ip: 100.3.254.200  # 虚拟 IP 地址
netmask: 16         # 子网掩码
interface: eth0         # 绑定的网络接口
trigger-key: /service/pg_cluster/leader
dcs-type: consul                         # 与 Patroni 使用的 DCS 类型一致
trigger-value: pg-node1                  # node1配置pg-node1,node2配置pg-node2,跟patronictl list一致
dcs-endpoints: http://100.3.254.210:8500,http://100.3.254.211:8500,http://100.3.254.212:8500     # Consul 的访问地址

# 直接启动
systemctl restart vip-manager
systemctl status vip-manager

# 验证网络端口的绑定
[root@node2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0c:da:41:1d:fc:bf brd ff:ff:ff:ff:ff:ff
    inet 100.3.254.211/16 brd 100.3.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 100.3.254.200/16 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::eda:41ff:fe1d:fcbf/64 scope link 
       valid_lft forever preferred_lft forever

以上完成了vip的配置,100.254.3.200将跟着DCS中leader的value而变动,因为vip-manager中配置文件没有写log日志地址,所以默认是/var/log/messages;

[root@node2 ~]# tail -90f /var/log/messages
Mar 24 09:41:44 node2 vip-manager: 2025/03/24 09:41:44 IP address 100.3.254.200/16 state is true, desired true
Mar 24 09:41:53 node2 patroni: 2025-03-24 09:41:53,950 INFO: no action. I am (pg-node2), the leader with the lock
Mar 24 09:41:54 node2 vip-manager: 2025/03/24 09:41:54 IP address 100.3.254.200/16 state is true, desired true
Mar 24 09:42:03 node2 patroni: 2025-03-24 09:42:03,950 INFO: no action. I am (pg-node2), the leader with the lock

pgbouncer配置

以上其实已经完成了三节点PostgreSQL的高可用,如果在此基础上还想做些高并发/负载均衡的优化以应对复杂场景,就需要在每个节点再补充部署pgbouncer和haproxy;

前者进行pg的连接池化(pg是基于多进程的,每个connection消耗1个进程,进程的创建和销毁开销很大),后者在pgbouncer的基础上实现负载均衡(也就是将请求负载到每个主机的连接池上),haproxy还可以将读请求分发到从节点,写请求分发到主节点来实现读写分离(端口级别);

pgbouncer的配置如下:

[root@node2 ~]# cat /etc/pgbouncer/pgbouncer.ini
# [databases] 部分用于定义 Pgbouncer 可以连接的数据库及其连接信息
[databases]
# 使用通配符 * 表示匹配所有数据库连接请求
# host 指定 PostgreSQL 数据库服务器的 IP 地址
# port 指定 PostgreSQL 数据库服务器监听的端口号
# dbname 指定要连接的数据库名称
# user 指定连接数据库使用的用户名
* = host=100.3.254.200 port=5432 dbname=postgres user=postgres

# [pgbouncer] 部分用于配置 Pgbouncer 本身的行为和参数
[pgbouncer]
# 忽略客户端在启动时发送的 extra_float_digits 参数,避免该参数对连接池的影响
ignore_startup_parameters = extra_float_digits
# 指定 Pgbouncer 监听的地址,0.0.0.0 表示监听所有可用的网络接口
listen_addr = 0.0.0.0
# 指定 Pgbouncer 监听的端口号,应用程序将通过该端口连接到 Pgbouncer
listen_port = 6432
# 指定 Pgbouncer 的日志文件路径,用于记录运行过程中的日志信息
logfile = /var/log/pgbouncer/pgbouncer.log
# 指定 Pgbouncer 的进程 ID 文件路径,用于管理 Pgbouncer 进程
pidfile = /var/run/pgbouncer/pgbouncer.pid
# 指定认证类型为 md5,即使用 MD5 加密的密码进行认证
auth_type = md5
# 指定存储用户认证信息的文件路径,该文件包含用户名和对应的加密密码
auth_file = /etc/pgbouncer/userlist.txt
# 指定连接池模式为 transaction,即事务级连接池模式
# 在该模式下,一个连接在一个事务结束后会被释放回连接池供其他事务使用
pool_mode = transaction
# 指定 Pgbouncer 允许的最大客户端连接数
max_client_conn = 1000
# 指定每个数据库的默认连接池大小,即每个数据库可以同时使用的连接数量
default_pool_size = 100
# 指定具有管理员权限的用户列表,这些用户可以执行 Pgbouncer 的管理命令
admin_users = pgbouncer,postgres
# 指定具有统计信息查看权限的用户列表,这些用户可以查看 Pgbouncer 的统计信息
stats_users = pgbouncer,postgres

userlist.txt存储用户名和密码:(加密与否待确认)

[root@node2 ~]# more /etc/pgbouncer/userlist.txt 
"postgres" "patroni123"
"pgbouncer" "patroni123"

 验证pgbouncer用户和库的使用:

[root@node1 ~]# su - postgres
Last login: Mon Mar 24 09:38:21 CST 2025 on pts/0
-bash-4.2$ psql -h 127.0.0.1 -p 6432 -U pgbouncer -d pgbouncer
Password for user pgbouncer: 
psql (14.5, server 1.17.0/bouncer)
Type "help" for help.

-- 查看所有可用的 show 命令
show help;
-- 查看当前配置参数
show config;
-- 查看所有已配置的数据库
show databases;
-- 查看当前连接池状态(每个数据库的连接池信息)
show pools;
-- 查看所有客户端连接
show clients;
-- 查看所有服务器连接
show servers;
-- 查看版本信息
show version;
-- 查看内存使用情况
show mem;
-- 查看总连接数和执行状态
show totals;
-- 查看当前客户端连接详情(IP、状态、空闲时间等)
show clients;
-- 查看与后端 PostgreSQL 的服务器连接状态
show servers;
-- 查看当前连接池中每个数据库的活跃连接数
show pools;
-- 查看当前连接池的模式(session/transaction/statement)
show pool_mode;
-- 包含连接数、事务数、查询数等各项统计数据
SHOW STATS;
-- 列出所有配置的用户及其相关信息
SHOW USERS;

以上,在三个节点上不属于了pgbouncer就实现了连接池化,并且是3个池,每个池的配置文件中配置的服务端口都是能提供读写服务的+vip所在的主的5432端口,所以3个pgbouncer的6432服务端口都可以提供给业务侧使用,如果想让这三个池都均衡的使用起来就可以使用下面的haproxy负载实现;

同时这里的pgbouncer是监听6432转发到vip的5432上,还可以配置成是三个节点上的pgbouncer只监听当前主机的5432,结合haproxy的转发配置策略,比如haproxy监听5436转发到vip上pgbouncer服务的6432就实现了读+写请求转发,haproxy监听5437端口转发到非vip上pgbouncer服务的6432服务端口就实现了只读请求转发,这样给读写业务提供5436端口连接,给只读业务提供5437连接就可以实现读写分离控制;(三个节点均部署haproxy,对业务提供的是vip上haproxy的地址)

haproxy配置

三个节点上都要部署haproxy以保持冗余,对业务侧仅提供vip上的haproxy地址(如vip:5436),haproxy的crash与拉起机制是操作系统来保证的,确保vip漂移后每个haproxy可连接,虽然这里可能是一个出问题的点,总不能再把haproxy的健康状态注册到DCS来再绑定一个vip吧。

按照上面描述每个pgbouncer都是vip上的5432端口的池化,因此haproxy可以均匀的将请求转发到每个节点的pgbouncer上,配置如下:

[root@node1 ~]# cat /etc/haproxy/haproxy.cfg 
#=====================================================================
# Document: https://www.haproxy.org/download/2.5/doc/configuration.txt
# 此注释指向 HAProxy 2.5 版本的配置文档链接,方便用户查阅详细配置说明
#=====================================================================
global
    daemon           # 以守护进程模式运行 HAProxy,使其在后台持续运行
    user        haproxy  # 指定 HAProxy 运行时使用的用户
    group       haproxy  # 指定 HAProxy 运行时使用的用户组
    node        haproxy  # 为当前 HAProxy 节点设置一个名称,用于标识
    #pidfile     /var/run/haproxy.pid  # 注释掉的配置项,指定 HAProxy 进程 ID 文件的路径
    # chroot      /var/lib/haproxy          # if chrooted, change stats socket above  # 注释掉的配置项,将 HAProxy 进程限制在指定的根目录下运行,若启用需修改统计信息套接字配置
    # stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin  # 注释掉的配置项,定义统计信息套接字的路径、所属用户、用户组、权限和管理级别

    # spread-checks 3                       # add randomness in check interval  # 注释掉的配置项,在健康检查间隔中添加随机性
    # quiet                                 # Do not display any message during startup  # 注释掉的配置项,启动时不显示任何消息
    maxconn     65535                       # maximum per-process number of concurrent connections  # 每个进程允许的最大并发连接数

#---------------------------------------------------------------------
# default settings
# 以下是 HAProxy 的默认配置部分
#---------------------------------------------------------------------
defaults
    # log                global  # 注释掉的配置项,使用全局日志配置

    mode               tcp  # 设置默认的工作模式为 TCP 模式,适用于处理 TCP 流量
    retries            3            # max retry connect to upstream  # 连接到上游服务器的最大重试次数
    timeout queue      3s           # maximum time to wait in the queue for a connection slot to be free  # 客户端在队列中等待连接槽空闲的最大时间
    timeout connect    3s           # maximum time to wait for a connection attempt to a server to succeed  # 连接到服务器的最大等待时间
    timeout client     24h           # client connection timeout  # 客户端连接的超时时间
    timeout server     24h           # server connection timeout  # 服务器连接的超时时间
    timeout check      3s           # health check timeout  # 健康检查的超时时间

#---------------------------------------------------------------------
# default admin users
# 以下是默认的管理员用户配置部分
#---------------------------------------------------------------------
userlist STATS_USERS  # 定义一个用户列表,名为 STATS_USERS
        group admin users admin  # 在 STATS_USERS 用户列表中定义一个名为 admin 的用户组,包含用户 admin
        user stats  insecure-password pigsty  # 在 STATS_USERS 用户列表中定义一个名为 stats 的用户,使用明文密码 pigsty
        user admin  insecure-password pigsty  # 在 STATS_USERS 用户列表中定义一个名为 admin 的用户,使用明文密码 pigsty

#=====================================================================
# Service Definition
# 以下是服务定义部分
#=====================================================================
 listen default  # 定义一个名为 default 的监听部分
     bind *:5436  # 绑定到所有可用的网络接口,并监听 5436 端口
     mode tcp  # 设置该监听部分的工作模式为 TCP 模式
     maxconn 3000  # 该监听部分允许的最大并发连接数
     balance roundrobin  # 设置负载均衡算法为轮询,即依次将请求分发给后端服务器
     option httpchk  # 启用 HTTP 健康检查
     option http-keep-alive  # 启用 HTTP 长连接,保持客户端和服务器之间的连接
     http-check expect status 200  # 期望健康检查返回的 HTTP 状态码为 200
     default-server inter 3s fastinter 1s downinter 5s rise 3 fall 3 on-marked-down shutdown-sessions slowstart 30s maxconn 3000 maxqueue 128 weight 100  # 后端服务器的默认配置:健康检查间隔为 3 秒,快速检查间隔为 1 秒,服务器标记为故障后的检查间隔为 5 秒,连续 3 次检查成功则认为服务器恢复正常,连续 3 次检查失败则认为服务器故障,服务器被标记为故障时关闭现有会话,服务器启动时的慢速启动时间为 30 秒,每个服务器允许的最大并发连接数为 3000,最大队列长度为 128,服务器权重为 100
     server node1 100.3.254.210:6432 check port 8008 weight 100  # 定义一个名为 node1 的后端服务器,地址为 100.3.254.210:6432,对其 8008 端口进行健康检查,服务器权重为 100
     server node2 100.3.254.211:6432 check port 8008 weight 100  # 定义一个名为 node2 的后端服务器,地址为 100.3.254.211:6432,对其 8008 端口进行健康检查,服务器权重为 100
     server node3 100.3.254.212:6432 check port 8008 weight 100  # 定义一个名为 node3 的后端服务器,地址为 100.3.254.212:6432,对其 8008 端口进行健康检查,服务器权重为 100

#启动
[root@node1 ~]# systemctl start haproxy.service 
[root@node1 ~]# systemctl status haproxy.service  

验证

以上不仅完成3节点的PostgreSQL高可用集群,还进行了连接池化与负载均衡,保证了PG高可用同时,确保业务侧使用时候的精细化管理,确实是pg使用的最佳实践,也是Pigsty的部署方式;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3中keep-alive缓存组件应用场景。

文章目录 一、KeepAlive是什么&#xff1f;二、基本使用1.例子2.keep-alive使用 三、其他属性3.1 包含/排除3.2 最大缓存实例数3.3 缓存实例的生命周期 总结 一、KeepAlive是什么&#xff1f; 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例…

CosyVoice2在Windows系统上本地部署的详细步骤

CosyVoice2在Windows系统上本地部署的详细步骤&#xff1a; 下载源码并初始化&#xff1a; 确保你的设备上安装了Git。打开命令提示符&#xff08;cmd&#xff09;&#xff0c;执行以下命令来克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/CosyVo…

鸿蒙入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)

文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…

Pytorch学习笔记(八)Learn the Basics - Save and Load the Model

这篇博客瞄准的是 pytorch 官方教程中 Learn the Basics 章节的 Save and Load the Model 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m …

MATLAB 绘制空间分布图 方法总结

方法一&#xff1a;用mapshow函数 figure(1); hold on %% 添加陆地 land shaperead(landareas); mapshow(landareas.shp, FaceColor, [1 1 1], EdgeColor, [0.3 0.3 0.3],FaceAlpha,0)%% 添加站点 for i 1:size(mycmap,1)mapshow(lon(label i),lat(label i),displaytype,po…

Docker+Ollama+Xinference+RAGFlow+Dify+Open webui部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…

Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;智慧城市APP医疗信息模块 主要内容&#xff1a;医疗信息模块原型设计与交互 应用场景&#xff1a;医疗信息行业 案例展示&#xff1a; 案例视频&…

【网络通信安全】基于华为 eNSP 的链路聚合、手工负载分担模式与 LACP 扩展配置 全解析

目录 一、引言 二、链路聚合技术基础 2.1 链路聚合的定义与作用 2.2 链路聚合的工作原理 2.3 链路聚合的模式分类 三、华为 eNSP 简介 3.1 eNSP 的概述 3.2 eNSP 的安装与配置 3.2.1 安装环境要求 3.2.2 安装步骤 3.2.3 配置虚拟网卡 四、手工负载分担模式配置 4.…

Transformer 通关秘籍2:利用 BERT 将文本 token 化

前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的&#xff0c;希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程&#xff0c;这个过程被称为分词&#xff0c;也叫 tokenization。 在你没了解这方面…

网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算

文章目录 OSPF域内路由计算&#xff1a;单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网&#xff1a;https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…

CUDA 学习(2)——CUDA 介绍

GeForce 256 是英伟达 1999 年开发的第一个 GPU&#xff0c;最初用作显示器上渲染高端图形&#xff0c;只用于像素计算。 在早期&#xff0c;OpenGL 和 DirectX 等图形 API 是与 GPU 唯一的交互方式。后来&#xff0c;人们意识到 GPU 除了用于渲染图形图像外&#xff0c;还可以…

棱镜七彩受邀出席“供应链安全国家标准贯标应用深度行”活动并做主题分享

近日&#xff0c;“供应链安全国家标准贯标应用深度行”活动在北京顺利举办&#xff0c;此次活动汇聚了行业内的众多专家和企业代表&#xff0c;深入探讨了供应链安全国家标准的制定与实施路径。棱镜七彩副总裁黄浩东受邀出席&#xff0c;并发表了题为《国家标准实施路径下的企…

系统转换、系统维护、净室软件工程、构件软件工程(高软51)

系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…

联核防爆无人叉车:高危环境中的安全搬运守护者

联核防爆AGV无人叉车是专为易燃易爆环境设计的智能搬运设备&#xff0c;其特点、功能与应用场景均围绕“安全”与“智能”核心展开&#xff1a;联核科技官网-AGV叉车十大品牌-无人叉车厂家-自动化叉车-智能搬运码垛机器人-智能叉车系统解决方案专家 一、核心特点 防爆设计电气…

23种设计模式-责任链(Chain of Responsibility)设计模式

责任链设计模式 &#x1f6a9;什么是责任链设计模式&#xff1f;&#x1f6a9;责任链设计模式的特点&#x1f6a9;责任链设计模式的结构&#x1f6a9;责任链设计模式的优缺点&#x1f6a9;责任链设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题

一、问题 在使用集群服务器前可以查看导入&#xff0c;module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh&#xff0c;然后安装&#xff0c;导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…

python蓝桥杯刷题的重难点知识笔记

1、datetime模块 datetime.date&#xff1a;代表日期&#xff0c;包含年、月、日信息。datetime.time&#xff1a;代表时间&#xff0c;包含时、分、秒、微秒信息。datetime.datetime&#xff1a;结合了日期和时间&#xff0c;包含年、月、日、时、分、秒、微秒信息。datetime.…