连接池PgBouncer部署与踩坑实践

news2025/1/19 11:08:19

安装

可以直接使用

  • yum install pgbouncer

安装(rpm管理的是1.14版本)

或者在http://www.pgbouncer.org/downloads/ 下载最新的tat.gz包

解压出来进入目录,通过

  • ./configure --prefix=/home/pgbouncer
  • make & make install

安装(官网最新为1.16版本)

依赖问题自行解决,这里不赘述。

建议通过yum安装,简单快捷,不用处理依赖问题。

通过yum安装成功后,会自动生成pgbouncer账户,为了后面的执行 需要进入 /etc/passwd 修改sbin/nologin 为 /bin/bash

服务部署位置建议:

  1. 如果只有单应用访问,建议PgBouncer部署在应用服务器上,减少应用服务器和pgbouncer之间的开销
  2. 如果有多应用访问,建议PgBouncer部署在数据库侧,减少pgbouncer和数据库之间的开销
  3. 也可以部署成多实例模式,针对读和写进行分别部署pgbouncer,因为pgbouncer本身只是数据库连接池,不具备负载均衡,或高可用,IP漂移等特性,需要结合其他成熟产品进行组合使用

Quick-start

1、创建或编辑/etc/pgbouncer/pgbouncer.ini文件,典型内容如下:

[databases]``themis = host=``127.0``.``0.1` `port=``5432` `dbname=themis``[pgbouncer]``logfile = 
/var/log/pgbouncer/pgbouncer.log``pidfile = /var/run/pgbouncer/pgbouncer.pid``listen_addr = *``listen_port = ``6688``auth_type = 
trust``auth_file = /etc/pgbouncer/userlist.txt``admin_users = admin``stats_users = admin``pool_mode = session``max_client_conn =
 ``100``default_pool_size = ``20``server_reset_query = RESET ALL; SET SESSION AUTHORIZATION DEFAULT

tips:

  • listen_addr:监听地址,表示哪些地址能访问这个pgbouncer服务,*表示所有
  • auth_type:一般选择trust或md5,前者明文存储密码,后者md5加密密码
  • auth_file:需要创建一个用户列表文件,只有在文件中的用户才允许访问连接池
  • admin_users:pgbouncer的管理员账号,需要在userlist.txt中存在
  • pool_mode:默认为会话池模式(Session pooling),还可以选择事务池(Transaction pooling)和语句池(Transaction pooling)
  • max_client_conn:连接池最多允许多少连接
  • default_pool_size:每一对数据库-用户允许多少连接
  • server_reset_query:当一个连接被返回给连接池时,它必须被重置为刚创建的连接的状态。在把一个连接返回给连接池之前,PgBouncer通过发出一个查询来实现这种重置。PG使用DISCARD ALL命令,不过GreenPlum不支持这个命令,使用示例中的命令来达到这个目的

模式比较:

img

2、创建userlist.txt文件,需要与pgbouncer.ini里的auth_file路径相对应

如果auth_type = trust,则内容为

"user_name" "password"

如果auth_type = md5,则内容为

"user_name" "md5 + MD5(<password><username>)"

可以通过查询GP的pg_catalog.pg_shadow视图获得,导出即可

pgbouncer也提供了一个mkauth.py工具,可以直接生成userlist文件,这里不详细描述了。

3、启动

pgbouncer -d /etc/pgbouncer/pgbouncer.ini

4、停止

可以直接kill进程来停止pgbouncer

cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9

也可以登陆pgbouncer后台数据库,执行shutdown来关闭

5、登陆数据库

通过连接池连接目标数据库

psql -h 192.168.4.11 -p 6688 -U admin xxx

连接pgbouncer数据库

psql -p 6688 -U cyadmin pgbouncer

配置项详解

配置文件分为[databases] 和 [pgbouncer]两部分,现在我们来详细讲解一下里面的配置。

[databases]部分的参数配置,都是以键值对的形式出现的,例如dbname、host、port、user、password,这几个参数都比较好理解。还有几个额外的配置我们接着看一下:

