springboot+pgbouncer+postgres数据库连接池集成方案及问题解决
期望通过每一次分享,让技术的门槛变低,落地更容易。 —— 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.ini====begin======
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgreslisten_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)/postgres@127.0.0.1:33082 closing because: password authentication failed (age=0s)
WARNING (nodb)/postgres@127.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 "host=127.0.0.1 dbname=postgres port=5432 user=postgres password=postgres"生成完毕后请检查一下自己在 /etc/pgbouncer目录下的userlist.txt文件,该文件包含你postgres所有的账号信息,请调整一下该文件的内容,主要是处理空引号的问题vi /etc/pgbouncer/userlist.txt# old "postgres" "SCRAM-SHA-256$4096:St3x1cVA+cTJDsiGEnqjoA==" "" # new "postgres" "SCRAM-SHA-256$4096:St3x1cVA+cTJDsiGEnqjoA=="最后请记得给该文件授权一下,避免后续缺权限无法使用。 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:St3x1cVA+cTJDsiGEnqjoA=="最后请记得给该文件授权一下,避免后续缺权限无法使用。 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.ini
-  ERROR could not open auth_file /etc/pgbouncer/userlist.txt: Permission denied 
 说明当前pgbouncer的用户文件是没有权限读取的,请设置权限chmod -R 755 /etc/pgbouncer/userlist.txt
-  FATAL unix socket is in use, cannot continue 
 说明pgbouncer重复启动了,需要关闭之前启动的(就算启动失败了),完成后再次启动# 查找进程 ps -ef |grep pg# 找到正在启动的进程然后删除掉 kill -9 pid# 上述不可用也能使用此方式 kill `cat /var/run/pgbouncer/pgbouncer.pid`
-  closing because: unsupported startup parameter: extra_float_digits=2 
 表示当前用户连接到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:端口/数据库?currentSchema=public&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&stringtype=unspecified# 删除 currentSchema=public,添加prepareThreshold=0 url: jdbc:postgresql://ip:端口/数据库?prepareThreshold=0&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&stringtype=unspecified完成后重启开发环境连接,继续去后台查看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.6432
-  ERROR: 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?prepareThreshold=0&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&stringtype=unspecifiedurl: jdbc:postgresql://pgbouncer-ip:pgbouncer端口/数据库?prepareThreshold=0driverClassName: org.postgresql.Driverusername: postgres(pgbouncer中数据库对应的用户名)password: postgres(pgbouncer中数据库对应的密码)
最后
本文仅提供关于pgbouncer相关介绍与问题处理方式,为后续切换posgresql集群和双master方案做准备,预计后续发布Bucardo与Slony-l的方案。
相关文章:
 
springboot+pgbouncer+postgres数据库连接池集成方案及问题解决
期望通过每一次分享,让技术的门槛变低,落地更容易。 —— around 前言 旨在解决微服务项目全是连接池并影响数据库并发连接,作者的环境是基于sprongboot微服务连接postgres数据库,每个微服务的DAO层配置都使用了连接池技术。后续…...
 
