合 在GreenPlum中使用PgBouncer连接池
Tags: GreenPlum整理自网络整理自官网Pgbouncer连接池
- 概述
- 迁移PgBouncer
- 配置PgBouncer
- PgBouncer授权文件格式
- 为PgBouncer配置基于HBA的授权
- 启动PgBouncer
- 管理PgBouncer
- 映射PgBouncer客户端到Greenplum数据库服务器连接
- 概要
- 描述
- [databases]小节
- 数据库连接参数
- 连接池配置
- [pgbouncer]小节
- 一般设置
- 日志设置
- 控制台访问控制
- C连接健康检查、超时
- TLS设置
- 危险超时
- 低层网络设置
- [users]小节
- 示例配置文件
- 另见
- 概要
- 描述
- 选项
- 概要
- 描述
- 选项
- 命令行语法
- 管理命令
- SHOW命令
- ACTIVE_SOCKETS
- CLIENTS
- CONFIG
- DATABASES
- DNS_HOSTS
- DNS_ZONES
- FDS
- LISTS
- MEM
- POOLS
- SERVERS
- STATS
- STATS_AVERAGES
- STATS_TOTALS
- USERS
- VERSION
使用PgBouncer连接池
PgBouncer工具可以管理PostgreSQL和Greenplum数据库连接的连接池。
在Greenplum数据库中使用pgBouncer作为连接池管理器是有益的,尤其是在高并发的场景下。pgBouncer作为一个轻量级的数据库连接池管理器,它可以有效减少数据库服务器建立和销毁连接的开销,提高系统性能和稳定性。
以下是在Greenplum中使用pgBouncer的一些好处:
- 连接复用:pgBouncer能够维持少量的持久连接,并让多个客户端请求共享这些连接,从而避免了频繁创建和销毁连接的开销。
- 资源管理:通过限制并发连接数,可以有效地管理Greenplum数据库的资源,防止因连接数过多而导致的资源耗尽问题。
- 性能提升:减少TCP连接的建立和销毁次数,可以减少网络开销和内存管理的负担,提高数据库的整体响应速度。
- 稳定性增强:通过连接池,pgBouncer能够更好地处理短连接请求,避免因为连接数过多而引起的数据库崩溃风险。
- 安全性:pgBouncer支持SSL加密连接,增强了数据传输过程中的安全性。
- 易用性:pgBouncer配置相对简单,易于集成到现有的部署和监控体系中。
以下话题描述了如何在Greenplum数据库上配置PgBouncer。 更多有关如何在PostgreSQL上使用PgBouncer的信息,请参考 PgBouncer网站 。
Parent topic: 访问数据库
概述
数据库连接池是一种数据库连接的缓存。一旦一个池子的连接被建立,连接池就能消除创建 数据库连接的开销,这样客户端能更快地连接并且服务器的负载也能被降低。
PgBouncer连接池来自于PostgreSQL社区,它被包括在Greenplum数据库中。PgBouncer 可以为多个数据库管理连接池,并且这些数据库可以位于不同的Greenplum数据库集群或者 PostgreSQL后端。PgBouncer会为每一种数据库用户与数据库的组合建立一个池。一个被 池化的连接只能被来自于同一个用户和数据库的另一个连接请求重用。当客户端断开连接后, PgBouncer会将连接归还给连接池以做下次重用。
PgBouncer有三种池模式来共享连接:
- 会话池化 – 当一个客户端连接时,只要它保持连接状态,就分配给它一个连接。 当该客户端断开连接时,该连接才被放回到池中。
- 事务池化 – 在一个事务运行期间,分配一个连接给客户端。当PgBouncer发现 事务完成,该连接就被放回到池中。这种模式只能被用于不使用依赖于会话的特性的应用。
- 语句池化 – 语句池化类似于事务池化,但是不允许多语句事务。这种模式的 目标是为了在客户端强制自动提交模式,且它的定位是PostgreSQL上的PL/Proxy。
gpbouncer有三种连接方式:
Session pooling/会话连接池
最普通的方式,在客户端连接的时候,在它的连接生命期内,会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会放回到连接池中。
Transaction pooling/事务连接池
服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务器将会放回连接池中。这是一个 hack,因为它打破了应用对后段连接的看法。只有在应用配合这样的使用模式,没有使用会破坏这种使用模式的时候才能用这个连接方式。
Statement pooling/语句连接池
最激进的模式。这是事务连接池的一个扭曲的变种 - 不允许多语句的事务。这就意味着是在客户端强制“autocomit”模式,主要是给 PL/Proxy 用的。
可以为PgBouncer设置一种默认的池模式,并且该模式可以被单个数据库和用户覆盖。
通过连接到一个虚拟的pgbouncer数据库,用户可以使用类SQL命令监控和管理PgBouncer。 可以不重启PgBouncer就修改配置参数,只需要重新载入配置文件就能发现更改。 PgBouncer支持PostgreSQL和Greenplum数据库上的标准连接接口。Greenplum数据库客户端应用 (例如psql)可以连接到正在运行的PgBouncer主机和端口号,而不是 Greenplum的Master主机和端口号。
PgBouncer有一个类psql的管理控制台界面。授权用户可以通过该控制台 连接到一个虚拟数据库来监控和管理PgBouncer。您可以通过管理控制台来管理PgBouncer后台进程, 也可以用控制台在运行时更新和重载PgBouncer配置,而不停止和重启PgBouncer进程。
PgBouncer原生支持TLS。
迁移PgBouncer
当您迁移到一套新版本的Greenplum数据库时,必须迁移PgBouncer实例到新版本的Greenplum 数据库。
如果您正在迁移Greenplum 5.8.x版本数据库或更早版本,可以在不丢弃连接的 情况下迁移PgBouncer。采用带有-R选项和配置文件的命令拉起新的PgBouncer 进程。
1$ pgbouncer -R -d pgbouncer.ini-R(重启)选项启动新进程以Unix套接字的方式连接到旧进程并发出以下命令:
123SUSPEND;SHOW FDS;SHUTDOWN;当新进程检测到旧进程完成后,它接管旧连接的工作。最可能的原因是SHOW FDS 命令将实际的文件定位符发送新进程。如果事务因任何原因失败,新进程会被杀掉,旧进程仍然接管 原来的工作。
如果您正在迁移Greenplum 5.9.0版本数据库或更高版本,您必须关闭旧版本安装文件中 的PgBouncer实例,在新数据库安装文件中重新配置并启动PgBouncer实例。
如果您采用stunnel加密旧安装文件的PgBouncer连接,在新环境中必须使用与PgBouncer 1.8.1 及更新版本适配的内建TLS配置SSL/TLS。
如果您在旧环境中使用了LDAP授权,在新环境中必须使用与PgBouncer 1.8.1及更新版本适配的 内建集成PAM配置LDAP。必须移除或替换auth_file中所有 以ldap://开头的密码串。
配置PgBouncer
通过配置文件配置PgBouncer和它到Greenplum数据库的访问。配置文件通常命名为pgbouncer.ini, 提供Greenplum数据库的位置信息。pgbouncer.ini文件也指定PgBouncer的进程、连接池、 授权用户和授权配置。
pgbouncer.ini配置文件示例内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 | [databases] postgres = host=127.0.0.1 port=5432 dbname=postgres pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb [pgbouncer] pool_mode = session listen_port = 6432 listen_addr = 127.0.0.1 auth_type = md5 auth_file = users.txt logfile = pgbouncer.log pidfile = pgbouncer.pid admin_users = gpadmin |
有关PgBouncer配置文件格式和其支持的配置参数列表等信息信息,请见 pgbouncer.ini参考页面。
当客户端连接到PgBouncer时,连接池从pgbouncer.ini配置文件中查找 受访数据库(可能是实际数据库的别名)对应的主机名、端口号和数据库名。该配置文件也定义数据库的 授权模式。
PgBouncer要求有一个授权文件,该文件是一个包含Greenplum数据库用户名和密码的文本文件。 文件内容与pgbouncer.ini中配置的auth_type 授权类型密切相关。密码可能是干净文本或MD5编码的字符串。用户也可以配置PgBouncer通过 查询目标数据库来获取授权文件中未定义的密码信息。
PgBouncer授权文件格式
PgBouncer有自己的用户授权文件。用户可以在pgbouncer.ini配置文件 的auth_file属性中定义文件名。auth_file文本文件 格式如下:
1 2 | "username1" "password" ... "username2" "md5abcdef012342345" ... |
auth_file为每个用户占用一行。每行至少有两个域,两个都用双引号包裹 (” “)。第一部分定义Greenplum数据库用户名,第二部分为明文或 MD5编码的密码。PgBouncer忽略改行余下的部分。
(auth_file文件格式与Greenplum数据库所用的授权信息文件 pg_auth相似。PgBouncer可以直接使用Greenplum数据库授权文件。)
使用MD5编码的密码,密码格式如下:
1 | "md5" + MD5_encoded(<password><username>) |
可以从pg_shadow视图中获取所有Greenplum数据库用户的MD5编码密码。
为PgBouncer配置基于HBA的授权
PgBouncer支持基于HBA的授权。要为PgBouncer配置基于HBA的授权,在pgbouncer.ini 配置文件中设置auth_type=hba,并在pgbouncer.ini文件中配置 HBA格式文件参数auth_hba_file。
名称为hba_bouncer.conf的PgBouncer HBA文件的内容如下:
1 2 | local all bouncer trust host all bouncer 127.0.0.1/32 trust |
相关pgbouncer.ini配置文件中的对应配置部分:
1 2 3 4 5 6 7 8 9 10 | [databases] p0 = port=15432 host=127.0.0.1 dbname=p0 user=bouncer pool_size=2 p1 = port=15432 host=127.0.0.1 dbname=p1 user=bouncer ... [pgbouncer] ... auth_type = hba auth_file = userlist.txt auth_hba_file = hba_bouncer.conf ... |
有关PgBouncer支持的HBA授权文件格式的详细讨论,请参考HBA file format 。
启动PgBouncer
用户可以在Greenplum数据库master主机或其他服务器上运行PgBouncer。如果在一台单独的服务器上 安装PgBouncer,用户可以使用PgBouncer管理客户端,通过更新PgBouncer配置文件和重载配置很容易的 切换客户端连接到standby master。
参考以下配置设置PgBouncer。
创建PgBouncer配置文件。例如,增加以下文本到文件pgbouncer.ini中:
123456789101112[databases]postgres = host=127.0.0.1 port=5432 dbname=postgrespgb_mydb = host=127.0.0.1 port=5432 dbname=mydb[pgbouncer]pool_mode = sessionlisten_port = 6432listen_addr = 127.0.0.1auth_type = md5auth_file = users.txtlogfile = pgbouncer.logpidfile = pgbouncer.pidadmin_users = gpadmin该文件列出了数据库和它们连接的详细信息。该文件也配置了PgBouncer实例。 有关PgBouncer配置文件内容和格式的详细信息,请参考 Refer to the pgbouncer.ini参考页面。
创建授权文件。文件名应该和pgbouncer.ini文件中定义的auth_file 参数名字一样,users.txt。每行包含一个用户名和一个密码。密码的格式应该匹配PgBouncer 配置文件中定义的auth_type。如果auth_type参数为plain, 密码串应该为干净的文本文件密码,例如:
1"gpadmin" "gpadmin1234"。
如果auth_type如下面例子中为md5,授权部分必须是MD5编码格式。 MD5编码的密码格式如下:
1"md5" + MD5_encoded(<password><username>)开始启动 pgbouncer:
1$ $GPHOME/bin/pgbouncer -d pgbouncer.ini-d选项代表以后台进程的形式运行PgBouncer。pgbouncer命令的 语法和选项,请见pgbouncer参考页面。
更新客户应用连接到pgbouncer,以代替直接连接到Greenplum数据库服务器。例如, 连接到上面配置的Greenplum数据库mydb,像如下方式一样运行psql:
1$ psql -p 6432 -U someuser pgb_mydb-p选项的值代表用户配置的PgBouncer实例的listen_port端口号。
管理PgBouncer
PgBouncer提供一个类psql的管理控制台,可以通过指定PgBouncer端口号 和虚拟数据库名称pgbouncer来登录到PgBouncer管理控制台。 该控制台接受类SQL命令,这些命令允许用户监控、重新配置和管理PgBouncer。
有关PgBouncer管理控制台命令的完整文档,请参考 PgBouncer管理控制台命令参考。
要开始使用PgBouncer管理控制台,请遵循下列步骤。
用psql登录到pgbouncer虚拟数据库:
1$ psql -p 6432 -U username pgbouncerusername必须是pgbouncer.ini配置文件中 admin_users参数中所设置的值。 如果pgbouncer进程运行在用户登录的当前Unix用户的UID下,用户还可以用该用户名登录。
要看PgBouncer管理控制台命令,运行SHOW help命令:
12345678910111213141516pgbouncer=# SHOW help;NOTICE: Console usageDETAIL:SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSIONSHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEMSHOW DNS_HOSTS|DNS_ZONESSHOW STATS|STATS_TOTALS|STATS_AVERAGESSET key = argRELOADPAUSE [<db>]RESUME [<db>]DISABLE <db>ENABLE <db>KILL <db>SUSPENDSHUTDOWN如果用户对PgBouncer配置文件pgbouncer.ini做了修改, 用户可以用RELOAD命令重载它:
1pgbouncer=# RELOAD;
映射PgBouncer客户端到Greenplum数据库服务器连接
要映射PgBouncer客户端到Greenplum数据库服务器连接,可以使用PgBouncer管理控制台 命令SHOW CLIENTS和SHOW SERVERS:
- 使用ptr和link把本地客户端连接映射到服务器连接。
- 使用客户端连接的addr和port标识来自客户端的TCP连接。
- 使用local_addr和local_port标识到服务器的TCP连接。
pgbouncer.ini
PgBouncer的配置文件。
官网:http://www.pgbouncer.org/config.html
概要
1 2 3 4 5 6 | [databases] db = ... [pgbouncer]... [users]... |
描述
可以在配置文件pgbouncer.ini中指定PgBouncer配置参数并指定用户相关的配置参数。
PgBouncer的配置文件(通常是pgbouncer.ini)是.ini格式。 .ini格式的文件通常由小节、参数和参数值组成。小节名称封闭在方括号中, 例如,[section_name]。参数和值通常以 key\=value的方式展示。 以”;”或”#”开头的行被注释或者忽略。当该”;”和”#” 字符出现在行后面时候不被识别。
PgBouncer配置文件包含%include路由符,它指定了用来读取和处理的其他文件。 这让我们可以将配置文件拆分为多个部分。例如:
1 | %include filename |
如果提供的文件名不是绝对路径,当前操作系统工作路径被作为相对路径。
PgBouncer的配置文件包括以下小节,详细信息如下:
[databases]小节
[databases]小节包含key\=value 键值对,其中键(key)是数据库名称,值(value) 是key\=value对的libpq连接字符串列表。
数据库名称可以包含不带引号的字符[0-9A-Za-z_.-]。包含其他字符的名称必须使用标准SQL标识符引用:
- 名字用双引号括起来(” “)。
- 用两个连续的双引号字符在一个标识符内表示一个双引号。
数据库名*是回退数据库。此键的值是所请求数据库的连接字符串。 如果自动创建的数据库项的空闲时间超过autodb_idle_timeout参数中指定的时间, 则会自动清理这些数据库项。
数据库连接参数
该值中可能包含以下参数以指定数据库的位置。
dbname
目标数据库名称。
默认值:与客户端数据库名称相同。
host
Greenplum的Master主机的名称或IP地址。主机名在连接时被解析。如果DNS返回多个结果, 则以循环方式使用它们。DNS结果会被缓存,并且dns_max_ttl参数确定 缓存项何时过期。
默认值:未设置,表示通过Unix套接字进行连接。
port
Greenplum数据库的Master端口。
默认:5432
user, password
如果设置了user=,则用指定的用户建立到目标数据库的所有连接。 这意味着数据库将只有一个池。
如果未设置user=参数,将尝试使用客户端传递的用户名登录到目标数据库。 这意味着每个连接到数据库的用户都会有一个池。
auth_user
如果设置了auth_user,任何未在auth_file文件中指定的用户, 通过以auth_user身份查询数据库中的pg_shadow表来认证。 auth_user的口令必须在auth_file中设置。
client_encoding
从服务器要求特定的client_encoding。
datestyle
从服务器要求特定的datestyle。
timezone
从服务器要求特定的timezone。
连接池配置
可以使用以下数据库连接池配置
pool_size
设置该数据库的最大池数。如果没有设置,则使用default_pool_size。
connect_query
在任何用户连接建立之后,允许执行查询。如果查询引发错误,则会被记录,否则将被忽略。
pool_mode
为此数据库设置池模式。如果未设置,则使用默认的pool_mode。
max_db_connections
为此数据库设置数据库范围内的最大连接数。此数据库的所有池连接总数不会超过此值。
[pgbouncer]小节
一般设置
logfile
指定日志文件的位置。日志文件保持打开状态。日志轮转后在PgBouncer管理控制台中执行 kill -HUP pgbouncer或运行RELOAD;命令。
默认:未设置。
pidfile
pid文件的名字。没有pid文件,PgBouncer不能作为后台进程(守护进程)运行。
默认:未设置。
listen_addr
PgBouncer侦听TCP连接的接口地址列表。用户也可以使用*, 表示在所有接口上进行监听。如果没有设置,则仅允许Unix套接字连接。