(1) pool_size 用来配置连接池的大小。连接池的含义上面说过,如果没有这个值则使用[pgbouncer]部分的default_pool_size的值。

(2)connect_query :后面跟一个SQL语句字符串,用于探测这个连接是否正常,如果执行SQL语句出错,则换一个连接。

(3)client_encoding:指定连接的客户端使用的字符集编码

(4)datestyle:指定日期类型

(5)timezone:指定时区。

[pgbouncer]部分的配置

这个部分的配置项比较多,主要分为下面几类:

  • 通用配置项

  • 日志配置项

  • 控制界面访问控制配置项

  • 连接健康检查和超时配置项

  • 危险的超时配置项

  • 底层网络配置项

通用配置

logfile 指定日志文件,默认值是/var/log/pgbouncer/pgbouncer.log

pidfile 指定pid文件位置,默认值是/var/run/pgbouncer/pgbouncer.pid

listen_addr 监听的地址,默认值是127.0.0.1,可以使用*号表示监听所有IP地址。

listen_port 监听的端口,默认值是6432

unix_socket_dir 指定unix socket文件的目录,默认为/tmp目录

unix_socket_mode 指定unix socket文件的权限,默认值为0777

unix_socket_group 指定unix socket文件的组,默认无

user 指定启动PgBouncer的用户名,windows系统不支持此设置

auth_type 认证的类型,默认是trust,其他值包括md5,crypt,plain,any,hba。用的较多的是md5

auth_file 认证文件的位置,默认值是/etc/pgbouncer/userlist.txt

pool_mode 指定池的模式,默认是session模式,还可以是transaction和statement

max_client_conn 允许的最大连接数

default_pool_size 默认的池大小,默认值20

min_pool_size 最小的池大小,每个连接池至少会向后端数据库保持多少个连接

reserve_pool_size 连接池的保留连接数

reserve_pool_timeout 保留连接的超时时间

server_round_robin 负载均衡的方式是否设置为“round robin”,默认为关闭,即后进先出

ignore_startup_parameters 默认情况PgBouncer只会跟踪一些默认参数,并且能检测这些参数的变化,保持这些参数和客户端的一致。在这个配置后面跟的配置后被PgBouncer忽略,不会被检查。

disable_pqexec 是否禁止简单查询协议,默认值为0。简单查询协议允许一个请求发送多个SQL,容易导致SQL注入攻击。

日志配置项:

syslog 是否打开syslog,windows下打开eventlog,默认值为0,表示不打开。

syslog_ident 默认为PgBouncer

syslog_facility

log_connections 是否记录连接成功的日志,默认值为1,表示记录

log_disconnections 是否记录断开连接的日志,默认值为1,表示记录

log_pooler_errors 连接池法网客户端的错误是否记录在日志中,默认值为1,表示记录

stats_period 把汇总的统计信息写入日志的时间周期,默认是60s

控制界面访问控制配置项:

admin_users 管理用户名,默认值是postgres

stats_users 允许连接到控制界面,查看连接池只读信息的用户列表。可以执行除“SHOW FDS”以外的其他“SHOW”命令

server_reset_query

server_check_delay 空闲的连接多长时间进行一次健康检测,判断连接是否可用。如果设置为0,则立即检测,默认值为30s

server_check_query,进行健康检查的SQL语句,如果为0,表示不检测,默认值为“select 1;”

server_lifetime 连接的存活时间,连接超过这个时间就会被关闭,默认为3600,设置为0表示只使用一次。

server_idle_timeout 连接的idle时间,超过此时间,连接会被关闭。默认为600

server_connect_timeout 后端数据库的login时间超过这个值就会被关闭。默认为15s

server_login_retry 传教到后端数据库的连接失败后,等多长时间后重试,默认为15s

client_login_timeout 客户端与PgBouncer建立连接后,如果无法在这段时间内完成登录,那么连接会断开,默认为60s

危险超时配置项

指的是为防止一些未知错误或者原因导致系统卡住的针对性配置。

query_timeout 允许超过该时间值的SQL会被断开,应该比SQL实际的执行时间稍长,也需要比数据库的statement_timeout参数值更大。为了应付一些未知的网络问题。默认为0.0,禁止使用

