postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
第35讲:中间件PgBouncer部署
11月25日(周六)19:30-20:30,往期公开课的文档及视频,联系CUUG
内容1 : PgBouncer 简介
内容2 : PgBouncer 安装
内容3 : PgBouncer 启动与关闭
内容4 : 通过PgBouncer 连接到数据库
PgBouncer简介
· PgBouncer 是 PostgreSQL的轻量的连接池,支持三种模式
->Session pooling/会话连接池
最礼貌的方法。在客户端连接的时候,在它的连接生命期内,会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会放回到连接池中。
->Transaction pooling/事务连接池
服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务器将会放回连接池中。这是一个 hack,因为它打破了应用对后端连接的看法。只有在应用配合这样的使用模式,没有使用会破坏这种使用模式的时候才能用这个连接方式。
->Statement pooling/语句连接池 最激进的模式。这是事务连接池的一个扭曲的变种 - 不允许多语句的事务。这就意味着是在客户端强制 “autocomit”模式,主要是给 PL/Proxy 用的。
· PgBouncer 特点
内存需求低(缺省的时候每个连接 2k)。
它不是和单个后端服务器绑定的,目标数据库可以位于不同的主机上。
对大多数设置,都支持在线的重新配置,无需重启。
支持在线的重启/升级,而不会退出客户端的连接。
应用程序如果直接与PostgreSQL连接,每次连接pg都会克隆出一个服务进程来为应用程序提供服务,关闭连接后pg会自动将服务进程给停掉.频繁的创建和销毁进程,会消耗比较多的系统资源,pgbouncer会将与pg的连接缓存住,当有请求进来,只是分配一个空闲的连接,这样降低了系统资源的消耗。
使用pgbouncer可以控制住数据库上的活动连接,一般配置为CPU核数的1.5-2.5倍之间。
pgbouncer使用libevent进行socket通信,效率很高。
PgBouncer部署
· Pgbouncer 安装
1、安装libevent(root用户):
/soft/libevent-2.1.12-stable
./configure --prefix=/usr/local/libevent
make
makeinstall
2、安装pgbouncer (postgres用户)
export PKG_CONFIG_PATH=/usr/local/libevent/lib/pkgconfig
cd /soft/pgbouncer-1.17.0
./configure --prefix=/usr/local/pgbouncer
make && make install
· Pgbouncer 配置
1、创建/usr/local/pgbouncer/conf目录,把pgbouncer.ini文件放在此目录下
2、复制模板文件
cp /usr/local/pgbouncer/share/doc/pgbouncer/pgbouncer.ini /usr/local/pgbouncer/conf/pgbouncer.ini
3、编辑pgbouncer.ini文件
logfile = /var/log/pgbouncer/pgbouncer.log #目录需要root用户创建,然后授权
pidfile = /var/run/pgbouncer/pgbouncer.pid #目录需要root用户创建,然后授权
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = hr
编辑/etc/pgbouncer/userlist.txt文件
该文件包含将来通过中间件连接到数据库的用户名和密码,登录时需要用它来验证,如果修改,需要重启pgbouncer生效。
1)、先查询密码:
select usename, passwd from pg_shadow order by 1;
2)、编辑userlist.txt
"hr" "md5e661e439b4757f4595b811b4a196182d"
"postgres" "md53175bce1d3201d16594cebf9d7eb3f9d“
"c1" "md574fc5f6f852574d24cbca8153258784c"
Pgbouncer 启动与关闭
· 启动pgbouncer
/usr/local/pgbouncer/bin/pgbouncer -d /usr/local/pgbouncer/conf/pgbouncer.ini
· 关闭pgbouncer
目前pgbouncer还没有自主停止的脚本或者命令,只能通过kill命令来停止。格式是:
cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9
· 重启pgbouncer
/usr/local/pgbouncer/bin/pgbouncer -R -d /usr/local/pgbouncer/conf/pgbouncer.ini
参数:
-d :后台运行
-R :重启进程
Pgbouncer 连接
· 登录pgbouncer
pgbouncer对外提供了一个虚拟数据库pgbouncer,之所以成为虚拟数据库,是因为它可以提供像PostgreSQL那样的数据库操作界面,但是这个数据库却并不是真实存在的。而是pgbouncer虚拟出来的一个命令行界面。
$ psql -p 6432 -d pgbouncer -U postgres
帮助命令,用show命令查看当前的配置
Show help;
pgbouncer.ini配置文件详解
· 配置主要分为两部分:
第一部分是[databases]区域,是用来配置数据库连接相关信息的。
第二部分是[pgbouncer],是pgbouncer自身的配置。
· [databases]部分的配置
它的基本格式是:
对外提供的数据库名 = host=主机IP port=端口 user=用户 password=密码
其他的规则都类似,数据库名后面的等号旁边要有空格隔开,后面每个成对的数值之间用空格隔开。这里面的主机和端口指的是PostgreSQL监听的地址和端口,而用户和密码就是用来连接PostgreSQL数据库的用户名和密码。
testdb = host=127.0.0.1 port=1922 user=hr password=hr connect_query='SELECT 1 '
pool_size 用来配置连接池的大小。如果没有这个值则使用[pgbouncer]部分的default_pool_size的值。
connect_query :后面跟一个SQL语句字符串,用于探测这个连接是否正常,如果执行SQL语句出错,则换一个连接。
client_encoding:指定连接的客户端使用的字符集编码
datestyle:指定日期类型
timezone:指定时区。
· 使用中间件来连接到testdb数据库
$ psql -p 6432 -d testdb -U hr
-p :指定pgbouncer监听的端口
-d :指定在配置文件中声明的数据库,如果要切换到其它数据库,则需要在配置文件中声明。
· [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。用得较多的是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:保留连接的超时时间
· 日志配置项:
syslog:是否打开syslog,windows下打开eventlog,默认值为0,表示不打开。
syslog_ident:默认为PgBouncer
syslog_facility
log_connections:是否记录连接成功的日志,默认值为1,表示记录
log_disconnection:是否记录断开连接的日志,默认值为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。tcp_socket_buffer 默认没有设置。
tcp_keepalive:是否以操作系统的默认值打开基本的keepalive 设置,在linux下,操作系统的keepalive里,默认值是tcp_keepidle=7200, tcp_keepintvl-75,tcp_keepcnt=9,其他操作系统类型,默认值为1
tcp_keepcnt:默认未设置。
tcp_keepidle:默认未设置。
tcp_keepintvl:默认未设置。
CUUG PostgreSQL技术大讲堂系列公开课,往期视频及文档,请联系CUUG客服。
相关文章:

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…...

因为jsp for循环的一个空格引起的错误
<c:forEach items"${user.role} " var"role"> <c:forEach items"${user.role}" var"role"> 去掉空格正确显示 ,为此排查了2个小时代码逻辑...

文件中找TopK问题
目录 1.解题思路2.创建一个文件并在文件中写入数据3.为什么要建立小堆而不建立大堆?4.如何在现有的数据中建立适合的大堆?5.代码实现 1.解题思路 TopK问题即是在众多数据中找出前K大的值,则可以根据堆的性质来实现,但在使用堆之前…...

React 入门使用 (官方文档向 Part2)
文章目录 用 State 响应输入声明式地考虑 UI步骤 1:定位组件中不同的视图状态步骤 2:确定是什么触发了这些状态的改变步骤 3:通过 useState 表示内存中的 state步骤 4:删除任何不必要的 state 变量步骤 5:连接事件处理…...
vue运用之el-cascader组件
前言 el-cascader 是 Element UI 的级联选择器组件。以下是一些常见的 el-cascader 问题以及对应的案例代码。 1. 如何使用 el-cascader 创建一个级联选择器 以下是一个简单的 el-cascader 示例: <template> <el-cascader v-model="selected" :option…...

layui提示框没有渲染bug解决
bug:使用layui时或许是依赖导入又或是ideal和浏览器缓存问题导致前面明明正常的页面显示,后面出现提示框没有css样式,弹出框没有背景css 效果如下 解决后 解决方法 在你的代码中引入layer.js 我这是jsp页面 <script type"text/jav…...
MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(MODBUSTCP通信)
MATLAB和SMART 200PLC的联合仿真请查看下面文章链接 MATLAB Simulink和SMART PLC水箱液位高度PID控制(联合仿真)-CSDN博客文章浏览阅读606次。SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-CSDN博客文章浏览阅…...

QT 项目中添加文件夹(分类文件)
为了更方便的整理项目的文件,添加文件夹把文件进行分类。 1.首先在项目文件中创建新的文件夹 2.把需要归类的文件放入新建的文件中 3.右键然后选择add..... 4.运行此程序,会报错因为文件路径改变了,需要在.pro中修改路径 注意事项 文件夹内部…...
vue3 语音播报流程
npm 安装 "speak-tts": "^2.0.8", npm install speak-tts 在vue文件中引用 import Speech from "speak-tts"; const speech ref(null);onMounted(() > {speechInit(); });//语音播报初始化 const speechInit () > {speech.value ne…...

Linux MTR(My TraceRoute)command
Internet上有许多小型网络测试工具:Ping、Traceroute、Dig、Host等。 但是,这些工具的功能都比较单一。今天会给大家分享一个包含ping和traceroute功能的工具:MTR 文章目录 什么是MTR?MTR可以提供哪些功能Linux MTR可用选项Linux MTR用法推荐…...
第十一章 python基础之api
Python基础、函数、模块、面向对象、网络和并发编程、数据库和缓存、 前端、django、Flask、tornado、api、git、爬虫、算法和数据结构、Linux、设计题、客观题、其他 第十一章 api 1. 什么是webservice? Web服务(Web Services)是一种通过网…...

redis运维(十六) 有序集合
一 有序集合 把握一点: 各种redis 命令都提供各种语言对应的API 接口,后续API是关键 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性3、但是不同的是,有序集合给每个元素多设置…...
深入理解RC4加密算法
RC4(Rivest Cipher 4)是一种广泛应用的加密算法,由Ronald L. Rivest于1987年发明。它是一种流密码(stream cipher)算法,适用于对网络通信中的数据进行加密保护。 RC4加密解密 -- 一个覆盖广泛主题工具的高…...
sql24(Leetcode1141查询近30天活跃用户数)
代码: # Write your MySQL query statement belowselect v.activity_date as day, count(distinct(v.user_id)) as active_users from(select user_id,activity_datefrom Activitywhere activity_date between 2019-06-28 and 2019-07-27 ) as v group by v.activi…...

python爬取robomaster论坛数据,作为后端数据
一. 内容简介 python爬取robomaster论坛数据,作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…...

C++: string的模拟实现
C: string的模拟实现 一.前置说明1.模拟实现string容器的目的2.我们要实现的大致框架 二.默认成员函数1.构造函数2.拷贝构造函数1.传统写法2.现代写法 3.析构函数4.赋值运算符重载1.传统写法2.现代写法 三.遍历和访问1.operator[]运算符重载2.iterator迭代器 四.容量相关函数1.…...

[安洵杯 2019]easy_web
打开环境 img传参还有cmd img应该是base,先解码看看 3535352e706e67 这个好像是十六进制的,再解 访问一下看看,得到一张图片 尝试base解码,但是没有什么发现 再看看地址栏出现index.php,应该是要下载源码,但是还没有…...
CentOS7 安装配置SFTP服务器详解
1、SFTP简介 SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secret File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP或字母缩写:SFTP)是一种数据流连接,提供文件访问、传输和管理功能的...

【Linux】Shell命令以及运行原理
目录 一、Linux是什么 二、Shell 三、为什么要有Shell 四、Shell的工作原理 一、Linux是什么 狭义上的Linux是指Linux内核本身,它是操作系统的核心部分,负责管理计算机的硬件资源(如处理器、内存、设备等),提供基…...
vue-动态组件、keep-alive
vue-动态组件、keep-alive 如果我们想写一个tabbar导航栏,我能想到的两种方式 通过if条件判断的方式实现(不赘述)动态组件 接下来我们就看看动态组件如何创建,废话不多少直接上代码(代码中有备注) 首先…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...