部署高可用PostgreSQL14集群
目录
基础依赖包安装
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: patroni123superuser:# 数据库超级用户的用户名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+0815135 | 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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 0c:da:41:1d:fc:bf brd ff:ff:ff:ff:ff:ffinet 100.3.254.211/16 brd 100.3.255.255 scope global eth0valid_lft forever preferred_lft foreverinet 100.3.254.200/16 scope global secondary eth0valid_lft forever preferred_lft foreverinet6 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 版本的配置文档链接,方便用户查阅详细配置说明
#=====================================================================
globaldaemon # 以守护进程模式运行 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_USERSgroup admin users admin # 在 STATS_USERS 用户列表中定义一个名为 admin 的用户组,包含用户 adminuser stats insecure-password pigsty # 在 STATS_USERS 用户列表中定义一个名为 stats 的用户,使用明文密码 pigstyuser 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 状态码为 200default-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,服务器权重为 100server node1 100.3.254.210:6432 check port 8008 weight 100 # 定义一个名为 node1 的后端服务器,地址为 100.3.254.210:6432,对其 8008 端口进行健康检查,服务器权重为 100server node2 100.3.254.211:6432 check port 8008 weight 100 # 定义一个名为 node2 的后端服务器,地址为 100.3.254.211:6432,对其 8008 端口进行健康检查,服务器权重为 100server 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的部署方式;
相关文章:
部署高可用PostgreSQL14集群
目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群(14版本)&…...
爬虫案例-爬取某站视频
文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤: 1.下载 FFmpeg: 2.访问 FFmpeg 官网。 3.选择 Wi…...
PV操作指南
🔥《PV操作真香指南——看完就会的祖传攻略》🍵 一、灵魂三问❓ Q1:PV是个啥? • 💡 操作系统界的红绿灯:控制进程"何时走/何时停"的神器 • 🧱 同步工具人:解决多进程&q…...
计算机考研复试机试-考前速记
考前速记 知识点 1. 链表篇 1. 循环链表报数3,输出最后一个报数编号 #include <iostream> using namespace std;typedef struct Node {int no;struct Node* next; }Node, *NodeList;void createNodeListTail(NodeList&L, int n) {L (Node*)malloc(siz…...
【漏洞复现】Next.js中间件权限绕过漏洞 CVE-2025-29927
什么是Next.js? Next.js 是由 Vercel 开发的基于 React 的现代 Web 应用框架,具备前后端一体的开发能力,广泛用于开发 Server-side Rendering (SSR) 和静态站点生成(SSG)项目。Next.js 支持传统的 Node.js 模式和基于边…...
路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!
路由选型终极对决:直连/静态/动态三大类型华为华三思科配置差异,一张表彻底讲透! 一、路由:互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为(Huawei)华三&a…...
【AI】知识蒸馏-简单易懂版
1 缘起 最近要准备升级材料,里面有一骨碌是介绍LLM相关技术的,知识蒸馏就是其中一个点, 不过,只分享了蒸馏过程,没有讲述来龙去脉,比如没有讲解Softmax为什么引入T、损失函数为什么使用KL散度,…...
uniapp运行到支付宝开发者工具
使用uniapp编写专有钉钉和浙政钉出现的样式问题 在支付宝开发者工具中启用2.0构建的时候,在开发工具中页面样式正常 但是在真机调试和线上的时候不正常 页面没问题,所有组件样式丢失 解决 在manifest.json mp-alipay中加入 "styleIsolation&qu…...
STM32学习笔记之keil使用记录
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
卷积神经网络 - 参数学习
本文我们通过两个简化的例子,展示如何从前向传播、损失计算,到反向传播推导梯度,再到参数更新,完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络,其结构仅包含一个卷积层和一个输出…...
【加密社】币圈合约交易量监控,含TG推送
首先需要在币安的开发者中心去申请自己的BINANCE_API_KEY和BINANCE_API_SECRET 有了这个后,接着去申请一个TG的机器人token和对话chatid 如果不需要绑定tg推送的话,可以忽略这步 接下来直接上代码 引用部分 from os import system from binance.c…...
大模型概述
大模型属于Foundation Model(基础模型)[插图],是一种神经网络模型,具有参数量大、训练数据量大、计算能力要求高、泛化能力强、应用广泛等特点。与传统人工智能模型相比,大模型在参数规模上涵盖十亿级、百亿级、千亿级…...
【CSS3】完整修仙功法
目录 CSS 基本概念CSS 的定义CSS 的作用CSS 语法 CSS 引入方式内部样式表外部样式表行内样式表 选择器基础选择器标签选择器类选择器id 选择器通配符选择器 画盒子文字控制属性字体大小字体粗细字体倾斜行高字体族font 复合属性文本缩进文本对齐文本修饰线文字颜色 复合选择器后…...
C++ 的 if-constexpr
1 if-constexpr 语法 1.1 基本语法 if-constexpr 语法是 C 17 引入的新语法特性,也被称为常量 if 表达式或静态 if(static if)。引入这个语言特性的目的是将 C 在编译期计算和求值的能力进一步扩展,更方便地实现编译期的分支…...
【电气设计】接地/浮地设计
在工作的过程中,遇到了需要测量接地阻抗的情况,组内讨论提到了保护接地和功能接地的相关需求。此文章用来记录这个过程的学习和感悟。 人体触电的原理: 可以看到我们形成了电流回路,导致触电。因此我们需要针对设备做一些保护设计…...
Gone v2 配置管理3:连接 Nacos 配置中心
🚀 发现 gone-io/gone:一个优雅的 Go 依赖注入框架!💻 它让您的代码更简洁、更易测试。🔍 框架轻量却功能强大,完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目,请给我们点个星!&a…...
深度强化学习中的深度神经网络优化策略:挑战与解决方案
I. 引言 深度强化学习(Deep Reinforcement Learning,DRL)结合了强化学习(Reinforcement Learning,RL)和深度学习(Deep Learning)的优点,使得智能体能够在复杂的环境中学…...
浅拷贝与深拷贝
浅拷贝和深拷贝是对象复制中的两种常见方式,它们在处理对象的属性时有本质的区别。 一. 浅拷贝(Shallow Copy) 浅拷贝是指创建一个新对象,然后将当前对象的非静态字段复制到新对象中。如果字段是值类型的,那么将复制字…...
macOS 安装 Miniconda
macOS 安装 Miniconda 1. Quickstart install instructions2. 执行3. shell 上初始化 conda4. 关闭 终端登录用户名前的 base参考 1. Quickstart install instructions mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o…...
分布式限流方案:基于 Redis 的令牌桶算法实现
分布式限流方案:基于 Redis 的令牌桶算法实现 前言一、原理介绍:令牌桶算法二、分布式限流的设计思路三、代码实现四、方案优缺点五、 适用场景总结 前言 在分布式场景下,接口限流变得更加复杂。传统的单机限流方式难以满足跨节点的限流需求…...
OpenHarmony子系统开发 - 电池管理(二)
OpenHarmony子系统开发 - 电池管理(二) 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时,由于环境影响,可能会导致电池温度过高,因此需要对充电电流或电…...
Cocos Creator版本发布时间线
官网找不到,DeepSeek给的答案,这里做个记录。 Cocos Creator 1.x 系列 发布时间:2016 年 - 2018 年 1.0(2016 年 3 月): 首个正式版本,基于 Cocos2d-x 的 2D 游戏开发工具链,集成可…...
修形还是需要再研究一下
最近有不少小伙伴问到修形和蜗杆砂轮的问题,之前虽然研究过一段时间,但是由于时间问题放下了,最近想再捡起来。 之前计算的砂轮齿形是一整段的,但是似乎这种对于有些小伙伴来说不太容易接受,希望按照修形的区域进行分…...
Java面试黄金宝典11
1. 什么是 JMM 内存模型 定义 JMM(Java Memory Model)即 Java 内存模型,它并非真实的物理内存结构,而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存(Main Memory)之间的交互方式&#x…...
华为p10 plus 鸿蒙2.0降级emui9.1.0.228
需要用到的工具 HiSuite Proxy V3 华为手机助手11.0.0.530_ove或者11.0.0.630_ove应该都可以。 官方的通道已关闭,所以要用代理,127.0.0.1端口7777 https://www.firmfinder.ml/ https://professorjtj.github.io/v2/ https://hisubway.online/articl…...
高速开源镜像站网址列表2503
高速开源镜像站网址列表 以下是国内常用的高速开源镜像站网址列表,涵盖企业和教育机构的主要站点,适用于快速下载开源软件和系统镜像: 一、企业镜像站 阿里云镜像站 地址:https://mirrors.aliyun.com/ 特点:覆盖广泛…...
Python----计算机视觉处理(Opencv:绘制图像轮廓:寻找轮廓,findContours()函数)
一、轮廓 轮廓是图像中目标物体或区域的外部边界线或边界区域,由一系列相连的像素构成封闭形状,代表了物体的基本外形。与边缘不同,轮廓是连续的,而边缘则不一定是连续的。 轮廓与边缘的区别: 轮廓是一组连续的点或线…...
python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测
dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python==3.8 opencv-python==4.11.0.86 face_recognition==1.3.0 dlib==19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img = cv2.imread(r"C:\U…...
【测试工具】如何使用 burp pro 自定义一个拦截器插件
在 Burp Suite 中,你可以使用 Burp Extender 编写自定义拦截器插件,以拦截并修改 HTTP 请求或响应。Burp Suite 支持 Java 和 Python (Jython) 作为扩展开发语言。以下是一个完整的流程,介绍如何创建一个 Burp 插件来拦截请求并进行自定义处理…...
51单片机和STM32 入门分析
51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…...
python暴力破解html表单
import requests import time# 目标URL url "http://192.168.3.101/pikachu/vul/burteforce/bf_form.php" # 请替换为实际的目标URL# 已知的用户名 username "admin"# 密码字典文件路径 password_file "passwords.txt"# 伪造请求头ÿ…...
DeepSeek+RAG局域网部署
已经有很多平台集成RAG模式,dify,cherrystudio等,这里通过AI辅助,用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit,答案流式输出,并且对答案加上索引。支持doc,docx,pdf,txt。…...
流影---开源网络流量分析平台(一)(小白超详细)
目录 流影介绍 一、技术架构与核心技术 二、核心功能与特性 流影部署 流影介绍 一、技术架构与核心技术 模块化引擎设计 流影采用四层模块化架构:流量探针(数据采集)、网络行为分析引擎(特征提取)、威胁检测引擎&…...
在IDEA中快速注释所有console.log
在IDEA中快速注释所有console.log 在前端IDEA中,快速注释所有console.log语句可以通过以下步骤实现2: 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*,…...
python全栈-前端
python全栈-前端 文章目录 HTML标签段落p、换行br、水平线hr图片img路径src超文本链接a超链接之锚点href#id文本有序列表ol无序列表ul自定义列表表格table表格属性单元格合并 表单Forminput标签HTML5新增type属性HTML5新增常用属性 实体字符块元素与行内元素/内联元素容器元素d…...
基于PySide6与pycatia的CATIA绘图文本批量处理工具开发实践
引言 在CAD软件二次开发领域,CATIA的自动化处理一直存在开发门槛高、接口复杂等痛点。本文基于Python生态,结合PySide6 GUI框架与pycatia接口库,实现了一套高效的绘图文本批量处理工具。该工具支持背景视图文本批量处理和交互式文本选择处理…...
Jenkins 集成 SonarQube 代码静态检查使用说明
环境准备 Jenkins 服务器 确保 Jenkins 已安装并运行(推荐 LTS 版本)。安装插件: SonarQube Scanner for Jenkins(用于集成 SonarQube 扫描)NodeJS Plugin(可选,用于 JavaScript 项目࿰…...
pytorch构建线性回归模型
仅仅用于自己记录pytorch学习记录 线性回归模型 (1)准备数据集 数据:三个数据x[x1,x2,x3] y[y1,y2,y3] import torch #线性回归,我们使用三组数据,分别是(1,2),(2,4&a…...
本地部署 LangManus
本地部署 LangManus 0. 引言1. 部署 LangManus2. 部署 LangManus Web UI 0. 引言 LangManus 是一个社区驱动的 AI 自动化框架,它建立在开源社区的卓越工作基础之上。我们的目标是将语言模型与专业工具(如网络搜索、爬虫和 Python 代码执行)相…...
skynet网络包库(lua-netpack.c)的作用解析
目录 网络包库(lua-netpack.c)的作用解析1. 数据包的分片与重组2. 网络事件处理3. 内存管理4. 数据打包与解包 动态库(.so)在 Lua 中的使用1. 编译为动态库2. Lua 中加载与调用(1) 加载模块(2) 核心方法(3) 使用示例 3. 注意事项 …...
XXL-Job 二次分片是怎么做的?有什么问题?怎么去优化的?
XXL-JOB二次分片机制及优化策略 二次分片实现原理 XXL-JOB的二次分片是在分片广播策略的基础上,由开发者自行实现的更细粒度数据拆分。核心流程如下: 初次分片:调度中心根据执行器实例数量(总分片数n)分配分片索引i&…...
零基础本地部署 ComfyUI+Flux.1 模型!5 分钟搭建远程 AI 绘图服务器(保姆级教程)
文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在如今这 AI 技术一路火花带闪电、疯狂往前冲的时代,图像生成模型那可不再是…...
ABC398题解
A 算法标签: 模拟 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 110;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n;cin >> n;string res;if (n % 2) {int mid n / 2;f…...
数据通信——计算机基础
通信系统的组成 通信系统是指从一个地方向另外一个地方传递和交换信息,实现信息传递所需的一切技术设备和传输媒体的总和。通信系统一般由信源、发送设备、信道、接收设备、信宿以及噪声源组成,以下是各部分的具体介绍: 信源 信源是产生各…...
量子计算与人工智能的融合:下一代算力革命
1. 引言:算力需求的飞速增长与量子计算的潜力 在信息技术飞速发展的今天,人工智能(AI)已经渗透到我们生活的方方面面,从智能助手到自动驾驶,再到医疗诊断,AI 的应用场景日益广泛。然而…...
神经网络解决非线性二分类
这份 Python 代码实现了一个简单的神经网络,用于解决复杂的非线性二分类问题。具体步骤包含生成数据集、定义神经网络模型、训练模型、测试模型以及可视化决策边界。 依赖库说明 python import numpy as np import matplotlib.pyplot as plt from sklearn.datase…...
nuxt3网站文章分享微信 ,QQ功能
1.安装 npm install qrcode --save-dev 2.组件使用 <div class"share"><div style"line-height: 69px; color: #fff;width: 100px;"><p style"text-align: center;">分享:</p></div><div click"shareToMi…...
深入理解Spring框架:核心概念与组成剖析
引言 在Java企业级开发领域,Spring框架无疑是当之无愧的王者。自2003年首次发布以来,Spring凭借其强大的功能、高度的灵活性和卓越的扩展性,已成为构建大型企业应用程序的首选框架。本文将深入探讨Spring框架的核心概念与多样组成部分&#…...
Ubuntu22.04美化MacOS主题
安装Tweaks 参考Ubuntu 22.04 桌面美化成Mac风格这篇更好点 sudo apt install gnome-tweaks gnome-shell-extensions -y安装macos主题 git clone https://github.com/vinceliuice/WhiteSur-gtk-theme.git # 进到文件目录 ./install.sh -t all -N glassy sudo ./tweaks.sh -g…...
MySQL: 创建两个关联的表,用联表sql创建一个新表
MySQL: 创建两个关联的表 建表思路 USERS 表:包含用户的基本信息,像 ID、NAME、EMAIL 等。v_card 表:存有虚拟卡的相关信息,如 type 和 amount。关联字段:USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…...