query_wait_timeout 请求在队列中等待被执行的最长时间,如果超过该时间还没有分配到连接,就会断开。默认为0,禁止使用。

client_idle_timeout 客户端连接空闲超过该时间,则断开连接。默认值为0,禁止使用

idle_transaction_timeout 客户端启动事务后,超过这个时间没有结束事务,则关闭这个客户端连接。默认值为0,禁止使用

底层网络连接配置

pkt_buf 用于网络包的内部缓冲区大小,会影响发出的TCP包的大小即内存的使用,默认值为2048,一般保持默认值

max_packet_size 通过PgBouncer最大的包大小,包可以是一个SQL,也可以是返回的结果,默认值是2147483647

listen_backlog TCP监听函数listen的Backlog参数,默认值为128

sbuf_loopcnt 处理过程中,每个连接处理多少数据就切换到下一个连接。默认为5,如果设置为0,表示不限制。不限制时,一个连接发送大量数据,另外的连接可能就会空闲,导致被结束掉。

tcp_defer_accept linux下,默认为45,其他平台为0。详细解释用man 7 tcp来查看

tcp_socket_buffer 默认没有设置

tcp_keepalive 是否以操作系统的默认值打开基本的keepalive 设置,在linux下,操作系统的keepalive里,默认值时tcp_keepidle=7200, tcp_keepintvl-75,tcp_keepcnt=9,其他操作系统类型,默认值为1

tcp_keepcnt 默认未设置

tcp_keepidle 默认未设置

tcp_keepintvl 默认未设置

连接测试

先上结论:

连接池机制在建立连接上,能节约30%的时间开销。

但如果连接建立后执行复杂sql,则主要的资源消耗在查询上,连接开销较小

sql越复杂,连接开销越可以忽略

测试方案一:连接建立后执行一次简单查询

循环建立连接1000次,连接池(会话池)能节省15.9%的时间开销

直连测试结束,结束时间:2021-10-11 20:17:02.339198,用时214秒
连接池测试结束,结束时间:2021-10-11 20:20:03.121827,用时180秒

测试了循环10000次,结论类似

测试方案二:只建立连接,马上断开

循环建立1000次,连接池(会话池)能节省32.1%的时间开销

直连测试结束,结束时间:2021-10-12 14:31:07.778456,用时53秒
连接池测试结束,结束时间:2021-10-12 14:31:43.784784,用时36秒

测试脚本:

import psycopg2
import datetime
 
def gp_direct():
        conn = psycopg2.connect(dbname = 'xxx',
                                user = 'xxx',
                                password = 'xxx',
                                host = '192.168.4.11',
                                port = '5432')
 
        cur = conn.cursor()
        s = """select * from dw.ods_active;"""
        cur.execute(s)
        cur.fetchall()
        cur.close()
        conn.close()
        return None
 
def gp_pool():
    conn = psycopg2.connect(dbname = 'xxx',
                            user = 'xxx',
                            password = 'xxx',
                            host = '192.168.4.11',
                            port = '6688')
 
    cur = conn.cursor()
    s = """select * from dw.ods_active;"""
    cur.execute(s)
    cur.fetchall()
    cur.close()
    conn.close()
    return None
 
n = 1000 # 测试连接次数
 
start_time = datetime.datetime.now()
print('直连测试开始,起始时间:',start_time)
for i in range(n):
    gpD = gp_direct()
    print('第{}次直接连接'.format(i + 1))
end_time = datetime.datetime.now()
ss = (end_time - start_time).seconds
print('直连测试结束,结束时间:{},用时{}秒'.format(end_time,ss))
print('-------------------------------------------------')
 
start_time = datetime.datetime.now()
print('连接池测试开始,起始时间:',start_time)
for i in range(n):
    gpP = gp_pool()
    print('第{}次连接池连接'.format(i + 1))
end_time = datetime.datetime.now()
ss = (end_time - start_time).seconds
print('连接池测试结束,结束时间:{},用时{}秒'.format(end_time,ss))
print('---------------------------------------------------')

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

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

