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客服。

相关推荐
.Shu.33 分钟前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚3 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队4 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光4 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12014 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色4 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_4 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4535 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇5 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql
杨云龙UP5 小时前
CentOS Linux 7 (Core)上部署Oracle 11g、19C RAC详细图文教程
数据库·oracle