中国国家城乡建设部网站,用户体验设计是什么,长沙微网站开发,大型企业网络规划方案期望通过每一次分享#xff0c;让技术的门槛变低#xff0c;落地更容易。 —— around 前言
旨在解决微服务项目全是连接池并影响数据库并发连接#xff0c;作者的环境是基于sprongboot微服务连接postgres数据库#xff0c;每个微服务的DAO层配置都使用了连接池技术。后续… 期望通过每一次分享让技术的门槛变低落地更容易。 —— around 前言
旨在解决微服务项目全是连接池并影响数据库并发连接作者的环境是基于sprongboot微服务连接postgres数据库每个微服务的DAO层配置都使用了连接池技术。后续微服务太多导致连接到一个数据库上默认创建的连接太多整体数据库连接数 微服务数量 x 连接池默认创建连接数量因此在连接池上做处理统一迁移至数据库端同时为以后升级数据集群管理工具准备。
编写文本的最大原因是网上关于pgbouncer的文章质量太差于是个人记录一下踩坑情况与实际解决方案。
作者环境centos7 postgres14 pgbouncer1.18 springboot2.4.5
目录 安装pgbouncer 错误收集 springboot连接pgbouncer
正文
1.安装pgbouncer
使用yum直接安装
yum install pgbouncer -y安装完毕后注意看几个目录是否存在
/etc/pgbouncer/
/var/log/pgbouncer/接着打开pgbouncer.ini文件进行配置修改关注以下几个参数项建议按本文直接设置
vi /etc/pgbouncer/pgbouncer.inibegin
[databases]
postgres host127.0.0.1 port5432 dbnamepostgreslisten_addr *
listen_port 6432# 如果你安装的postgres是低于14版本则使用auth_type md5否则请按我的设置
auth_type scram-sha-256
auth_file /etc/pgbouncer/userlist.txt# 管理账号
admin_users postgres
stats_users postgres# 支持session、transaction、statement三种模式不明白去搜索
pool_mode transactionserver_reset_query DISCARD ALL# 是否忽略jdbc连接参数
ignore_startup_parameters extra_float_digitsserver_check_query select 1server_check_delay 30# 最大连接池数量
max_client_conn 400# 默认连接池数量
default_pool_size 36reserve_pool_size 5dns_max_ttl 15修改完毕后直接保存文件接着不要着急启动启动肯定直接失败以下内容就是我启动后造成的错误日志
LOG (nodb)/postgres127.0.0.1:33082 closing because: password authentication failed (age0s)
WARNING (nodb)/postgres127.0.0.1:33082 pooler error: password authentication failed下面接着配置连接池与postgres的信任连接既然连接自然需要数据库账号密码了按照上述的配置文件用户应该是在/etc/pgbouncer/userlist.txt中但你肯定找不到这个文件它需要我们自己去创建提供2个方法 使用pgbouncer脚本 cd /etc/pgbouncer到这个目录找到mkauth.py文件直接对这个文件执行命令即可注通过yum安装方式才有依赖环境 # 字符串引号部分空格不要处理填写的内容实际上就是访问你postgres数据库的属性请参考自己的设置修改
/etc/pgbouncer/mkauth.py /etc/pgbouncer/userlist.txt host127.0.0.1 dbnamepostgres port5432 userpostgres passwordpostgres生成完毕后请检查一下自己在/etc/pgbouncer目录下的userlist.txt文件该文件包含你postgres所有的账号信息请调整一下该文件的内容主要是处理空引号的问题 vi /etc/pgbouncer/userlist.txt# old
postgres SCRAM-SHA-256$4096:St3x1cVAcTJDsiGEnqjoA # new
postgres SCRAM-SHA-256$4096:St3x1cVAcTJDsiGEnqjoA最后请记得给该文件授权一下避免后续缺权限无法使用。 chmod -R 755 /etc/pgbouncer/userlist.txt使用postgres数据库表 在数据库安装的服务器上直接登录数据库 # 请修改成自己的数据库访问地址和账号
psql -p 5432 postgres -h 127.0.0.1 -U postgres# 登录后直接查询pg_shadow获取账号密码信息
select usename, passwd from pg_shadow;对上述查到的数据库账号信息自己直接复制出来不需要全部复制只复制自己希望暴露出来通过pgbouncer方式登录系统的账号。 复制之后的数据直接按照下面的格式创建文件并存储账号密码信息 vi /etc/pgbouncer/userlist.txt# 账号 密码
postgres SCRAM-SHA-256$4096:St3x1cVAcTJDsiGEnqjoA 最后请记得给该文件授权一下避免后续缺权限无法使用。 chmod -R 755 /etc/pgbouncer/userlist.txt接着启动你的数据库吧这里不能使用root启动会导致pgbouncer启动失败。我们执行如下命令 # 切换用户
su - pgbouncer# 启动
pgbouncer -d /etc/pgbouncer/pgbouncer.ini启动完毕后查询pgbouncer状态systemctl status pgbouncer如果显示为下图表示成功。
如果如下图显示则表示出现了问题我们需要针对性检查问题据具体问题详见第二章。
2.错误收集 FATAL PgBouncer should not run as root 说明pgbouncer的启动用户是通过root账号启动的使用yum安装的话直接通过如下操作完成 su - pgbouncer# 启动
pgbouncer -d /etc/pgbouncer/pgbouncer.iniERROR could not open auth_file /etc/pgbouncer/userlist.txt: Permission denied 说明当前pgbouncer的用户文件是没有权限读取的请设置权限 chmod -R 755 /etc/pgbouncer/userlist.txtFATAL unix socket is in use, cannot continue 说明pgbouncer重复启动了需要关闭之前启动的就算启动失败了完成后再次启动 # 查找进程
ps -ef |grep pg# 找到正在启动的进程然后删除掉
kill -9 pid# 上述不可用也能使用此方式
kill cat /var/run/pgbouncer/pgbouncer.pidclosing because: unsupported startup parameter: extra_float_digits2 表示当前用户连接到pgbouncer携带的参数有问题存在jdbc无法连接的问题进入pgbouncer安装所在服务 vi /etc/pgbouncer/pgbouncer.ini# 是否忽略jdbc连接参数
ignore_startup_parameters extra_float_digits# 修改完成后记得重启pgbouncer应该生效了pooler error: unsupported startup parameter: search_path 表示额外携带的参数内容有误这时候建议去自己的代码项目上检查一下datasource连接了 # 原始连接池
url: jdbc:postgresql://ip:端口/数据库?currentSchemapublicuseUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8stringtypeunspecified# 删除 currentSchemapublic添加prepareThreshold0
url: jdbc:postgresql://ip:端口/数据库?prepareThreshold0useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8stringtypeunspecified完成后重启开发环境连接继续去后台查看pgbouncer的实际log输出为如下表示正常 # /var/log/pgbouncer/pgbouncer.log
LOG listening on 0.0.0.0:6432
2023-02-27 13:59:45.696 CST [29731] LOG listening on [::]:6432
2023-02-27 13:59:45.696 CST [29731] LOG listening on unix:/tmp/.s.PGSQL.6432ERROR: No such user: postgres 表示进行登录到sql界面的账号不存在需要检查postgresql数据库是否有这个账号且是生效状态 psql: error: connection to server at “127.0.0.1”, port 6432 failed: FATAL: SASL authentication failed 表示进行登录到sql界面的账号密码错误需要检查postgresql数据库对应账号的真实密码
3.springboot连接pgbouncer
请先保证/etc/pgbouncer/pgbouncer.ini的listen_addr能够接到你的ip访问如果不清楚先给listen_addr *以后清楚了再调。
listen_addr *接着直接在springboot项目的yml文件中修改之前的连接池配置同时调整datasource配置如下
spring:datasource:# 例子jdbc:postgresql://192.168.100.10:6432/postgres?prepareThreshold0useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8stringtypeunspecifiedurl: jdbc:postgresql://pgbouncer-ip:pgbouncer端口/数据库?prepareThreshold0driverClassName: org.postgresql.Driverusername: postgrespgbouncer中数据库对应的用户名password: postgrespgbouncer中数据库对应的密码最后
本文仅提供关于pgbouncer相关介绍与问题处理方式为后续切换posgresql集群和双master方案做准备预计后续发布Bucardo与Slony-l的方案。