相关文章

01等概率发生器、随机函数、对数器

1.数据结构 数据结构:是由连续结构、跳转结构或者连续加跳转(可能有多个叉)结构组成 数据结构是很多算法得以进行的载体 数组&#xff1a;便于寻址不便于删增数据&#xff08;需要不断移动数据&#xff0c;如果不动可能就不是连续结构&#xff09; 链表&#xff08;跳转结构…

jupyter notebook 暗黑模式新方法

1 直接浏览器采用暗黑模式 &#xff08;1&#xff09;首先我们打开谷歌浏览器&#xff0c;在浏览器地址栏中输入“chrome://flags”然后按下回车键。 &#xff08;2&#xff09;之后我们会进入谷歌浏览器的实验室页面&#xff0c;在页面左上方的搜索框中输入“enable-force-…

DocuWare客户案例——温德姆镇使用 DocuWare Cloud 改善市民服务

DocuWare客户案例——温德姆镇使用 DocuWare Cloud 改善市民服务 新冠疫情刚开始时&#xff0c;州和地方政府除了发挥传统作用以外&#xff0c;还要负责遏制疫情的关键措施。税收和联邦援助的收入没有增加&#xff0c;跟不上这一新职责的需求。采用减轻管理负担的技术是节省资源…

2022十大边缘计算开源项目

随着“开源”被纳入“十四五”规划发展纲要&#xff0c;“支持数字技术开源社区等创新联合体发展&#xff0c;完善开源知识产权和法律体系&#xff0c;鼓励企业开放软件源代码、硬件设计和应用服务”。开源发展按下了加速键&#xff01; 开源软件生态蓬勃发展&#xff0c;边缘…

Internet结构和ISP

目录 1. ISP / IXP / ICP 定义 2. 网络连接宏观结构 3. 网络连接层级结构 4. ISP 连接方式 1. ISP / IXP / ICP 定义 ISP&#xff1a;Internet Service Provider&#xff0c;即互联网服务提供商。主要为用户提供互联网接入业务、信息业务的运营商&#xff0c;如移动和电信等。 …

数据结构学习之栈

这里写目录标题栈的定义与性质栈的实现栈的定义栈的功能栈的创建入栈出栈栈顶判断栈为空得到栈的个数栈的销毁栈的定义与性质 第一个问题&#xff1a;什么是栈&#xff1f; 栈的定义是&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。…

【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】

通常为了使模型的预测精度达到较高的标准&#xff0c;需要收集十分庞大的数据集来进行模型训练。一种比较巧妙解决该问题的办法是应用迁移学习&#xff08;transfer learning&#xff09;&#xff0c;将从某个已有的数据集学到的知识迁移到目标数据集上。例如&#xff0c;假如我…

微信小程序安装 Vant 组件库与API Promise组件库并实现简单的增删改查

在项目内右键空白处选择在外部终端打开2、在终端窗口输入 npm init -y,创建package-lock.jsonnpm init -y3、在终端输入npm i vant/weapp1.3.3 -S --production&#xff0c;创建node_modules文件夹npm i vant/weapp1.3.3 -S --production4、详情&#xff0d;本地设置&#xff0…

Vue2.0开发之——Vue组件-组件的实例对象(36)

一 概述 浏览器无法直接解析Vue文件package.json中的’vue-template-compiler’将vue结尾的文件解析为js文件交给浏览器处理Count组件实例对象 二 浏览器无法直接解析Vue文件 将Vue文件拖放到浏览器中无法直接显示 三 package.json中的’vue-template-compiler’将vue结尾的文…

软件著作权登记指南

一、什么是计算机软件《计算机软件保护条例》第二条、第三条规定&#xff0c;本条例所称计算机软件&#xff08;以下简称软件&#xff09;&#xff0c;是指计算机程序及其有关文档&#xff1b;&#xff08;一&#xff09;计算机程序&#xff0c;是指为了得到某种结果而可以由计…

第13章 Token的Postman、Swagger和Vue调试