Mysql 常用日期处理函数
Mysql 常用日期处理函数 1 建表语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int(4) NOT NULL,ENAME varchar(10…...
Pod中容器的健康检查
健康检查 上篇文章中我们了解了Pod中容器的生命周期的两个钩子函数,PostStart与PreStop,其中PostStart是在容器创建后立即执行的,而PreStop这个钩子函数则是在容器终止之前执行的。除了上面这两个钩子函数以外,还有一项配置会影响…...
 
信贷系统学习总结(5)—— 简单的风控示例(含代码)
一、背景1.为什么要做风控?目前我们业务有使用到非常多的AI能力,如ocr识别、语音测评等,这些能力往往都比较费钱或者费资源,所以在产品层面也希望我们对用户的能力使用次数做一定的限制,因此风控是必须的!2.为什么要自己写风控?那么多开源的风控组件,为什么还要写呢?是不是想…...
 
Java知识复习(四)多线程、并发编程
1、进程、线程和程序 进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的;在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程…...
 
一个9个月测试经验的人,居然在面试时跟我要18K,我都被他吓到了····
2月初我入职了深圳某家创业公司,刚入职还是很兴奋的,到公司一看我傻了,公司除了我一个测试,公司的开发人员就只有3个前端2个后端还有2个UI,在粗略了解公司的业务后才发现是一个从零开始的项目,目前啥都没有…...
 
zigbee与WIFI同频干扰问题
zigbee与WIFI同频干扰 为了降低Wifi信道与Zigbee信道的同频干扰问题,Zigbee联盟在《Zigbee Home Automation Public Application Profile》中推荐使用11,14,15,19,20,24,25这七个信道。 为什么呢,我们看一下Wifi和Zigbee的信道分布。 WiFi带宽对干扰的…...
 
git拉取指定的单个或多个文件或文件夹
直接上步骤 初始化仓库 git init拉取远程仓库信息,省略号为仓库地址 git remote add -f origin http://****.git开启 sparse clone git config core.sparsecheckout true配置需要拉取的文件夹 有一个指定一个,有多个指定多个,路径写对即可&a…...
 
不是,到底有多少种图片懒加载方式?
一、也是我最开始了解到的 js方法,利用滚动事件,判断当时的图片位置是否在可视框内,然后进行渲染。 弊端:代码冗杂,你还要去监听页面的滚动事件,这本身就是一个不建议监听的事件,即便是我们做了…...
 
CAD坐标有哪些输入方式?来看看这些CAD坐标输入方式!
在CAD设计过程中,有时需要通过已知坐标点来画图,有时又需要通过已知角度和距离来画图,在这种情况下,由于已知条件不同,所以便需要用不同的方式来定位点。那么,你知道CAD坐标有哪些输入方式吗?本…...
 
铰链、弹簧,特殊的物理关节
title: 铰链、弹簧,特殊的物理关节 date: 2023-02-28T13:32:57Z lastmod: 2023-02-28T14:24:06Z 铰链关节(Hinge Join)组件 组件-Physics-Hinge Join Anchor 当物体挂载铰链组件以后,组件下Anchor等同于边长为1的立方体。当这…...
 
Android Studio相关记录
目录Android Studio 便捷插件Android LogcatJava文件的类头模板Android Studio 使用遇到的问题解决方案org.jetbrains.annotations.NullableBuild 控制台编译输出中文乱码Terminal 使用 git 命令窗口git 命令窗口中文乱码Android Studio 便捷插件 Android Logcat 配置路径 Fi…...
 
Linux 基础介绍-基础命令
文章目录01 学习目标02 Linux/Unix 操作系统简介2.1 Linux 操作系统的目标2.2 Linux 操作系统的作用2.3 Unix 家族历史2.4 Linux 家族历史2.5 Linux 和Unix 的联系2.6 Linux 内核介绍2.7 Linux 发行版本2.8 Unix/Linux 开发应用领域介绍03 Linux 目录结构3.1 Win 和Linux 文件系…...
 
Linux 进程:程序地址空间 与 虚拟内存
目录一、程序地址空间二、虚拟地址空间1.虚拟内存的原理2.使用虚拟内存的原因?3.如何实现虚拟空间?4.使用虚拟内存的好处本文主要介绍程序地址空间和虚拟地址空间的概念,理解了虚拟地址空间,才可以更好的理解物理内存和进程pcb之间…...
python 密码学编程
最近在看一本书。名字是 python密码学编程。在此做一些笔记,同时也为有需要的人提供一些参考。 ******************************************************************** * quote : "http://inventwithpython.com/" …...
 
【C++ | bug | 运算符重载】定义矩阵(模板)类时,使用 “友元函数” 进行 * 运算符重载时编译报错
作者:非妃是公主 专栏:《C》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐一、类的声明及函数定义二、错误信息三、问题…...
数学小课堂:无穷小(以动态的眼光看待世界,理解无限的世界)
文章目录 引言I 芝诺四个著名的悖论1.1 二分法悖论:从A点到B点是不可能的。1.2 阿喀琉斯悖论:阿喀琉斯追不上乌龟。1.3 飞箭不动悖论:射出去的箭是静止的。1.4 基本空间和相对运动悖论II 回答芝诺的悖论2.1 阿喀琉斯悖论2.2 相对运动悖论III 无穷小3.1 无穷小的定义3.1 无穷…...
 
leetcode 427. Construct Quad Tree(构建四叉树)
刚看到题的时候是懵的,这也太长了。到底是要表达什么呢。 不妨把这个矩阵看成一个正方形的图片,想象你在处理图片,从整体逐步到局部。 刚开始看一整张图片,如果是全0或全1,这个就是叶子节点,怎么表达叶子节…...
 
Spring Boot 3.0系列【2】部署篇之使用GraalVM构建原生镜像
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本2.7.0 文章目录概述JIT & AOTJIT (动态编译)AOT(静态编译)GraalVM简介运行模式Native Image(原生镜像)…...
 
复习知识点十之方法的重载
目录 方法的重载 练习1: 练习1: 数组遍历 练习2: 数组的最大值 练习3: 练习4: 复制数组 基本数据类型和引用数据类型 方法的重载 Java虚拟机会通过参数的不同来区分同名的方法 练习1: public class Test4 {public static void main(String[] args) {//调用方法 // …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
 
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
 
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
 
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
 
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
 
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