1 准备工作 1.1 WebApi.Controllers.JwtSettingModel namespace WebApi.Test { /// <summary> /// 【Jwt设置模型--纪录】 /// <remarks> /// 摘要&#xff1a; /// 通过该纪录中的属性成员实例存储“AppSettings.json”文件中的Jwt相关设置数据&#xff0…

java应用程序多级缓存架构

多级缓存架构 一级缓存&#xff1a;OpenResty—Lua—Redis 二级缓存&#xff1a;Nginx proxy-cache 三级缓存&#xff1a;Redis 使用OpenResty lua脚本访问redis proxy-cache 缓存注解 <!--依赖--> <dependency><groupId>org.springframework.boot</gr…

最新研究发现:天然海绵含有抑制Omicron变体感染的天然化合物

本文原文首发于2023年1月9日E-LIFESTYLE &#xff08;阅读时间4分钟&#xff09; 附标题&#xff1a;通过研究370多种来自植物、真菌和海绵等天然来源的化合物&#xff0c;寻找可用于治疗新冠肺炎的新抗病毒药物&#xff0c;用这些天然化合物制成的溶液中沐浴人类被SARS-CoV-2感…

SolidWorks装配体保存成零件,能有效压缩文件体积,方便二次装配

SolidWorks装配体保存成零件&#xff0c;能有效压缩文件体积&#xff0c;方便二次装配1. 先使用solidworks打开我们要转换成零件的装配体2. 然后点击上方保存下面的小三角&#xff0c;选择另存为3.之后选择要保存的位置&#xff0c;点击文件格式&#xff0c;然后在文件格式里找…

Zabbix监控服务详解+实战

目录 一、监控体系概述 1. 为什么需要监控 2. 监控目标与流程 &#xff08;1&#xff09;监控的目标 &#xff08;2&#xff09; 监控的流程 3. 监控的对象 &#xff08;1&#xff09;CPU监控 &#xff08;2&#xff09;磁盘监控 &#xff08;3&#xff09;内存监控 …

win7电脑怎么录屏?免费的录屏软件分享

现在大家的电脑一般是win10、11系统&#xff0c;但是还是有一些小伙伴喜欢使用win7系统的电脑。那你知道win7电脑怎么录屏吗&#xff1f;有没有好用且简单的win7电脑录屏软件推荐&#xff1f;当然有&#xff01;今天小编给使用win7电脑的小伙伴推荐两款简单且好用的电脑录屏软件…

各类字符串函数和内存函数的使用以及模拟(万字解析)

函数一.字符串函数(使用都需要包含string.h)1.求字符串长度—strlen2.长度不受限制的字符串函数1.strcpy-字符串拷贝2.strcat-追加字符串3.strcmp-字符串比较4.为什么长度不受限制3.长度受限制的字符串函数—strncopy,strncat,strncmp4.字符串查找1.strstr-判断是否为子字符串2…

Linux 文件句柄导致系统压力测试时出现错误率

最近&#xff0c;在对一个golang写的获取商品详情信息的接口做压力测试时&#xff0c;tps 单机可以达到1400多&#xff0c;但是发现每当压力测试开始2分钟多时就会出现502或504 错误&#xff0c;整体的错误率在0.5%左右。一开始是怀疑代码写的效率不高&#xff0c;是不是协程开…

【SAP Hana】SAP HANA SQL 进阶教程

SAP HANA SQL 进阶教程5、HANA SQL 进阶教程&#xff08;1&#xff09;Databases&#xff08;2&#xff09;User & Role&#xff08;3&#xff09;Schemas&#xff08;4&#xff09;Tables&#xff08;5&#xff09;Table Index&#xff08;6&#xff09;Table Partitions&…

于仕琪C/C++ 学习笔记

C函数指针有哪几类&#xff1f;函数指针、lambda、仿函数对象分别是什么&#xff1f;如何利用谓词对给定容器进行自定义排序&#xff1f;传递引用和传递值的区别&#xff1f;传递常引用和传递引用之间的区别&#xff1f;传递右值引用和传递引用之 间的区别&#xff1f;函数对象…